From db14b748c7e9208adf420170d94f8005f2153d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 20 Jun 2004 22:25:14 +0000 Subject: [PATCH 001/356] Don't activate invisible windows svn path=/trunk/; revision=9774 --- reactos/subsys/win32k/ntuser/focus.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index 7e561a6b038..e833cc1040f 100644 --- a/reactos/subsys/win32k/ntuser/focus.c +++ b/reactos/subsys/win32k/ntuser/focus.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: focus.c,v 1.22 2004/05/10 17:07:18 weiden Exp $ + * $Id: focus.c,v 1.23 2004/06/20 22:25:14 gvg Exp $ */ #include @@ -151,6 +151,12 @@ IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWindow return FALSE; } + if (0 == (Window->Style & WS_VISIBLE)) + { + DPRINT("Failed - Invisible\n"); + return FALSE; + } + PrevForegroundQueue = IntGetFocusMessageQueue(); if (PrevForegroundQueue != 0) { From b24bc6c8def2a3032dc7306d3e19b09d36a9e61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 20 Jun 2004 22:27:19 +0000 Subject: [PATCH 002/356] Prefer non-topmost windows when activating another window svn path=/trunk/; revision=9776 --- reactos/subsys/win32k/ntuser/winpos.c | 36 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index b43e935c680..f9f7bd91631 100644 --- a/reactos/subsys/win32k/ntuser/winpos.c +++ b/reactos/subsys/win32k/ntuser/winpos.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: winpos.c,v 1.117 2004/06/20 00:45:37 navaraf Exp $ +/* $Id: winpos.c,v 1.118 2004/06/20 22:27:19 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -107,6 +107,7 @@ VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window) { PWINDOW_OBJECT Wnd, Old; + int TryTopmost; if (!Window || IntIsDesktopWindow(Window)) { @@ -132,25 +133,30 @@ WinPosActivateOtherWindow(PWINDOW_OBJECT Window) if((List = IntWinListChildren(Wnd))) { - for(phWnd = List; *phWnd; phWnd++) + for(TryTopmost = 0; TryTopmost <= 1; TryTopmost++) { - PWINDOW_OBJECT Child; - - if((*phWnd) == Window->Self) + for(phWnd = List; *phWnd; phWnd++) { - continue; - } + PWINDOW_OBJECT Child; - if((Child = IntGetWindowObject(*phWnd))) - { - if(IntSetForegroundWindow(Child)) + if((*phWnd) == Window->Self) { - ExFreePool(List); - IntReleaseWindowObject(Wnd); - IntReleaseWindowObject(Child); - return; + continue; + } + + if((Child = IntGetWindowObject(*phWnd))) + { + if(((! TryTopmost && (0 == (Child->ExStyle & WS_EX_TOPMOST))) + || (TryTopmost && (0 != (Child->ExStyle & WS_EX_TOPMOST)))) + && IntSetForegroundWindow(Child)) + { + ExFreePool(List); + IntReleaseWindowObject(Wnd); + IntReleaseWindowObject(Child); + return; + } + IntReleaseWindowObject(Child); } - IntReleaseWindowObject(Child); } } ExFreePool(List); From 77ea00dd5067c4d368481b21896779a7635d8a29 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 20 Jun 2004 22:52:39 +0000 Subject: [PATCH 003/356] some little fixes svn path=/trunk/; revision=9778 --- reactos/subsys/system/regedit/hexedit.c | 271 ++++++++++++++++++++++-- 1 file changed, 256 insertions(+), 15 deletions(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 1f079c99413..7138a704c03 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -35,16 +35,29 @@ typedef struct DWORD ColumnsPerLine; DWORD nLines; DWORD nVisibleLines; + INT Position; INT LineHeight; INT CharWidth; HFONT hFont; INT LeftMargin; - INT TopMargin; INT AddressSpacing; INT SplitSpacing; + + BOOL EditingField; + INT CaretCol; + INT CaretLine; } HEXEDIT_DATA, *PHEXEDIT_DATA; +/* hit test codes */ +#define HEHT_LEFTMARGIN (0x1) +#define HEHT_ADDRESS (0x2) +#define HEHT_ADDRESSSPACING (0x3) +#define HEHT_HEXDUMP (0x4) +#define HEHT_HEXDUMPSPACING (0x5) +#define HEHT_ASCIIDUMP (0x6) +#define HEHT_RIGHTMARGIN (0x7) + LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); ATOM @@ -55,7 +68,7 @@ RegisterHexEditorClass(HINSTANCE hInstance) ZeroMemory(&WndClass, sizeof(WNDCLASSEX)); WndClass.cbSize = sizeof(WNDCLASSEX); - WndClass.style = CS_DBLCLKS;// | CS_PARENTDC; + WndClass.style = CS_DBLCLKS; WndClass.lpfnWndProc = (WNDPROC)HexEditWndProc; WndClass.cbWndExtra = sizeof(PHEXEDIT_DATA); WndClass.hInstance = hInstance; @@ -76,10 +89,33 @@ UnregisterHexEditorClass(HINSTANCE hInstance) /*** Helper functions *********************************************************/ static VOID -HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Col, INT Line) +HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Line, INT Column, BOOL HexDump) { - /* FIXME - include the scroll position */ - SetCaretPos(hed->LeftMargin + (Col * hed->CharWidth), hed->TopMargin + (Line * hed->LineHeight)); + SCROLLINFO si; + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS; + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + + if(si.nPos > Line) + { + si.nPos = Line; + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + InvalidateRect(hed->hWndSelf, NULL, TRUE); + } + else if((Line - si.nPos) > hed->nVisibleLines) + { + si.nPos += (Line - si.nPos); + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + InvalidateRect(hed->hWndSelf, NULL, TRUE); + } + + if(HexDump) + SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing) * hed->CharWidth) - 2, (Line - si.nPos) * hed->LineHeight); + else + SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine)) * hed->CharWidth) - 2, (Line - si.nPos) * hed->LineHeight); } static VOID @@ -136,6 +172,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO PBYTE buf, current, end, line; UINT bufsize; TCHAR hex[3], addr[17]; + RECT rct; if(hed->hBuffer) { @@ -157,24 +194,35 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO current = buf + linestart; Last = min(hed->nLines - ScrollPos, Last); - for(; First <= Last && current < end; First++) + while(First <= Last && current < end) { - int slen; + DWORD dh; dx = hed->LeftMargin; /* draw address */ _stprintf(addr, _T("%04X"), linestart); TextOut(hDC, dx, dy, addr, 4); - dx += (4 + hed->AddressSpacing) * hed->CharWidth; + + dx += ((4 + hed->AddressSpacing) * hed->CharWidth); + dh = (3 * hed->CharWidth); + + rct.left = dx; + rct.top = dy; + rct.right = rct.left + dh; + rct.bottom = dy + hed->LineHeight; /* draw hex map */ + dx += (hed->CharWidth / 2); line = current; for(x = 0; x < hed->ColumnsPerLine && current < end; x++) { + rct.left += dh; + rct.right += dh; + _stprintf(hex, _T("%02X"), *(current++)); - TextOut(hDC, dx, dy, hex, 2); - dx += (3 * hed->CharWidth); + ExtTextOut(hDC, dx, dy, ETO_OPAQUE, &rct, hex, 2, NULL); + dx += dh; } /* draw ascii map */ @@ -183,19 +231,117 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO for(x = 0; x < hed->ColumnsPerLine && current < end; x++) { _stprintf(hex, _T("%C"), *(current++)); - hex[0] = ((hex[0] & _T('\x007f')) > _T(' ') ? hex[0] : _T('.')); + hex[0] = ((hex[0] & _T('\x007f')) >= _T(' ') ? hex[0] : _T('.')); TextOut(hDC, dx, dy, hex, 1); dx += hed->CharWidth; } dy += hed->LineHeight; linestart += hed->ColumnsPerLine; + First++; } } LocalUnlock(hed->hBuffer); } +static DWORD +HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed, POINTS pt, POINTS *ptClient) +{ + WINDOWINFO wi; + int d, x; + + wi.cbSize = sizeof(WINDOWINFO); + GetWindowInfo(hed->hWndSelf, &wi); + + x = pt.x - wi.rcClient.left; + if(ptClient) + { + ptClient->x = x; + ptClient->y = pt.y - wi.rcClient.top; + } + + if(x <= hed->LeftMargin) + { + return HEHT_LEFTMARGIN; + } + + x -= hed->LeftMargin; + d = (4 * hed->CharWidth); + if(x <= d) + { + return HEHT_ADDRESS; + } + + x -= d; + d = (hed->AddressSpacing * hed->CharWidth); + if(x <= d) + { + return HEHT_ADDRESSSPACING; + } + + x -= d; + d = (3 * hed->ColumnsPerLine * hed->CharWidth); + if(x <= d) + { + return HEHT_HEXDUMP; + } + + x -= d; + d = (hed->SplitSpacing * hed->CharWidth); + if(x <= d) + { + return HEHT_HEXDUMPSPACING; + } + + x -= d; + d = (hed->ColumnsPerLine * hed->CharWidth); + if(x <= d) + { + return HEHT_ASCIIDUMP; + } + + return HEHT_RIGHTMARGIN; +} + +static DWORD +HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD *Hit) +{ + SCROLLINFO si; + POINTS ptClient; + DWORD Line; + + *Hit = HEXEDIT_HitRegionTest(hed, pt, &ptClient); + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS; + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + + if(hed->LineHeight > 0) + { + Line = min(si.nPos + (ptClient.y / hed->LineHeight), hed->nLines); + } + else + return 0; + + switch(*Hit) + { + case HEHT_LEFTMARGIN: + case HEHT_ADDRESS: + case HEHT_ADDRESSSPACING: + return Line * hed->ColumnsPerLine; + + case HEHT_HEXDUMP: + return 0; + + case HEHT_ASCIIDUMP: + return 0; + + case HEHT_RIGHTMARGIN: + return (Line + 1) * hed->ColumnsPerLine; + } +} + /*** Control specific messages ************************************************/ static LRESULT @@ -222,6 +368,7 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size) else { hed->hBuffer = LocalFree(hed->hBuffer); + hed->Position = 0; HEXEDIT_Update(hed); return 0; @@ -244,11 +391,13 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size) LocalUnlock(hed->hBuffer); } + hed->Position = 0; HEXEDIT_Update(hed); return Size; } else if(hed->hBuffer) { + hed->Position = 0; hed->hBuffer = LocalFree(hed->hBuffer); HEXEDIT_Update(hed); } @@ -318,9 +467,9 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs) hed->ColumnsPerLine = 8; hed->LeftMargin = 2; - hed->TopMargin = 2; hed->AddressSpacing = 2; hed->SplitSpacing = 2; + hed->EditingField = TRUE; /* in hexdump field */ SetWindowLong(hWnd, 0, (LONG)hed); @@ -351,8 +500,8 @@ HEXEDIT_WM_CREATE(PHEXEDIT_DATA hed) static LRESULT HEXEDIT_WM_SETFOCUS(PHEXEDIT_DATA hed) { - CreateCaret(hed->hWndSelf, 0, 2, hed->LineHeight); - HEXEDIT_MoveCaret(hed, 0, 0); + CreateCaret(hed->hWndSelf, 0, 1, hed->LineHeight); + HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); ShowCaret(hed->hWndSelf); return 0; } @@ -471,6 +620,7 @@ HEXEDIT_WM_PAINT(PHEXEDIT_DATA hed) DWORD nLines, nFirst; HFONT hOldFont; HDC hTempDC; + DWORD height; if(GetUpdateRect(hed->hWndSelf, &rc, FALSE) && (hed->LineHeight > 0)) { @@ -479,7 +629,12 @@ HEXEDIT_WM_PAINT(PHEXEDIT_DATA hed) si.fMask = SIF_POS; GetScrollInfo(hed->hWndSelf, SB_VERT, &si); - nLines = (rc.bottom - rc.top) / hed->LineHeight; + height = (rc.bottom - rc.top); + nLines = height / hed->LineHeight; + if((height % hed->LineHeight) > 0) + { + nLines++; + } if(nLines > hed->nLines - si.nPos) { nLines = hed->nLines - si.nPos; @@ -543,6 +698,86 @@ HEXEDIT_WM_MOUSEWHEEL(PHEXEDIT_DATA hed, int cyMoveLines, WORD ButtonsDown, LPPO return 0; } +static LRESULT +HEXEDIT_WM_SETCURSOR(PHEXEDIT_DATA hed) +{ + POINTS pt; + DWORD Hit, Pos; + + Pos = GetMessagePos(); + pt = MAKEPOINTS(Pos); + Hit = HEXEDIT_HitRegionTest(hed, pt, NULL); + + switch(Hit) + { + case HEHT_HEXDUMP: + case HEHT_HEXDUMPSPACING: + case HEHT_ASCIIDUMP: + SetCursor(LoadCursor(0, MAKEINTRESOURCE(IDC_IBEAM))); + break; + + default: + SetCursor(LoadCursor(0, MAKEINTRESOURCE(IDC_ARROW))); + break; + } + return TRUE; +} + +static BOOL +HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) +{ + DWORD bufsize; + BOOL shift, control, handled; + + if(GetKeyState(VK_MENU) & 0x8000) + { + return FALSE; + } + + shift = GetKeyState(VK_SHIFT) & 0x8000; + control = GetKeyState(VK_CONTROL) & 0x8000; + + bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); + handled = FALSE; + + switch(VkCode) + { + case VK_LEFT:MessageBox(0, L"", L"", 0); + if(hed->Position > 0) + { + if(--hed->CaretCol < 0) + { + hed->CaretLine--; + hed->CaretCol = hed->ColumnsPerLine; + } + else + hed->Position--; + + HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); + } + handled = TRUE; + break; + + case VK_RIGHT: + if(hed->Position < bufsize) + { + if(++hed->CaretCol > hed->ColumnsPerLine) + { + hed->CaretLine = 0; + hed->CaretLine++; + } + else + hed->Position++; + + HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); + } + handled = TRUE; + break; + } + + return FALSE; +} + LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -558,6 +793,12 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_PAINT: return HEXEDIT_WM_PAINT(hed); + case WM_SETCURSOR: + return HEXEDIT_WM_SETCURSOR(hed); + + case WM_KEYDOWN: + return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam); + case WM_VSCROLL: return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam)); From 13e51e12a90ebbf34042d983d0e1cb34a39f4f43 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:22:06 +0000 Subject: [PATCH 004/356] move rtl/version|image|encode into rtl svn path=/trunk/; revision=9779 --- reactos/lib/ntdll/makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index bd5ce87d413..99fb8212ff6 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.102 2004/05/31 19:33:12 gdalsnes Exp $ +# $Id: makefile,v 1.103 2004/06/20 23:22:06 gdalsnes Exp $ PATH_TO_TOP = ../.. @@ -70,10 +70,8 @@ RTL_OBJECTS = \ rtl/callback.o \ rtl/crc32.o \ rtl/critical.o \ - rtl/encode.o \ rtl/exception.o \ rtl/handle.o \ - rtl/image.o \ rtl/intrlck.o \ rtl/math.o \ rtl/message.o \ @@ -85,7 +83,6 @@ RTL_OBJECTS = \ rtl/rangelist.o \ rtl/registry.o \ rtl/resource.o \ - rtl/splaytree.o \ rtl/teb.o \ rtl/thread.o \ rtl/libsupp.o From d26418fb30d8b82174101905733654b2b4167dfc Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:25:34 +0000 Subject: [PATCH 005/356] moved into rtl svn path=/trunk/; revision=9780 --- reactos/lib/ntdll/rtl/encode.c | 80 ---------------- reactos/lib/ntdll/rtl/image.c | 148 ------------------------------ reactos/lib/ntdll/rtl/splaytree.c | 70 -------------- 3 files changed, 298 deletions(-) delete mode 100644 reactos/lib/ntdll/rtl/encode.c delete mode 100644 reactos/lib/ntdll/rtl/image.c delete mode 100644 reactos/lib/ntdll/rtl/splaytree.c diff --git a/reactos/lib/ntdll/rtl/encode.c b/reactos/lib/ntdll/rtl/encode.c deleted file mode 100644 index cc28a2e2b01..00000000000 --- a/reactos/lib/ntdll/rtl/encode.c +++ /dev/null @@ -1,80 +0,0 @@ -/* $Id: encode.c,v 1.3 2004/02/01 20:48:06 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Security descriptor functions - * FILE: lib/ntdll/rtl/encode.c - * PROGRAMMER: KJK::Hyperion - * REVISION HISTORY: - * 02/04/2003: created (code contributed by crazylord - * ) - */ - -/* INCLUDES *****************************************************************/ - -#include - -#include - -/* FUNCTIONS ***************************************************************/ - -VOID STDCALL -RtlRunDecodeUnicodeString (IN UCHAR Hash, - IN OUT PUNICODE_STRING String) -{ - PUCHAR ptr; - USHORT i; - - ptr = (PUCHAR)String->Buffer; - if (String->Length > 1) - { - for (i = String->Length; i > 1; i--) - { - ptr[i - 1] ^= ptr[i - 2] ^ Hash; - } - } - - if (String->Length >= 1) - { - ptr[0] ^= Hash | (UCHAR)0x43; - } -} - - -VOID STDCALL -RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash, - IN OUT PUNICODE_STRING String) -{ - LARGE_INTEGER CurrentTime; - PUCHAR ptr; - USHORT i; - NTSTATUS Status; - - ptr = (PUCHAR) String->Buffer; - if (*Hash == 0) - { - Status = NtQuerySystemTime (&CurrentTime); - if (NT_SUCCESS(Status)) - { - for (i = 1; i < sizeof(LARGE_INTEGER) && (*Hash == 0); i++) - *Hash |= *(PUCHAR)(((PUCHAR)&CurrentTime) + i); - } - - if (*Hash == 0) - *Hash = 1; - } - - if (String->Length >= 1) - { - ptr[0] ^= (*Hash) | (UCHAR)0x43; - if (String->Length > 1) - { - for (i = 1; i < String->Length; i++) - { - ptr[i] ^= ptr[i - 1] ^ (*Hash); - } - } - } -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/image.c b/reactos/lib/ntdll/rtl/image.c deleted file mode 100644 index 2fd86411c48..00000000000 --- a/reactos/lib/ntdll/rtl/image.c +++ /dev/null @@ -1,148 +0,0 @@ -/* $Id: image.c,v 1.7 2004/01/17 10:30:53 hbirr Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: lib/ntdll/rtl/image.c - * PURPOSE: Image handling functions - * PROGRAMMER: Eric Kohl - * UPDATE HISTORY: - * 17/03/2000 Created - */ - -#include -#include - -#define NDEBUG -#include - -/* FUNCTIONS ****************************************************************/ - -/* - * @implemented - */ -PIMAGE_NT_HEADERS STDCALL -RtlImageNtHeader (IN PVOID BaseAddress) -{ - PIMAGE_NT_HEADERS NtHeader; - PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)BaseAddress; - - if (DosHeader && DosHeader->e_magic != IMAGE_DOS_SIGNATURE) - { - DPRINT1("DosHeader->e_magic %x\n", DosHeader->e_magic); - DPRINT1("NtHeader %x\n", (BaseAddress + DosHeader->e_lfanew)); - } - - if (DosHeader && DosHeader->e_magic == IMAGE_DOS_SIGNATURE) - { - NtHeader = (PIMAGE_NT_HEADERS)(BaseAddress + DosHeader->e_lfanew); - if (NtHeader->Signature == IMAGE_NT_SIGNATURE) - return NtHeader; - } - - return NULL; -} - - -/* - * @implemented - */ -PVOID -STDCALL -RtlImageDirectoryEntryToData ( - PVOID BaseAddress, - BOOLEAN bFlag, - ULONG Directory, - PULONG Size - ) -{ - PIMAGE_NT_HEADERS NtHeader; - ULONG Va; - - NtHeader = RtlImageNtHeader (BaseAddress); - if (NtHeader == NULL) - return NULL; - - if (Directory >= NtHeader->OptionalHeader.NumberOfRvaAndSizes) - return NULL; - - Va = NtHeader->OptionalHeader.DataDirectory[Directory].VirtualAddress; - if (Va == 0) - return NULL; - - if (Size) - *Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size; - - if (bFlag) - return (PVOID)(BaseAddress + Va); - - /* image mapped as ordinary file, we must find raw pointer */ - return (PVOID)RtlImageRvaToVa (NtHeader, BaseAddress, Va, NULL); -} - - -/* - * @implemented - */ -PIMAGE_SECTION_HEADER -STDCALL -RtlImageRvaToSection ( - PIMAGE_NT_HEADERS NtHeader, - PVOID BaseAddress, - ULONG Rva - ) -{ - PIMAGE_SECTION_HEADER Section; - ULONG Va; - ULONG Count; - - Count = NtHeader->FileHeader.NumberOfSections; - Section = (PIMAGE_SECTION_HEADER)((ULONG)&NtHeader->OptionalHeader + - NtHeader->FileHeader.SizeOfOptionalHeader); - while (Count) - { - Va = Section->VirtualAddress; - if ((Va <= Rva) && - (Rva < Va + Section->SizeOfRawData)) - return Section; - Section++; - } - return NULL; -} - - -/* - * @implemented - */ -ULONG -STDCALL -RtlImageRvaToVa ( - PIMAGE_NT_HEADERS NtHeader, - PVOID BaseAddress, - ULONG Rva, - PIMAGE_SECTION_HEADER *SectionHeader - ) -{ - PIMAGE_SECTION_HEADER Section = NULL; - - if (SectionHeader) - Section = *SectionHeader; - - if (Section == NULL || - Rva < Section->VirtualAddress || - Rva >= Section->VirtualAddress + Section->SizeOfRawData) - { - Section = RtlImageRvaToSection (NtHeader, BaseAddress, Rva); - if (Section == NULL) - return 0; - - if (SectionHeader) - *SectionHeader = Section; - } - - return (ULONG)(BaseAddress + - Rva + - Section->PointerToRawData - - Section->VirtualAddress); -} - -/* EOF */ diff --git a/reactos/lib/ntdll/rtl/splaytree.c b/reactos/lib/ntdll/rtl/splaytree.c deleted file mode 100644 index 22896bf6778..00000000000 --- a/reactos/lib/ntdll/rtl/splaytree.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ReactOS kernel - * Copyright (C) 2003 ReactOS Team - * - * 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. - */ -/* $Id: splaytree.c,v 1.1 2003/09/02 11:19:29 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * PURPOSE: Splay-Tree implementation - * FILE: lib/ntdll/rtl/splaytree.c - */ - -#include - -/* FUNCTIONS *****************************************************************/ - -PRTL_SPLAY_LINKS STDCALL -RtlSubtreePredecessor (IN PRTL_SPLAY_LINKS Links) -{ - PRTL_SPLAY_LINKS Child; - - Child = Links->RightChild; - if (Child == NULL) - return NULL; - - if (Child->LeftChild == NULL) - return Child; - - /* Get left-most child */ - while (Child->LeftChild != NULL) - Child = Child->LeftChild; - - return Child; -} - - -PRTL_SPLAY_LINKS STDCALL -RtlSubtreeSuccessor (IN PRTL_SPLAY_LINKS Links) -{ - PRTL_SPLAY_LINKS Child; - - Child = Links->LeftChild; - if (Child == NULL) - return NULL; - - if (Child->RightChild == NULL) - return Child; - - /* Get right-most child */ - while (Child->RightChild != NULL) - Child = Child->RightChild; - - return Child; -} - -/* EOF */ From 75a50813aaee3676d240cd4247d0517cec6a4be6 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:27:21 +0000 Subject: [PATCH 006/356] moved encode|image|splaytee into rtl svn path=/trunk/; revision=9781 --- reactos/lib/rtl/encode.c | 80 +++++++++++++++++++ reactos/lib/rtl/image.c | 148 ++++++++++++++++++++++++++++++++++++ reactos/lib/rtl/makefile | 5 +- reactos/lib/rtl/splaytree.c | 70 +++++++++++++++++ 4 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 reactos/lib/rtl/encode.c create mode 100644 reactos/lib/rtl/image.c create mode 100644 reactos/lib/rtl/splaytree.c diff --git a/reactos/lib/rtl/encode.c b/reactos/lib/rtl/encode.c new file mode 100644 index 00000000000..82b82a30283 --- /dev/null +++ b/reactos/lib/rtl/encode.c @@ -0,0 +1,80 @@ +/* $Id: encode.c,v 1.1 2004/06/20 23:27:21 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Security descriptor functions + * FILE: lib/rtl/encode.c + * PROGRAMMER: KJK::Hyperion + * REVISION HISTORY: + * 02/04/2003: created (code contributed by crazylord + * ) + */ + +/* INCLUDES *****************************************************************/ + +#include + +#include + +/* FUNCTIONS ***************************************************************/ + +VOID STDCALL +RtlRunDecodeUnicodeString (IN UCHAR Hash, + IN OUT PUNICODE_STRING String) +{ + PUCHAR ptr; + USHORT i; + + ptr = (PUCHAR)String->Buffer; + if (String->Length > 1) + { + for (i = String->Length; i > 1; i--) + { + ptr[i - 1] ^= ptr[i - 2] ^ Hash; + } + } + + if (String->Length >= 1) + { + ptr[0] ^= Hash | (UCHAR)0x43; + } +} + + +VOID STDCALL +RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash, + IN OUT PUNICODE_STRING String) +{ + LARGE_INTEGER CurrentTime; + PUCHAR ptr; + USHORT i; + NTSTATUS Status; + + ptr = (PUCHAR) String->Buffer; + if (*Hash == 0) + { + Status = NtQuerySystemTime (&CurrentTime); + if (NT_SUCCESS(Status)) + { + for (i = 1; i < sizeof(LARGE_INTEGER) && (*Hash == 0); i++) + *Hash |= *(PUCHAR)(((PUCHAR)&CurrentTime) + i); + } + + if (*Hash == 0) + *Hash = 1; + } + + if (String->Length >= 1) + { + ptr[0] ^= (*Hash) | (UCHAR)0x43; + if (String->Length > 1) + { + for (i = 1; i < String->Length; i++) + { + ptr[i] ^= ptr[i - 1] ^ (*Hash); + } + } + } +} + +/* EOF */ diff --git a/reactos/lib/rtl/image.c b/reactos/lib/rtl/image.c new file mode 100644 index 00000000000..0b261f3599d --- /dev/null +++ b/reactos/lib/rtl/image.c @@ -0,0 +1,148 @@ +/* $Id: image.c,v 1.1 2004/06/20 23:27:21 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/ntdll/rtl/image.c + * PURPOSE: Image handling functions + * PROGRAMMER: Eric Kohl + * UPDATE HISTORY: + * 17/03/2000 Created + */ + +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS ****************************************************************/ + +/* + * @implemented + */ +PIMAGE_NT_HEADERS STDCALL +RtlImageNtHeader (IN PVOID BaseAddress) +{ + PIMAGE_NT_HEADERS NtHeader; + PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)BaseAddress; + + if (DosHeader && DosHeader->e_magic != IMAGE_DOS_SIGNATURE) + { + DPRINT1("DosHeader->e_magic %x\n", DosHeader->e_magic); + DPRINT1("NtHeader %x\n", (BaseAddress + DosHeader->e_lfanew)); + } + + if (DosHeader && DosHeader->e_magic == IMAGE_DOS_SIGNATURE) + { + NtHeader = (PIMAGE_NT_HEADERS)(BaseAddress + DosHeader->e_lfanew); + if (NtHeader->Signature == IMAGE_NT_SIGNATURE) + return NtHeader; + } + + return NULL; +} + + +/* + * @implemented + */ +PVOID +STDCALL +RtlImageDirectoryEntryToData ( + PVOID BaseAddress, + BOOLEAN bFlag, + ULONG Directory, + PULONG Size + ) +{ + PIMAGE_NT_HEADERS NtHeader; + ULONG Va; + + NtHeader = RtlImageNtHeader (BaseAddress); + if (NtHeader == NULL) + return NULL; + + if (Directory >= NtHeader->OptionalHeader.NumberOfRvaAndSizes) + return NULL; + + Va = NtHeader->OptionalHeader.DataDirectory[Directory].VirtualAddress; + if (Va == 0) + return NULL; + + if (Size) + *Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size; + + if (bFlag) + return (PVOID)(BaseAddress + Va); + + /* image mapped as ordinary file, we must find raw pointer */ + return (PVOID)RtlImageRvaToVa (NtHeader, BaseAddress, Va, NULL); +} + + +/* + * @implemented + */ +PIMAGE_SECTION_HEADER +STDCALL +RtlImageRvaToSection ( + PIMAGE_NT_HEADERS NtHeader, + PVOID BaseAddress, + ULONG Rva + ) +{ + PIMAGE_SECTION_HEADER Section; + ULONG Va; + ULONG Count; + + Count = NtHeader->FileHeader.NumberOfSections; + Section = (PIMAGE_SECTION_HEADER)((ULONG)&NtHeader->OptionalHeader + + NtHeader->FileHeader.SizeOfOptionalHeader); + while (Count) + { + Va = Section->VirtualAddress; + if ((Va <= Rva) && + (Rva < Va + Section->SizeOfRawData)) + return Section; + Section++; + } + return NULL; +} + + +/* + * @implemented + */ +ULONG +STDCALL +RtlImageRvaToVa ( + PIMAGE_NT_HEADERS NtHeader, + PVOID BaseAddress, + ULONG Rva, + PIMAGE_SECTION_HEADER *SectionHeader + ) +{ + PIMAGE_SECTION_HEADER Section = NULL; + + if (SectionHeader) + Section = *SectionHeader; + + if (Section == NULL || + Rva < Section->VirtualAddress || + Rva >= Section->VirtualAddress + Section->SizeOfRawData) + { + Section = RtlImageRvaToSection (NtHeader, BaseAddress, Rva); + if (Section == NULL) + return 0; + + if (SectionHeader) + *SectionHeader = Section; + } + + return (ULONG)(BaseAddress + + Rva + + Section->PointerToRawData - + Section->VirtualAddress); +} + +/* EOF */ diff --git a/reactos/lib/rtl/makefile b/reactos/lib/rtl/makefile index dc94c041136..e11603524f2 100644 --- a/reactos/lib/rtl/makefile +++ b/reactos/lib/rtl/makefile @@ -30,7 +30,10 @@ TARGET_OBJECTS = \ time.o \ timezone.o \ unicode.o \ - version.o + version.o \ + encode.o \ + image.o \ + splaytree.o # atom # registry diff --git a/reactos/lib/rtl/splaytree.c b/reactos/lib/rtl/splaytree.c new file mode 100644 index 00000000000..49d738b3af3 --- /dev/null +++ b/reactos/lib/rtl/splaytree.c @@ -0,0 +1,70 @@ +/* + * ReactOS kernel + * Copyright (C) 2003 ReactOS Team + * + * 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. + */ +/* $Id: splaytree.c,v 1.1 2004/06/20 23:27:21 gdalsnes Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Splay-Tree implementation + * FILE: lib/rtl/splaytree.c + */ + +#include + +/* FUNCTIONS *****************************************************************/ + +PRTL_SPLAY_LINKS STDCALL +RtlSubtreePredecessor (IN PRTL_SPLAY_LINKS Links) +{ + PRTL_SPLAY_LINKS Child; + + Child = Links->RightChild; + if (Child == NULL) + return NULL; + + if (Child->LeftChild == NULL) + return Child; + + /* Get left-most child */ + while (Child->LeftChild != NULL) + Child = Child->LeftChild; + + return Child; +} + + +PRTL_SPLAY_LINKS STDCALL +RtlSubtreeSuccessor (IN PRTL_SPLAY_LINKS Links) +{ + PRTL_SPLAY_LINKS Child; + + Child = Links->LeftChild; + if (Child == NULL) + return NULL; + + if (Child->RightChild == NULL) + return Child; + + /* Get right-most child */ + while (Child->RightChild != NULL) + Child = Child->RightChild; + + return Child; +} + +/* EOF */ From da670920b91e74cc8865b2efba1ca8fa1edbeeee Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:30:47 +0000 Subject: [PATCH 007/356] forgot to change some memory allocators calls added comment to RtlFreeSid and changed its retval svn path=/trunk/; revision=9782 --- reactos/lib/rtl/sid.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/reactos/lib/rtl/sid.c b/reactos/lib/rtl/sid.c index 10427eb302d..a7a7cee3a34 100644 --- a/reactos/lib/rtl/sid.c +++ b/reactos/lib/rtl/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ +/* $Id: sid.c,v 1.2 2004/06/20 23:30:47 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -212,9 +212,7 @@ RtlAllocateAndInitializeSid ( if (Sid == NULL) return STATUS_INVALID_PARAMETER; - pSid = (PSID)RtlAllocateHeap (RtlGetProcessHeap (), - 0, - SubAuthorityCount * sizeof(DWORD) + 8); + pSid = (PSID)ExAllocatePool(PagedPool, SubAuthorityCount * sizeof(DWORD) + 8); if (pSid == NULL) return STATUS_NO_MEMORY; @@ -253,14 +251,16 @@ RtlAllocateAndInitializeSid ( /* * @implemented + * + * RETURNS + * Docs says FreeSid does NOT return a value + * even thou it's defined to return a PVOID... */ -PSID STDCALL +PVOID STDCALL RtlFreeSid(IN PSID Sid) { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - Sid); - return(Sid); + ExFreePool(Sid); + return NULL; } @@ -327,9 +327,7 @@ RtlConvertSidToUnicodeString(PUNICODE_STRING String, Length = (wcs - Buffer) * sizeof(WCHAR); if (AllocateBuffer) { - String->Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - Length + sizeof(WCHAR)); + String->Buffer = ExAllocatePool(PagedPool,Length + sizeof(WCHAR)); if (String->Buffer == NULL) return STATUS_NO_MEMORY; String->MaximumLength = Length + sizeof(WCHAR); From 3b854207b75a316d7f5491dff31a365403978272 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:35:14 +0000 Subject: [PATCH 008/356] forgot to change some memory allocator calls added RtlpDuplicateUnicodeString svn path=/trunk/; revision=9783 --- reactos/lib/rtl/unicode.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c index be4fe577d53..fe2f21db287 100644 --- a/reactos/lib/rtl/unicode.c +++ b/reactos/lib/rtl/unicode.c @@ -1136,7 +1136,6 @@ RtlOemStringToCountedUnicodeString( /* * private * - * NOTES * Same as RtlOemStringToUnicodeString but doesn't write terminating null * A partial copy is NOT performed if the dest buffer is too small! @@ -1191,12 +1190,11 @@ RtlpOemStringToCountedUnicodeString( } -//FIXME: sjekk returnverdi og returtype. Wine koflikter mht. returtype for EqualString og EqualComputer--- /* * @implemented * * RETURNS - * 0 if the names are equal, non-zero otherwise. + * TRUE if the names are equal, FALSE if not * * NOTES * The comparison is case insensitive. @@ -1215,7 +1213,7 @@ RtlEqualComputerName( { if (NT_SUCCESS(RtlUpcaseUnicodeStringToOemString( &OemString2, ComputerName2, TRUE ))) { - Result = RtlEqualString( &OemString1, &OemString2, FALSE ); + Result = RtlEqualString( &OemString1, &OemString2, TRUE ); RtlFreeOemString( &OemString2 ); } RtlFreeOemString( &OemString1 ); @@ -1224,12 +1222,11 @@ RtlEqualComputerName( return Result; } -//FIXME: sjekk returnverdi og returtype. Wine koflikter mht. returtype for EqualString og EqualComputer--- /* * @implemented * * RETURNS - * 0 if the names are equal, non-zero otherwise. + * TRUE if the names are equal, FALSE if not * * NOTES * The comparison is case insensitive. @@ -2469,12 +2466,33 @@ RtlxUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString) /* * @implemented + * + * NOTES + * See RtlpDuplicateUnicodeString */ NTSTATUS STDCALL RtlDuplicateUnicodeString( INT AddNull, IN PUNICODE_STRING SourceString, PUNICODE_STRING DestinationString) +{ + return RtlpDuplicateUnicodeString( + AddNull, + SourceString, + DestinationString, + NonPagedPool); +} + + +/* + * @implemented + */ +NTSTATUS STDCALL +RtlpDuplicateUnicodeString( + INT AddNull, + IN PUNICODE_STRING SourceString, + PUNICODE_STRING DestinationString, + POOL_TYPE PoolType) { if (SourceString == NULL || DestinationString == NULL) return STATUS_INVALID_PARAMETER; @@ -2493,7 +2511,7 @@ RtlDuplicateUnicodeString( if (AddNull) DestMaxLength += sizeof(UNICODE_NULL); - DestinationString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, DestMaxLength); + DestinationString->Buffer = ExAllocatePool(PoolType, DestMaxLength); if (DestinationString->Buffer == NULL) return STATUS_NO_MEMORY; From 2a54e31ff6d620151da5079316d3a40768a98368 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:37:52 +0000 Subject: [PATCH 009/356] added RtlpDuplicateUnicodeString fixed RtlFreeSid return type svn path=/trunk/; revision=9784 --- reactos/include/ntos/rtl.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/include/ntos/rtl.h b/reactos/include/ntos/rtl.h index 7fb853ee770..f2ef70d74eb 100755 --- a/reactos/include/ntos/rtl.h +++ b/reactos/include/ntos/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.29 2004/05/31 19:51:47 gdalsnes Exp $ +/* $Id: rtl.h,v 1.30 2004/06/20 23:37:52 gdalsnes Exp $ * */ #ifndef __DDK_RTL_H @@ -1180,7 +1180,7 @@ RtlFreeOemString (IN POEM_STRING OemString); VOID STDCALL RtlFreeRangeList (IN PRTL_RANGE_LIST RangeList); -PSID STDCALL +PVOID STDCALL RtlFreeSid (PSID Sid); VOID STDCALL @@ -2291,6 +2291,13 @@ RtlpUnicodeStringToCountedOemString( IN BOOLEAN AllocateDestinationString, IN POOL_TYPE PoolType); +NTSTATUS STDCALL +RtlpDuplicateUnicodeString( + INT AddNull, + IN PUNICODE_STRING SourceString, + PUNICODE_STRING DestinationString, + POOL_TYPE PoolType); + /* Register io functions */ UCHAR From 00eec04d6ef98c41a6e93d228bb696138251d887 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:39:07 +0000 Subject: [PATCH 010/356] added comment to FreeSid svn path=/trunk/; revision=9785 --- reactos/lib/advapi32/sec/sid.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/lib/advapi32/sec/sid.c b/reactos/lib/advapi32/sec/sid.c index 5ddeb7ecb79..b93033464a0 100644 --- a/reactos/lib/advapi32/sec/sid.c +++ b/reactos/lib/advapi32/sec/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.12 2004/03/25 11:30:07 ekohl Exp $ +/* $Id: sid.c,v 1.13 2004/06/20 23:39:07 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -117,11 +117,15 @@ EqualSid (PSID pSid1, /* * @implemented + * + * RETURNS + * Docs says this function does NOT return a value + * even thou it's defined to return a PVOID... */ PVOID STDCALL FreeSid (PSID pSid) { - return RtlFreeSid (pSid); + return RtlFreeSid (pSid); } From bb746199063b2efe679f8d02a92e7de42ebeb745 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 20 Jun 2004 23:42:07 +0000 Subject: [PATCH 011/356] remove unused stub SetCriticalSectionSpinCount (it's forwarded to ntdll) svn path=/trunk/; revision=9786 --- reactos/lib/kernel32/misc/stubs.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index ffb5e290bab..f31bd6ee07e 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.77 2004/06/13 20:04:56 navaraf Exp $ +/* $Id: stubs.c,v 1.78 2004/06/20 23:42:07 gdalsnes Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1364,19 +1364,6 @@ RestoreLastError( SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } -/* - * @unimplemented - */ -DWORD -STDCALL -SetCriticalSectionSpinCount( - LPCRITICAL_SECTION lpCriticalSection, - DWORD dwSpinCount - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} /* * @unimplemented From 16ea2c47a7e95d53ba21a3b3e2a9bab8802bf3d3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 21 Jun 2004 01:30:34 +0000 Subject: [PATCH 012/356] fixed scrollbar issues svn path=/trunk/; revision=9787 --- reactos/subsys/system/regedit/hexedit.c | 51 ++++++++++++++++++++----- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 7138a704c03..c58cf1e5c52 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -39,6 +39,7 @@ typedef struct INT LineHeight; INT CharWidth; HFONT hFont; + BOOL SbVisible; INT LeftMargin; INT AddressSpacing; @@ -123,38 +124,49 @@ HEXEDIT_Update(PHEXEDIT_DATA hed) { SCROLLINFO si; RECT rcClient; + BOOL SbVisible; + DWORD bufsize, cvislines; GetClientRect(hed->hWndSelf, &rcClient); hed->style = GetWindowLong(hed->hWndSelf, GWL_STYLE); - hed->nLines = max((hed->hBuffer ? LocalSize(hed->hBuffer) / hed->ColumnsPerLine : 1), 1); + bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); + hed->nLines = max(bufsize / hed->ColumnsPerLine, 1); + if(bufsize > hed->ColumnsPerLine && (bufsize % hed->ColumnsPerLine) > 0) + { + hed->nLines++; + } if(hed->LineHeight > 0) { - hed->nVisibleLines = rcClient.bottom / hed->LineHeight; + hed->nVisibleLines = cvislines = rcClient.bottom / hed->LineHeight; if(rcClient.bottom % hed->LineHeight) { hed->nVisibleLines++; } } else - hed->nVisibleLines = 0; + { + hed->nVisibleLines = cvislines = 0; + } + + SbVisible = bufsize > 0 && cvislines < hed->nLines; + ShowScrollBar(hed->hWndSelf, SB_VERT, SbVisible); /* update scrollbar */ si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_RANGE | SIF_PAGE; si.nMin = 0; - si.nMax = hed->nLines; - if(hed->LineHeight > 0) - si.nPage = rcClient.bottom / hed->LineHeight; - else - si.nPage = 0; + si.nMax = ((bufsize > 0) ? hed->nLines - 1 : 0); + si.nPage = ((hed->LineHeight > 0) ? rcClient.bottom / hed->LineHeight : 0); SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); - if(hed->style & WS_VISIBLE) + if(IsWindowVisible(hed->hWndSelf) && SbVisible != hed->SbVisible) { InvalidateRect(hed->hWndSelf, NULL, TRUE); } + + hed->SbVisible = SbVisible; } static HFONT @@ -174,6 +186,8 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO TCHAR hex[3], addr[17]; RECT rct; + FillRect(hDC, rc, (HBRUSH)(COLOR_WINDOW + 1)); + if(hed->hBuffer) { bufsize = LocalSize(hed->hBuffer); @@ -183,9 +197,15 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO { buf = NULL; bufsize = 0; + + if(ScrollPos + First == 0) + { + /* draw address */ + _stprintf(addr, _T("%04X"), 0); + TextOut(hDC, hed->LeftMargin, First * hed->LineHeight, addr, 4); + } } - FillRect(hDC, rc, (HBRUSH)(COLOR_WINDOW + 1)); if(buf) { end = buf + bufsize; @@ -472,6 +492,7 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs) hed->EditingField = TRUE; /* in hexdump field */ SetWindowLong(hWnd, 0, (LONG)hed); + HEXEDIT_Update(hed); return TRUE; } @@ -778,6 +799,13 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) return FALSE; } +static LRESULT +HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight) +{ + HEXEDIT_Update(hed); + return 0; +} + LRESULT WINAPI HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -802,6 +830,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_VSCROLL: return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam)); + case WM_SIZE: + return HEXEDIT_WM_SIZE(hed, (DWORD)wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_MOUSEWHEEL: return HEXEDIT_WM_MOUSEWHEEL(hed, ((SHORT)(wParam >> 16) < 0 ? 3 : -3), LOWORD(wParam), &MAKEPOINTS(lParam)); From 1fe3a2d6c307a1ec11d7728a9493360a5808e1ac Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Mon, 21 Jun 2004 02:21:16 +0000 Subject: [PATCH 013/356] Switched the sense of the onlyLoopback flag in getNumNonLoopbackAdapters and kin. I had the sense of needing only loopback adapters or all adapters inverted. Our info ioctl still misidentifies the adapters with respect to loopback and not. svn path=/trunk/; revision=9788 --- reactos/lib/iphlpapi/ifenum_reactos.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/lib/iphlpapi/ifenum_reactos.c b/reactos/lib/iphlpapi/ifenum_reactos.c index ed5286d911d..2f3e5975d2d 100644 --- a/reactos/lib/iphlpapi/ifenum_reactos.c +++ b/reactos/lib/iphlpapi/ifenum_reactos.c @@ -393,7 +393,7 @@ static NTSTATUS getInterfaceInfoSet( HANDLE tcpFile, return STATUS_SUCCESS; } -static DWORD getNumInterfacesInt(BOOL onlyLoopback) +static DWORD getNumInterfacesInt(BOOL onlyNonLoopback) { DWORD numEntities, numInterfaces = 0; TDIEntityID *entitySet; @@ -419,7 +419,8 @@ static DWORD getNumInterfacesInt(BOOL onlyLoopback) for( i = 0; i < numEntities; i++ ) { if( isInterface( &entitySet[i] ) && - (!onlyLoopback || isLoopback( tcpFile, &entitySet[i] )) ) + (!onlyNonLoopback || + (onlyNonLoopback && !isLoopback( tcpFile, &entitySet[i] ))) ) numInterfaces++; } From 821f740fc7ee658bf1a964d2ad192b6f98ad5bda Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 21 Jun 2004 04:11:44 +0000 Subject: [PATCH 014/356] Added Stubs for Cache Manager functions in their appropriate file. svn path=/trunk/; revision=9789 --- reactos/ntoskrnl/cc/cacheman.c | 122 ++++++++ reactos/ntoskrnl/cc/copy.c | 503 +++++---------------------------- reactos/ntoskrnl/cc/fs.c | 238 ++++++++++++++++ reactos/ntoskrnl/cc/mdl.c | 135 +++++++++ reactos/ntoskrnl/cc/misc.c | 144 ---------- reactos/ntoskrnl/cc/pin.c | 83 +++++- 6 files changed, 634 insertions(+), 591 deletions(-) create mode 100644 reactos/ntoskrnl/cc/fs.c create mode 100644 reactos/ntoskrnl/cc/mdl.c diff --git a/reactos/ntoskrnl/cc/cacheman.c b/reactos/ntoskrnl/cc/cacheman.c index 5592f1c0409..4be4fa68e79 100644 --- a/reactos/ntoskrnl/cc/cacheman.c +++ b/reactos/ntoskrnl/cc/cacheman.c @@ -40,3 +40,125 @@ CcInit(VOID) { CcInitView(); } + +/* + * @unimplemented + */ +LARGE_INTEGER +STDCALL +CcGetFlushedValidData ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld + ) +{ + UNIMPLEMENTED; + + LARGE_INTEGER i; + i.QuadPart = 0; + return i; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcRepinBcb ( + IN PVOID Bcb + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcRemapBcb ( + IN PVOID Bcb + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcScheduleReadAhead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcSetAdditionalCacheAttributes ( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcSetBcbOwnerPointer ( + IN PVOID Bcb, + IN PVOID Owner + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcSetDirtyPageThreshold ( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcSetReadAheadGranularity ( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcUnpinRepinnedBcb ( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + IN PIO_STATUS_BLOCK IoStatus + ) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index e8d7e581993..2c53f493746 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.26 2004/06/20 02:10:07 vizzini Exp $ +/* $Id: copy.c,v 1.27 2004/06/21 04:11:44 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -284,7 +284,6 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) return(STATUS_SUCCESS); } -/* STUBS */ /* * @unimplemented @@ -300,442 +299,6 @@ CcCanIWrite ( return FALSE; } -/* - * @unimplemented - */ -VOID -STDCALL -CcDeferWrite ( - IN PFILE_OBJECT FileObject, - IN PCC_POST_DEFERRED_WRITE PostRoutine, - IN PVOID Context1, - IN PVOID Context2, - IN ULONG BytesToWrite, - IN BOOLEAN Retrying - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcFastCopyRead ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN ULONG PageCount, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus - ) -{ - UNIMPLEMENTED; - return FALSE; -} -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcFastCopyWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN PVOID Buffer - ) -{ - UNIMPLEMENTED; - return FALSE; -} -/* - * @unimplemented - */ -LARGE_INTEGER -STDCALL -CcGetDirtyPages ( - IN PVOID LogHandle, - IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, - IN PVOID Context1, - IN PVOID Context2 - ) -{ - UNIMPLEMENTED; - - LARGE_INTEGER i; - i.QuadPart = 0; - return i; -} -/* - * @unimplemented - */ -PFILE_OBJECT -STDCALL -CcGetFileObjectFromBcb ( - IN PVOID Bcb - ) -{ - UNIMPLEMENTED; - return 0; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcInitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS CallBacks, - IN PVOID LazyWriterContext - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcIsThereDirtyData ( - IN PVPB Vpb - ) -{ - UNIMPLEMENTED; - return FALSE; -} - - -/* - * @unimplemented - */ -LARGE_INTEGER -STDCALL -CcGetLsnForFileObject ( - IN PFILE_OBJECT FileObject, - OUT PLARGE_INTEGER OldestLsn OPTIONAL - ) -{ - UNIMPLEMENTED; - - LARGE_INTEGER i; - i.QuadPart = 0; - return i; -} - -/* - * @unimplemented - */ -LARGE_INTEGER -STDCALL -CcGetFlushedValidData ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld - ) -{ - UNIMPLEMENTED; - - LARGE_INTEGER i; - i.QuadPart = 0; - return i; -} - - -/* - * @unimplemented - */ -VOID -STDCALL -CcMdlRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL * MdlChain, - OUT PIO_STATUS_BLOCK IoStatus - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcMdlWriteComplete ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcMdlWriteAbort ( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain - ) -{ - UNIMPLEMENTED; -} - - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcPinMappedData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID * Bcb - ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcPinRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID * Bcb, - OUT PVOID * Buffer - ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcPrepareMdlWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL * MdlChain, - OUT PIO_STATUS_BLOCK IoStatus - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcPreparePinWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Zero, - IN BOOLEAN Wait, - OUT PVOID * Bcb, - OUT PVOID * Buffer - ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcPurgeCacheSection ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN BOOLEAN UninitializeCacheMaps - ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcRepinBcb ( - IN PVOID Bcb - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcRemapBcb ( - IN PVOID Bcb - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcScheduleReadAhead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcSetAdditionalCacheAttributes ( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcSetBcbOwnerPointer ( - IN PVOID Bcb, - IN PVOID Owner - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcSetDirtyPageThreshold ( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcSetLogHandleForFile ( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcSetReadAheadGranularity ( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -BOOLEAN -STDCALL -CcUninitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER TruncateSize OPTIONAL, - IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL - ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcUnpinDataForThread ( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -STDCALL -CcUnpinRepinnedBcb ( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - IN PIO_STATUS_BLOCK IoStatus - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -NTSTATUS -STDCALL -CcWaitForCurrentLazyWriterActivity ( - VOID - ) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* STUBS END!!! */ /* * @implemented @@ -978,6 +541,69 @@ CcCopyWrite (IN PFILE_OBJECT FileObject, return(TRUE); } +/* + * @unimplemented + */ +VOID +STDCALL +CcDeferWrite ( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcFastCopyRead ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus + ) +{ + UNIMPLEMENTED; + return FALSE; +} +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcFastCopyWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PVOID Buffer + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +CcWaitForCurrentLazyWriterActivity ( + VOID + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* * @implemented */ @@ -1139,4 +765,3 @@ CcZeroData (IN PFILE_OBJECT FileObject, } return(TRUE); } - diff --git a/reactos/ntoskrnl/cc/fs.c b/reactos/ntoskrnl/cc/fs.c new file mode 100644 index 00000000000..8e8b3d5a46c --- /dev/null +++ b/reactos/ntoskrnl/cc/fs.c @@ -0,0 +1,238 @@ +/* COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/cc/fs.c + * PURPOSE: Implements cache managers functions useful for File Systems + * PROGRAMMER: Alex Ionescu + * UPDATE HISTORY: + * Created 20/06/04 + */ + +/* INCLUDES ******************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + +/* GLOBALS *****************************************************************/ + +extern FAST_MUTEX ViewLock; +extern ULONG DirtyPageCount; + +NTSTATUS CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg); + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +LARGE_INTEGER +STDCALL +CcGetDirtyPages ( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2 + ) +{ + UNIMPLEMENTED; + + LARGE_INTEGER i; + i.QuadPart = 0; + return i; +} + +/* + * @unimplemented + */ +PFILE_OBJECT +STDCALL +CcGetFileObjectFromBcb ( + IN PVOID Bcb + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +LARGE_INTEGER +STDCALL +CcGetLsnForFileObject ( + IN PFILE_OBJECT FileObject, + OUT PLARGE_INTEGER OldestLsn OPTIONAL + ) +{ + UNIMPLEMENTED; + + LARGE_INTEGER i; + i.QuadPart = 0; + return i; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcInitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS CallBacks, + IN PVOID LazyWriterContext + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcIsThereDirtyData ( + IN PVPB Vpb + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcPurgeCacheSection ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps + ) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @implemented + */ +VOID STDCALL +CcSetFileSizes (IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes) +{ + KIRQL oldirql; + PBCB Bcb; + PLIST_ENTRY current_entry; + PCACHE_SEGMENT current; + LIST_ENTRY FreeListHead; + NTSTATUS Status; + + DPRINT("CcSetFileSizes(FileObject %x, FileSizes %x)\n", + FileObject, FileSizes); + DPRINT("AllocationSize %d, FileSize %d, ValidDataLength %d\n", + (ULONG)FileSizes->AllocationSize.QuadPart, + (ULONG)FileSizes->FileSize.QuadPart, + (ULONG)FileSizes->ValidDataLength.QuadPart); + + Bcb = FileObject->SectionObjectPointer->SharedCacheMap; + assert(Bcb); + + if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart) + { + InitializeListHead(&FreeListHead); + ExAcquireFastMutex(&ViewLock); + KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); + + current_entry = Bcb->BcbSegmentListHead.Flink; + while (current_entry != &Bcb->BcbSegmentListHead) + { + current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry); + current_entry = current_entry->Flink; + if (current->FileOffset > FileSizes->AllocationSize.QuadPart) + { + if (current->ReferenceCount == 0 || (current->ReferenceCount == 1 && current->Dirty)) + { + RemoveEntryList(¤t->BcbSegmentListEntry); + RemoveEntryList(¤t->CacheSegmentListEntry); + RemoveEntryList(¤t->CacheSegmentLRUListEntry); + if (current->Dirty) + { + RemoveEntryList(¤t->DirtySegmentListEntry); + DirtyPageCount -= Bcb->CacheSegmentSize / PAGE_SIZE; + } + InsertHeadList(&FreeListHead, ¤t->BcbSegmentListEntry); + } + else + { + DPRINT1("Anyone has referenced a cache segment behind the new size.\n"); + KEBUGCHECK(0); + } + } + } + + Bcb->AllocationSize = FileSizes->AllocationSize; + Bcb->FileSize = FileSizes->FileSize; + KeReleaseSpinLock(&Bcb->BcbLock, oldirql); + ExReleaseFastMutex(&ViewLock); + + current_entry = FreeListHead.Flink; + while(current_entry != &FreeListHead) + { + current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry); + current_entry = current_entry->Flink; + Status = CcRosInternalFreeCacheSegment(current); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CcRosInternalFreeCacheSegment failed, status = %x\n"); + KEBUGCHECK(0); + } + } + } + else + { + KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); + Bcb->AllocationSize = FileSizes->AllocationSize; + Bcb->FileSize = FileSizes->FileSize; + KeReleaseSpinLock(&Bcb->BcbLock, oldirql); + } +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcSetLogHandleForFile ( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcUninitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL + ) +{ + UNIMPLEMENTED; + return FALSE; +} diff --git a/reactos/ntoskrnl/cc/mdl.c b/reactos/ntoskrnl/cc/mdl.c new file mode 100644 index 00000000000..80d9550abc1 --- /dev/null +++ b/reactos/ntoskrnl/cc/mdl.c @@ -0,0 +1,135 @@ +/* COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/cc/fs.c + * PURPOSE: Implements MDL Cache Manager Functions + * PROGRAMMER: Alex Ionescu + * UPDATE HISTORY: + * Created 20/06/04 + */ + +/* INCLUDES ******************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +VOID +STDCALL +CcMdlRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL * MdlChain, + OUT PIO_STATUS_BLOCK IoStatus + ) +{ + UNIMPLEMENTED; +} + +/********************************************************************** + * NAME INTERNAL + * CcMdlReadCompleteDev@8 + * + * DESCRIPTION + * + * ARGUMENTS + * MdlChain + * DeviceObject + * + * RETURN VALUE + * None. + * + * NOTE + * Used by CcMdlReadComplete@8 and FsRtl + * + */ +VOID STDCALL +CcMdlReadCompleteDev (IN PMDL MdlChain, + IN PDEVICE_OBJECT DeviceObject) +{ + UNIMPLEMENTED; +} + + +/********************************************************************** + * NAME EXPORTED + * CcMdlReadComplete@8 + * + * DESCRIPTION + * + * ARGUMENTS + * + * RETURN VALUE + * None. + * + * NOTE + * From Bo Branten's ntifs.h v13. + * + * @unimplemented + */ +VOID STDCALL +CcMdlReadComplete (IN PFILE_OBJECT FileObject, + IN PMDL MdlChain) +{ + PDEVICE_OBJECT DeviceObject = NULL; + + DeviceObject = IoGetRelatedDeviceObject (FileObject); + /* FIXME: try fast I/O first */ + CcMdlReadCompleteDev (MdlChain, + DeviceObject); +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcMdlWriteComplete ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcMdlWriteAbort ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcPrepareMdlWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL * MdlChain, + OUT PIO_STATUS_BLOCK IoStatus + ) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/cc/misc.c b/reactos/ntoskrnl/cc/misc.c index 53e3e68ac40..44af3c98930 100644 --- a/reactos/ntoskrnl/cc/misc.c +++ b/reactos/ntoskrnl/cc/misc.c @@ -16,147 +16,3 @@ #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) #define ROUND_DOWN(N, S) (((N) % (S)) ? ROUND_UP(N, S) - S : N) -extern FAST_MUTEX ViewLock; -extern ULONG DirtyPageCount; - -NTSTATUS CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg); - -/* FUNCTIONS *****************************************************************/ - -/********************************************************************** - * NAME INTERNAL - * CcMdlReadCompleteDev@8 - * - * DESCRIPTION - * - * ARGUMENTS - * MdlChain - * DeviceObject - * - * RETURN VALUE - * None. - * - * NOTE - * Used by CcMdlReadComplete@8 and FsRtl - * - */ -VOID STDCALL -CcMdlReadCompleteDev (IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject) -{ - UNIMPLEMENTED; -} - - -/********************************************************************** - * NAME EXPORTED - * CcMdlReadComplete@8 - * - * DESCRIPTION - * - * ARGUMENTS - * - * RETURN VALUE - * None. - * - * NOTE - * From Bo Branten's ntifs.h v13. - * - * @unimplemented - */ -VOID STDCALL -CcMdlReadComplete (IN PFILE_OBJECT FileObject, - IN PMDL MdlChain) -{ - PDEVICE_OBJECT DeviceObject = NULL; - - DeviceObject = IoGetRelatedDeviceObject (FileObject); - /* FIXME: try fast I/O first */ - CcMdlReadCompleteDev (MdlChain, - DeviceObject); -} - -/* - * @implemented - */ -VOID STDCALL -CcSetFileSizes (IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes) -{ - KIRQL oldirql; - PBCB Bcb; - PLIST_ENTRY current_entry; - PCACHE_SEGMENT current; - LIST_ENTRY FreeListHead; - NTSTATUS Status; - - DPRINT("CcSetFileSizes(FileObject %x, FileSizes %x)\n", - FileObject, FileSizes); - DPRINT("AllocationSize %d, FileSize %d, ValidDataLength %d\n", - (ULONG)FileSizes->AllocationSize.QuadPart, - (ULONG)FileSizes->FileSize.QuadPart, - (ULONG)FileSizes->ValidDataLength.QuadPart); - - Bcb = FileObject->SectionObjectPointer->SharedCacheMap; - assert(Bcb); - - if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart) - { - InitializeListHead(&FreeListHead); - ExAcquireFastMutex(&ViewLock); - KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); - - current_entry = Bcb->BcbSegmentListHead.Flink; - while (current_entry != &Bcb->BcbSegmentListHead) - { - current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry); - current_entry = current_entry->Flink; - if (current->FileOffset > FileSizes->AllocationSize.QuadPart) - { - if (current->ReferenceCount == 0 || (current->ReferenceCount == 1 && current->Dirty)) - { - RemoveEntryList(¤t->BcbSegmentListEntry); - RemoveEntryList(¤t->CacheSegmentListEntry); - RemoveEntryList(¤t->CacheSegmentLRUListEntry); - if (current->Dirty) - { - RemoveEntryList(¤t->DirtySegmentListEntry); - DirtyPageCount -= Bcb->CacheSegmentSize / PAGE_SIZE; - } - InsertHeadList(&FreeListHead, ¤t->BcbSegmentListEntry); - } - else - { - DPRINT1("Anyone has referenced a cache segment behind the new size.\n"); - KEBUGCHECK(0); - } - } - } - - Bcb->AllocationSize = FileSizes->AllocationSize; - Bcb->FileSize = FileSizes->FileSize; - KeReleaseSpinLock(&Bcb->BcbLock, oldirql); - ExReleaseFastMutex(&ViewLock); - - current_entry = FreeListHead.Flink; - while(current_entry != &FreeListHead) - { - current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry); - current_entry = current_entry->Flink; - Status = CcRosInternalFreeCacheSegment(current); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CcRosInternalFreeCacheSegment failed, status = %x\n"); - KEBUGCHECK(0); - } - } - } - else - { - KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); - Bcb->AllocationSize = FileSizes->AllocationSize; - Bcb->FileSize = FileSizes->FileSize; - KeReleaseSpinLock(&Bcb->BcbLock, oldirql); - } -} - diff --git a/reactos/ntoskrnl/cc/pin.c b/reactos/ntoskrnl/cc/pin.c index 7fc04460ba7..6f33c8ae63f 100644 --- a/reactos/ntoskrnl/cc/pin.c +++ b/reactos/ntoskrnl/cc/pin.c @@ -1,4 +1,4 @@ -/* $Id: pin.c,v 1.14 2003/12/30 18:52:03 fireball Exp $ +/* $Id: pin.c,v 1.15 2004/06/21 04:11:44 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -113,15 +113,57 @@ CcMapData (IN PFILE_OBJECT FileObject, } /* - * @implemented + * @unimplemented */ -VOID STDCALL -CcUnpinData (IN PVOID Bcb) +BOOLEAN +STDCALL +CcPinMappedData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID * Bcb + ) { - PINTERNAL_BCB iBcb = Bcb; - CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE, - iBcb->Dirty, FALSE); - ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb); + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcPinRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID * Bcb, + OUT PVOID * Buffer + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +CcPreparePinWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, + IN BOOLEAN Wait, + OUT PVOID * Bcb, + OUT PVOID * Buffer + ) +{ + UNIMPLEMENTED; + return FALSE; } /* @@ -135,3 +177,28 @@ CcSetDirtyPinnedData (IN PVOID Bcb, iBcb->Dirty = TRUE; } + +/* + * @implemented + */ +VOID STDCALL +CcUnpinData (IN PVOID Bcb) +{ + PINTERNAL_BCB iBcb = Bcb; + CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE, + iBcb->Dirty, FALSE); + ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb); +} + +/* + * @unimplemented + */ +VOID +STDCALL +CcUnpinDataForThread ( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId + ) +{ + UNIMPLEMENTED; +} From c8fb75517f3cd127c29ba69f5c950fc081cb69a1 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 21 Jun 2004 04:12:59 +0000 Subject: [PATCH 015/356] Added two new Cache Manager files added for the stubs. svn path=/trunk/; revision=9790 --- reactos/ntoskrnl/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 5223a7c1dc5..0af7d653557 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.123 2004/06/05 12:06:41 hbirr Exp $ +# $Id: Makefile,v 1.124 2004/06/21 04:12:59 ion Exp $ # # ReactOS Operating System # @@ -341,7 +341,9 @@ OBJECTS_PO = \ OBJECTS_CC = \ cc/cacheman.o \ cc/copy.o \ + cc/fs.o \ cc/pin.o \ + cc/mdl.o \ cc/misc.o \ cc/view.o From 1f85769d05228fbbd434be896b79bb774517bae1 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 21 Jun 2004 06:46:44 +0000 Subject: [PATCH 016/356] capture mode while scrolling start menus svn path=/trunk/; revision=9791 --- .../subsys/system/explorer/taskbar/startmenu.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index a96e0c33626..f4a9da2de3a 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -321,6 +321,13 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) case WM_CANCELMODE: CloseStartMenu(); + +#ifdef _LIGHT_STARTMENU + if (_scroll_mode != SCROLL_NOT) { + ReleaseCapture(); + KillTimer(_hwnd, 0); + } +#endif break; #ifdef _LIGHT_STARTMENU @@ -342,11 +349,13 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) scroll_mode = SCROLL_DOWN; if (scroll_mode != _scroll_mode) { - if (scroll_mode == SCROLL_NOT) + if (scroll_mode == SCROLL_NOT) { + ReleaseCapture(); KillTimer(_hwnd, 0); - else { + } else { CloseSubmenus(); SetTimer(_hwnd, 0, 150, NULL); // 150 ms scroll interval + SetCapture(_hwnd); } _scroll_mode = scroll_mode; From aed08f7da36d647981a4ade1e861c38081d12b79 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 21 Jun 2004 07:48:11 +0000 Subject: [PATCH 017/356] moved several strings to the application resources svn path=/trunk/; revision=9792 --- reactos/subsys/system/regedit/En.rc | 21 +++++++++++ reactos/subsys/system/regedit/about.c | 4 +- reactos/subsys/system/regedit/childwnd.c | 10 ++++- reactos/subsys/system/regedit/edit.c | 16 ++++++-- reactos/subsys/system/regedit/framewnd.c | 48 +++++++++++++++++++++--- reactos/subsys/system/regedit/listview.c | 44 ++++++++++++++-------- reactos/subsys/system/regedit/resource.h | 14 +++++++ reactos/subsys/system/regedit/treeview.c | 2 +- 8 files changed, 131 insertions(+), 28 deletions(-) diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index 4d697ea7c55..4ec1d5ae346 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -260,6 +260,27 @@ BEGIN IDS_MULTI_SZ_EMPTY_STRING "Data of type REG_MULTI_SZ cannot contain empty strings.\nThe empty strings have been removed from the list." END +STRINGTABLE DISCARDABLE +BEGIN + IDS_BINARY_EMPTY "(zero-length binary value)" + IDS_DEFAULT_VALUE_NAME "(Default)" + IDS_VALUE_NOT_SET "(value not set)" + IDS_UNKNOWN_TYPE "Unknown type: (0x%lx)" + IDS_MY_COMPUTER "My Computer" + IDS_IMPORT_REG_FILE "Import Registry File" + IDS_EXPORT_REG_FILE "Export Registry File" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FLT_REGFILES "Registration Files" + IDS_FLT_REGFILES_FLT "*.reg" + IDS_FLT_REGEDIT4 "Win9x/NT4 Registration Files (REGEDIT4)" + IDS_FLT_REGEDIT4_FLT "*.reg" + IDS_FLT_ALLFILES "All Files (*.*)" + IDS_FLT_ALLFILES_FLT "*.*" +END + /*****************************************************************/ diff --git a/reactos/subsys/system/regedit/about.c b/reactos/subsys/system/regedit/about.c index 67a8d1995a1..6261e6f8272 100644 --- a/reactos/subsys/system/regedit/about.c +++ b/reactos/subsys/system/regedit/about.c @@ -31,5 +31,7 @@ void ShowAboutBox(HWND hWnd) { - ShellAbout(hWnd, _T("Registry Explorer"), _T(""), LoadIcon(hInst, MAKEINTRESOURCE(IDI_REGEDIT))); + TCHAR AppStr[255]; + LoadString(hInst, IDS_APP_TITLE, AppStr, sizeof(AppStr)/sizeof(TCHAR)); + ShellAbout(hWnd, AppStr, _T(""), LoadIcon(hInst, MAKEINTRESOURCE(IDI_REGEDIT))); } diff --git a/reactos/subsys/system/regedit/childwnd.c b/reactos/subsys/system/regedit/childwnd.c index 96619396658..1306c0b9dc6 100644 --- a/reactos/subsys/system/regedit/childwnd.c +++ b/reactos/subsys/system/regedit/childwnd.c @@ -134,15 +134,21 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa switch (message) { case WM_CREATE: - g_pChildWnd = pChildWnd = HeapAlloc(GetProcessHeap(), 0, sizeof(ChildWnd)); + { + TCHAR buffer[MAX_PATH]; + /* load "My Computer" string */ + LoadString(hInst, IDS_MY_COMPUTER, buffer, sizeof(buffer)/sizeof(TCHAR)); + + g_pChildWnd = pChildWnd = HeapAlloc(GetProcessHeap(), 0, sizeof(ChildWnd)); if (!pChildWnd) return 0; - _tcsncpy(pChildWnd->szPath, _T("My Computer"), MAX_PATH); + _tcsncpy(pChildWnd->szPath, buffer, MAX_PATH); pChildWnd->nSplitPos = 250; pChildWnd->hWnd = hWnd; pChildWnd->hTreeWnd = CreateTreeView(hWnd, pChildWnd->szPath, TREE_WINDOW); pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW/*, pChildWnd->szPath*/); SetFocus(pChildWnd->hTreeWnd); break; + } case WM_COMMAND: if (!_CmdWndProc(hWnd, message, wParam, lParam)) { goto def; diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index eb8c6544966..0be559ef4c0 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -111,7 +111,9 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L } else { - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + TCHAR buffer[255]; + LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR)); + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer); } SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData); SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); @@ -174,7 +176,9 @@ INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPa } else { - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + TCHAR buffer[255]; + LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR)); + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer); } SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData); SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA)); @@ -291,7 +295,9 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP } else { - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + TCHAR buffer[255]; + LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR)); + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer); } CheckRadioButton (hwndDlg, IDC_FORMAT_HEX, IDC_FORMAT_DEC, IDC_FORMAT_HEX); _stprintf (ValueString, _T("%lx"), dwordValueData); @@ -404,7 +410,9 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L } else { - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)")); + TCHAR buffer[255]; + LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR)); + SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer); } hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA); HexEdit_LoadBuffer(hwndValue, binValueData, valueDataLen); diff --git a/reactos/subsys/system/regedit/framewnd.c b/reactos/subsys/system/regedit/framewnd.c index 7947a525a31..d8ecce3eacb 100644 --- a/reactos/subsys/system/regedit/framewnd.c +++ b/reactos/subsys/system/regedit/framewnd.c @@ -207,14 +207,48 @@ TCHAR CustomFilterBuffer[MAX_CUSTOM_FILTER_SIZE]; TCHAR FileNameBuffer[_MAX_PATH]; TCHAR FileTitleBuffer[_MAX_PATH]; +typedef struct +{ + UINT DisplayID; + UINT FilterID; +} FILTERPAIR, *PFILTERPAIR; + +void +BuildFilterStrings(TCHAR *Filter, PFILTERPAIR Pairs, int PairCount) +{ + int i, c; + + c = 0; + for(i = 0; i < PairCount; i++) + { + c += LoadString(hInst, Pairs[i].DisplayID, &Filter[c], 255 * sizeof(TCHAR)); + Filter[++c] = '\0'; + c += LoadString(hInst, Pairs[i].FilterID, &Filter[c], 255 * sizeof(TCHAR)); + Filter[++c] = '\0'; + } + Filter[++c] = '\0'; +} + static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) { + FILTERPAIR FilterPairs[3]; + static TCHAR Filter[1024]; + memset(pofn, 0, sizeof(OPENFILENAME)); pofn->lStructSize = sizeof(OPENFILENAME); pofn->hwndOwner = hWnd; pofn->hInstance = hInst; - - pofn->lpstrFilter = _T("Registration Files\0*.reg\0Win9x/NT4 Registration Files (REGEDIT4)\0*.reg\0All Files (*.*)\0*.*\0\0"); + + /* create filter string */ + FilterPairs[0].DisplayID = IDS_FLT_REGFILES; + FilterPairs[0].FilterID = IDS_FLT_REGFILES_FLT; + FilterPairs[1].DisplayID = IDS_FLT_REGEDIT4; + FilterPairs[1].FilterID = IDS_FLT_REGEDIT4_FLT; + FilterPairs[2].DisplayID = IDS_FLT_ALLFILES; + FilterPairs[2].FilterID = IDS_FLT_ALLFILES_FLT; + BuildFilterStrings(Filter, FilterPairs, sizeof(FilterPairs) / sizeof(FILTERPAIR)); + + pofn->lpstrFilter = Filter; pofn->lpstrCustomFilter = CustomFilterBuffer; pofn->nMaxCustFilter = MAX_CUSTOM_FILTER_SIZE; pofn->nFilterIndex = 0; @@ -240,9 +274,11 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) static BOOL ImportRegistryFile(HWND hWnd) { OPENFILENAME ofn; + TCHAR Caption[128]; InitOpenFileName(hWnd, &ofn); - ofn.lpstrTitle = _T("Import Registry File"); + LoadString(hInst, IDS_IMPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); + ofn.lpstrTitle = Caption; /* ofn.lCustData = ;*/ if (GetOpenFileName(&ofn)) { /* FIXME - convert to ascii */ @@ -279,10 +315,12 @@ static BOOL ExportRegistryFile(HWND hWnd) { OPENFILENAME ofn; TCHAR ExportKeyPath[_MAX_PATH]; + TCHAR Caption[128]; ExportKeyPath[0] = _T('\0'); InitOpenFileName(hWnd, &ofn); - ofn.lpstrTitle = _T("Export Registry File"); + LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); + ofn.lpstrTitle = Caption; /* ofn.lCustData = ;*/ ofn.Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER; ofn.lpfnHook = ImportRegistryFile_OFNHookProc; @@ -557,7 +595,7 @@ LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa { switch (message) { case WM_CREATE: - CreateWindowEx(0, szChildClass, _T("regedit child window"), WS_CHILD | WS_VISIBLE, + CreateWindowEx(0, szChildClass, NULL, WS_CHILD | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, (HMENU)0, hInst, 0); break; diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index ea637799225..106930fb589 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -201,21 +201,30 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB } /* lpsRes = convertHexToDWORDStr(lpbData, dwLen); */ break; - case REG_NONE: - case REG_BINARY: { + default: + { unsigned int i; LPBYTE pData = (LPBYTE)ValBuf; - LPTSTR strBinary = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(TCHAR) * 3 + 1); - for (i = 0; i < dwCount; i++) - wsprintf( strBinary + i*3, _T("%02X "), pData[i] ); - strBinary[dwCount * 3] = 0; - ListView_SetItemText(hwndLV, index, 2, strBinary); - HeapFree(GetProcessHeap(), 0, strBinary); + LPTSTR strBinary; + if(dwCount > 0) + { + strBinary = HeapAlloc(GetProcessHeap(), 0, (dwCount * sizeof(TCHAR) * 3) + 1); + for (i = 0; i < dwCount; i++) + { + wsprintf( strBinary + i*3, _T("%02X "), pData[i] ); + } + strBinary[dwCount * 3] = 0; + ListView_SetItemText(hwndLV, index, 2, strBinary); + HeapFree(GetProcessHeap(), 0, strBinary); + } + else + { + TCHAR szText[128]; + LoadString(hInst, IDS_BINARY_EMPTY, szText, sizeof(szText)/sizeof(TCHAR)); + ListView_SetItemText(hwndLV, index, 2, szText); + } } break; - default: - ListView_SetItemText(hwndLV, index, 2, _T("(value)")); - break; } } } @@ -281,7 +290,8 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi) switch (plvdi->item.iSubItem) { case 0: - plvdi->item.pszText = _T("(Default)"); + LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR)); + plvdi->item.pszText = buffer; break; case 1: switch (((LINE_INFO*)plvdi->item.lParam)->dwValType) { @@ -318,14 +328,18 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi) case REG_NONE: plvdi->item.pszText = _T("REG_NONE"); break; - default: - wsprintf(buffer, _T("unknown(0x%lx)"), ((LINE_INFO*)plvdi->item.lParam)->dwValType); + default: { + TCHAR buf2[200]; + LoadString(hInst, IDS_UNKNOWN_TYPE, buf2, sizeof(buf2)/sizeof(TCHAR)); + wsprintf(buffer, buf2, ((LINE_INFO*)plvdi->item.lParam)->dwValType); plvdi->item.pszText = buffer; break; + } } break; case 2: - plvdi->item.pszText = _T("(value not set)"); + LoadString(hInst, IDS_VALUE_NOT_SET, buffer, sizeof(buffer)/sizeof(TCHAR)); + plvdi->item.pszText = buffer; break; case 3: plvdi->item.pszText = _T(""); diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index 6cabef02b58..3fe89997b5f 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -111,6 +111,20 @@ #define ID_EDIT_MODIFY_BIN 32840 #define IDS_WARNING 32841 #define IDS_MULTI_SZ_EMPTY_STRING 32842 +#define IDS_BINARY_EMPTY 32843 +#define IDS_DEFAULT_VALUE_NAME 32844 +#define IDS_VALUE_NOT_SET 32845 +#define IDS_UNKNOWN_TYPE 32846 +#define IDS_MY_COMPUTER 32847 +#define IDS_IMPORT_REG_FILE 32848 +#define IDS_EXPORT_REG_FILE 32849 + +#define IDS_FLT_REGFILES 31001 +#define IDS_FLT_REGFILES_FLT 31002 +#define IDS_FLT_REGEDIT4 31003 +#define IDS_FLT_REGEDIT4_FLT 31004 +#define IDS_FLT_ALLFILES 31005 +#define IDS_FLT_ALLFILES_FLT 31006 #define IDD_EDIT_STRING 2000 #define IDC_VALUE_NAME 2001 diff --git a/reactos/subsys/system/regedit/treeview.c b/reactos/subsys/system/regedit/treeview.c index ba4927015b8..7131adb610e 100644 --- a/reactos/subsys/system/regedit/treeview.c +++ b/reactos/subsys/system/regedit/treeview.c @@ -267,7 +267,7 @@ HWND CreateTreeView(HWND hwndParent, LPTSTR pHostName, int id) /* Get the dimensions of the parent window's client area, and create the tree view control. */ GetClientRect(hwndParent, &rcClient); - hwndTV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, _T("Tree View"), + hwndTV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, WS_VISIBLE | WS_CHILD | WS_TABSTOP | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT, 0, 0, rcClient.right, rcClient.bottom, hwndParent, (HMENU)id, hInst, NULL); From 208898d3cdc31e431811785fe53d5d6e6df111f9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 21 Jun 2004 08:47:38 +0000 Subject: [PATCH 018/356] added support for deleting values svn path=/trunk/; revision=9793 --- reactos/subsys/system/regedit/En.rc | 6 +++ reactos/subsys/system/regedit/edit.c | 35 +++++++++++------- reactos/subsys/system/regedit/framewnd.c | 47 ++++++++++++++++++++++-- reactos/subsys/system/regedit/listview.c | 34 +++++++++++------ reactos/subsys/system/regedit/main.h | 4 +- reactos/subsys/system/regedit/resource.h | 6 +++ 6 files changed, 101 insertions(+), 31 deletions(-) diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index 4ec1d5ae346..c505ccdf1e5 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -258,6 +258,11 @@ BEGIN IDS_UNSUPPORTED_TYPE "Can't edit keys of this type (%ld)" IDS_TOO_BIG_VALUE "Value is too big (%ld)" IDS_MULTI_SZ_EMPTY_STRING "Data of type REG_MULTI_SZ cannot contain empty strings.\nThe empty strings have been removed from the list." + IDS_QUERY_DELETE_ONE "Are you sure you want to delete this value?" + IDS_QUERY_DELETE_MORE "Are you sure you want to delete these values?" + IDS_QUERY_DELETE_CONFIRM "Confirm Value Delete" + IDS_ERR_DELVAL_CAPTION "Error Deleting Values" + IDS_ERR_DELETEVALUE "Unable to delete all specified values!" END STRINGTABLE DISCARDABLE @@ -269,6 +274,7 @@ BEGIN IDS_MY_COMPUTER "My Computer" IDS_IMPORT_REG_FILE "Import Registry File" IDS_EXPORT_REG_FILE "Export Registry File" + IDS_INVALID_DWORD "(invalid DWORD value)" END STRINGTABLE DISCARDABLE diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index 0be559ef4c0..18a389b9240 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -448,7 +448,7 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L } -BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) +BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin) { DWORD type; LONG lRet; @@ -475,7 +475,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) goto done; } - if ((type == REG_SZ) || (type == REG_EXPAND_SZ)) + if (EditBin == FALSE && ((type == REG_SZ) || (type == REG_EXPAND_SZ))) { if (valueDataLen > 0) { @@ -510,7 +510,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) result = TRUE; } } - else if (type == REG_MULTI_SZ) + else if (EditBin == FALSE && type == REG_MULTI_SZ) { if (valueDataLen > 0) { @@ -615,7 +615,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) result = TRUE; } } - else if (type == REG_DWORD) + else if (EditBin == FALSE && type == REG_DWORD) { lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen); if (lRet != ERROR_SUCCESS) @@ -631,20 +631,27 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) result = TRUE; } } - else if (type == REG_NONE || type == REG_BINARY) + else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY) { - if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) + if(valueDataLen > 0) { - error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); - goto done; + if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) + { + error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); + goto done; + } + + lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)binValueData, &valueDataLen); + if (lRet != ERROR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, binValueData); + error(hwnd, IDS_BAD_VALUE, valueName); + goto done; + } } - - lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)binValueData, &valueDataLen); - if (lRet != ERROR_SUCCESS) + else { - HeapFree(GetProcessHeap(), 0, binValueData); - error(hwnd, IDS_BAD_VALUE, valueName); - goto done; + binValueData = NULL; } if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK) diff --git a/reactos/subsys/system/regedit/framewnd.c b/reactos/subsys/system/regedit/framewnd.c index d8ecce3eacb..b2c90e61cde 100644 --- a/reactos/subsys/system/regedit/framewnd.c +++ b/reactos/subsys/system/regedit/framewnd.c @@ -527,12 +527,14 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } case ID_EDIT_RENAME: case ID_EDIT_MODIFY: + case ID_EDIT_MODIFY_BIN: + case ID_EDIT_DELETE: regsam |= KEY_WRITE; break; } keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); - valueName = GetValueName(g_pChildWnd->hListWnd); + valueName = GetValueName(g_pChildWnd->hListWnd, -1); if (keyPath) { lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, regsam, &hKey); if (lRet != ERROR_SUCCESS) hKey = 0; @@ -540,19 +542,58 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) switch (LOWORD(wParam)) { case ID_EDIT_MODIFY: - if (valueName && ModifyValue(hWnd, hKey, valueName)) + if (valueName && ModifyValue(hWnd, hKey, valueName, FALSE)) + RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); + break; + case ID_EDIT_MODIFY_BIN: + if (valueName && ModifyValue(hWnd, hKey, valueName, TRUE)) RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); break; case ID_EDIT_RENAME: if(ListView_GetSelectedCount(g_pChildWnd->hListWnd) == 1) { - item = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_FOCUSED | LVNI_SELECTED); + item = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED); if(item > -1) { ListView_EditLabel(g_pChildWnd->hListWnd, item); } } break; + case ID_EDIT_DELETE: + { + UINT nSelected = ListView_GetSelectedCount(g_pChildWnd->hListWnd); + if(nSelected >= 1) + { + TCHAR msg[128], caption[128]; + LoadString(hInst, IDS_QUERY_DELETE_CONFIRM, caption, sizeof(caption)/sizeof(TCHAR)); + LoadString(hInst, (nSelected == 1 ? IDS_QUERY_DELETE_ONE : IDS_QUERY_DELETE_MORE), msg, sizeof(msg)/sizeof(TCHAR)); + if(MessageBox(g_pChildWnd->hWnd, msg, caption, MB_ICONQUESTION | MB_YESNO) == IDYES) + { + int ni, errs; + + item = -1; + errs = 0; + while((ni = ListView_GetNextItem(g_pChildWnd->hListWnd, item, LVNI_SELECTED)) > -1) + { + valueName = GetValueName(g_pChildWnd->hListWnd, item); + if(RegDeleteValue(hKey, valueName) != ERROR_SUCCESS) + { + errs++; + } + item = ni; + } + + RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); + if(errs > 0) + { + LoadString(hInst, IDS_ERR_DELVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR)); + LoadString(hInst, IDS_ERR_DELETEVALUE, msg, sizeof(msg)/sizeof(TCHAR)); + MessageBox(g_pChildWnd->hWnd, msg, caption, MB_ICONSTOP); + } + } + } + break; + } case ID_EDIT_COPYKEYNAME: CopyKeyName(hWnd, _T("")); break; diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index 106930fb589..20c249ea08d 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -55,7 +55,7 @@ static LPTSTR g_valueName; static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 }; static int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT }; -LPCTSTR GetValueName(HWND hwndLV) +LPCTSTR GetValueName(HWND hwndLV, int iStartAt) { int item, len, maxLen; LPTSTR newStr; @@ -68,7 +68,7 @@ LPCTSTR GetValueName(HWND hwndLV) maxLen = HeapSize(GetProcessHeap(), 0, g_valueName); if (maxLen == (SIZE_T) - 1) return NULL; - item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED | LVNI_SELECTED); + item = ListView_GetNextItem(hwndLV, iStartAt, LVNI_SELECTED); if (item == -1) return NULL; LVItem.mask = LVIF_PARAM; LVItem.iItem = item; @@ -114,7 +114,7 @@ BOOL IsDefaultValue(HWND hwndLV, int i) /******************************************************************************* * Local module support methods */ -static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount, int Position) +static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount, int Position, BOOL ValExists) { LINE_INFO* linfo; LVITEM item; @@ -162,10 +162,17 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB switch (dwValType) { case REG_SZ: case REG_EXPAND_SZ: - if(dwCount) + if(dwCount > 0) { ListView_SetItemText(hwndLV, index, 2, ValBuf); } + else if(!ValExists) + { + TCHAR buffer[255]; + /* load (value not set) string */ + LoadString(hInst, IDS_VALUE_NOT_SET, buffer, sizeof(buffer)/sizeof(TCHAR)); + ListView_SetItemText(hwndLV, index, 2, buffer); + } break; case REG_MULTI_SZ: { @@ -195,8 +202,15 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB } break; case REG_DWORD: { - TCHAR buf[64]; - wsprintf(buf, _T("0x%08X (%d)"), *(DWORD*)ValBuf, *(DWORD*)ValBuf); + TCHAR buf[200]; + if(dwCount == sizeof(DWORD)) + { + wsprintf(buf, _T("0x%08X (%d)"), *(DWORD*)ValBuf, *(DWORD*)ValBuf); + } + else + { + LoadString(hInst, IDS_INVALID_DWORD, buf, sizeof(buf)/sizeof(TCHAR)); + } ListView_SetItemText(hwndLV, index, 2, buf); } /* lpsRes = convertHexToDWORDStr(lpbData, dwLen); */ @@ -337,10 +351,6 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi) } } break; - case 2: - LoadString(hInst, IDS_VALUE_NOT_SET, buffer, sizeof(buffer)/sizeof(TCHAR)); - plvdi->item.pszText = buffer; - break; case 3: plvdi->item.pszText = _T(""); break; @@ -499,7 +509,7 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath) /* dwValSize = max_val_size; */ while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) { ValBuf[dwValSize] = 0; - AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwValSize, -1); + AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwValSize, -1, TRUE); dwValNameLen = max_val_name_len; dwValSize = max_val_size; dwValType = 0L; @@ -514,7 +524,7 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath) } if(!AddedDefault) { - AddEntryToList(hwndLV, _T(""), REG_SZ, NULL, 0, 0); + AddEntryToList(hwndLV, _T(""), REG_SZ, NULL, 0, 0, FALSE); } ListView_SortItems(hwndLV, CompareFunc, (WPARAM)hwndLV); RegCloseKey(hNewKey); diff --git a/reactos/subsys/system/regedit/main.h b/reactos/subsys/system/regedit/main.h index bbffc12d636..96c6d424686 100644 --- a/reactos/subsys/system/regedit/main.h +++ b/reactos/subsys/system/regedit/main.h @@ -90,7 +90,7 @@ extern void UpdateStatusBar(void); /* listview.c */ extern HWND CreateListView(HWND hwndParent, int id); extern BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath); -extern LPCTSTR GetValueName(HWND hwndLV); +extern LPCTSTR GetValueName(HWND hwndLV, int iStartAt); extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result); extern BOOL IsDefaultValue(HWND hwndLV, int i); @@ -100,6 +100,6 @@ extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv); extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); /* edit.c */ -extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName); +extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin); #endif /* __MAIN_H__ */ diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index 3fe89997b5f..cc201340810 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -118,6 +118,12 @@ #define IDS_MY_COMPUTER 32847 #define IDS_IMPORT_REG_FILE 32848 #define IDS_EXPORT_REG_FILE 32849 +#define IDS_INVALID_DWORD 32850 +#define IDS_QUERY_DELETE_ONE 32851 +#define IDS_QUERY_DELETE_MORE 32852 +#define IDS_QUERY_DELETE_CONFIRM 32853 +#define IDS_ERR_DELVAL_CAPTION 32854 +#define IDS_ERR_DELETEVALUE 32855 #define IDS_FLT_REGFILES 31001 #define IDS_FLT_REGFILES_FLT 31002 From a10440fe8a31c4cb16d56842aaff183e5f35cfe6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 21 Jun 2004 10:24:52 +0000 Subject: [PATCH 019/356] merged focus handling code from wine svn path=/trunk/; revision=9794 --- reactos/subsys/system/regedit/En.rc | 2 ++ reactos/subsys/system/regedit/childwnd.c | 19 ++++++------ reactos/subsys/system/regedit/framewnd.c | 4 +++ reactos/subsys/system/regedit/listview.c | 38 +++++++++++++++++++++++- reactos/subsys/system/regedit/main.c | 13 ++++++-- reactos/subsys/system/regedit/resource.h | 3 ++ 6 files changed, 67 insertions(+), 12 deletions(-) diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index c505ccdf1e5..b3680cf3a2d 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -263,6 +263,8 @@ BEGIN IDS_QUERY_DELETE_CONFIRM "Confirm Value Delete" IDS_ERR_DELVAL_CAPTION "Error Deleting Values" IDS_ERR_DELETEVALUE "Unable to delete all specified values!" + IDS_ERR_RENVAL_CAPTION "Error Renaming Value" + IDS_ERR_RENVAL_TOEMPTY "Cannot rename %s. The specified value name is empty. Try another name and try again." END STRINGTABLE DISCARDABLE diff --git a/reactos/subsys/system/regedit/childwnd.c b/reactos/subsys/system/regedit/childwnd.c index 1306c0b9dc6..2a71a889988 100644 --- a/reactos/subsys/system/regedit/childwnd.c +++ b/reactos/subsys/system/regedit/childwnd.c @@ -101,6 +101,7 @@ static void OnPaint(HWND hWnd) static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + ChildWnd* pChildWnd = g_pChildWnd; switch (LOWORD(wParam)) { /* Parse the menu selections: */ case ID_REGISTRY_EXIT: @@ -109,6 +110,10 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_VIEW_REFRESH: /* TODO */ break; + case ID_SWITCH_PANELS: + pChildWnd->nFocusPanel = !pChildWnd->nFocusPanel; + SetFocus(pChildWnd->nFocusPanel? pChildWnd->hListWnd: pChildWnd->hTreeWnd); + break; default: return FALSE; } @@ -275,10 +280,6 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa HKEY hRootKey; keyPath = GetItemPath(pChildWnd->hTreeWnd, ((NMTREEVIEW*)lParam)->itemNew.hItem, &hRootKey); - if(!hRootKey) - { - RefreshListView(pChildWnd->hListWnd, 0, NULL); - } if (keyPath) { RefreshListView(pChildWnd->hListWnd, hRootKey, keyPath); rootName = get_root_key_name(hRootKey); @@ -292,10 +293,10 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa } break; case NM_SETFOCUS: - pChildWnd->nFocusPanel = 1; + pChildWnd->nFocusPanel = 0; break; default: - goto def; + return 0; } } else { @@ -303,12 +304,12 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa { switch (((LPNMHDR)lParam)->code) { case NM_SETFOCUS: - pChildWnd->nFocusPanel = 0; + pChildWnd->nFocusPanel = 1; break; default: - if(ListWndNotifyProc(pChildWnd->hListWnd, wParam, lParam, &Result)) + if(!ListWndNotifyProc(pChildWnd->hListWnd, wParam, lParam, &Result)) { - return Result; + goto def; } break; } diff --git a/reactos/subsys/system/regedit/framewnd.c b/reactos/subsys/system/regedit/framewnd.c index b2c90e61cde..c29c8a107aa 100644 --- a/reactos/subsys/system/regedit/framewnd.c +++ b/reactos/subsys/system/regedit/framewnd.c @@ -658,6 +658,10 @@ LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa case WM_MENUSELECT: OnMenuSelect(hWnd, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); break; + case WM_ACTIVATE: + if (LOWORD(hWnd)) + SetFocus(g_pChildWnd->hWnd); + break; case WM_DESTROY: WinHelp(hWnd, _T("regedit"), HELP_QUIT, 0); PostQuitMessage(0); diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index 20c249ea08d..edeb07e0f34 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -408,7 +408,9 @@ BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result) SendMessage(hFrameWnd, WM_COMMAND, MAKEWPARAM(ID_EDIT_MODIFY, 0), 0); } return TRUE; - + case NM_SETFOCUS: + g_pChildWnd->nFocusPanel = 0; + break; case LVN_BEGINLABELEDIT: { PLINE_INFO lineinfo; @@ -429,6 +431,40 @@ BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result) *Result = TRUE; return TRUE; } + case LVN_ENDLABELEDIT: + { + PLINE_INFO lineinfo; + Info = (NMLVDISPINFO*)lParam; + if(Info && Info->item.pszText) + { + lineinfo = (PLINE_INFO)Info->item.lParam; + if(!lineinfo->name || !_tcscmp(lineinfo->name, _T(""))) + { + *Result = FALSE; + } + else + { + LONG ret; + //if((ret = RenameValue(lineinfo->name, Info->item.pszText)) != ERROR_SUCCESS) + { + TCHAR msg[128], caption[128]; + + LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR)); + if(_tcslen(Info->item.pszText) == 0) + { + LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR)); + } + else + _stprintf(msg, _T("rename from %s to %s"), lineinfo->name, Info->item.pszText); + MessageBox(0, msg, NULL, 0); + *Result = TRUE; + } + } + } + else + *Result = TRUE; + return TRUE; + } } return FALSE; } diff --git a/reactos/subsys/system/regedit/main.c b/reactos/subsys/system/regedit/main.c index 57018d3eacf..520dd787060 100644 --- a/reactos/subsys/system/regedit/main.c +++ b/reactos/subsys/system/regedit/main.c @@ -147,6 +147,15 @@ void ExitInstance(HINSTANCE hInstance) DestroyMenu(hMenuFrame); } +BOOL TranslateChildTabMessage(MSG *msg) +{ + if (msg->message != WM_KEYDOWN) return FALSE; + if (msg->wParam != VK_TAB) return FALSE; + if (GetParent(msg->hwnd) != g_pChildWnd->hWnd) return FALSE; + PostMessage(g_pChildWnd->hWnd, WM_COMMAND, ID_SWITCH_PANELS, 0); + return TRUE; +} + int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, @@ -189,8 +198,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, /* Main message loop */ while (GetMessage(&msg, (HWND)NULL, 0, 0)) { - if (!TranslateAccelerator(msg.hwnd, hAccel, &msg) && - !IsDialogMessage(hFrameWnd, &msg)) { + if (!TranslateAccelerator(msg.hwnd, hAccel, &msg) + && !TranslateChildTabMessage(&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index cc201340810..f3f45b677ee 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -124,6 +124,9 @@ #define IDS_QUERY_DELETE_CONFIRM 32853 #define IDS_ERR_DELVAL_CAPTION 32854 #define IDS_ERR_DELETEVALUE 32855 +#define IDS_ERR_RENVAL_CAPTION 32856 +#define IDS_ERR_RENVAL_TOEMPTY 32857 +#define ID_SWITCH_PANELS 32871 #define IDS_FLT_REGFILES 31001 #define IDS_FLT_REGFILES_FLT 31002 From 62e0fe6b5e73d49063117193aff720749d80548d Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 21 Jun 2004 12:12:01 +0000 Subject: [PATCH 020/356] Stop dumping PnP nodes at an empty node. svn path=/trunk/; revision=9795 --- reactos/apps/utils/pnpdump/pnpdump.c | 59 ++++++++++++++++------------ 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/reactos/apps/utils/pnpdump/pnpdump.c b/reactos/apps/utils/pnpdump/pnpdump.c index ade651a0a23..00a25ad5789 100644 --- a/reactos/apps/utils/pnpdump/pnpdump.c +++ b/reactos/apps/utils/pnpdump/pnpdump.c @@ -671,29 +671,28 @@ int main (int argc, char *argv[]) HKEY hPnpKey; DWORD dwType; DWORD dwSize; - BOOL Ask = TRUE; + BOOL Ask; PCM_FULL_RESOURCE_DESCRIPTOR lpBuffer; PCM_PNP_BIOS_INSTALLATION_CHECK lpPnpInst; PCM_PNP_BIOS_DEVICE_NODE lpDevNode; - - DWORD dwDataSize, dwResourceSize; + DWORD dwDataSize; + DWORD dwResourceSize; hPnpKey = 0; - - if (argc >1 && (!strcmp (argv[1],"/S") || !strcmp (argv[1],"/s"))) + Ask = TRUE; + if (argc >1 && (!strcmp(argv[1],"/S") || !strcmp(argv[1],"/s"))) { Ask = FALSE; } - - if (argc >1 && !strcmp (argv[1],"/?")) + + if (argc >1 && !strcmp(argv[1],"/?")) { - printf ("This utility prints the PnP-nodes from the registry\n"); - printf ("\"/s\" prevents the \"Press any key\"\n\n"); + printf("This utility prints the PnP-nodes from the registry\n"); + printf("\"/s\" prevents the \"Press any key\"\n\n"); return 0; } - - + lError = GetPnpKey(&hPnpKey); if (lError != ERROR_SUCCESS) { @@ -709,6 +708,12 @@ int main (int argc, char *argv[]) /* Allocate buffer */ dwSize = 1024; lpBuffer = malloc(dwSize); + if (lpBuffer == NULL) + { + printf("Error: malloc() failed\n"); + RegCloseKey(hPnpKey); + return 0; + } lError = RegQueryValueEx(hPnpKey, "Configuration Data", @@ -721,11 +726,10 @@ int main (int argc, char *argv[]) if (lError == ERROR_MORE_DATA) { printf("Need to resize buffer to %lu\n", dwSize); - } printf("Failed to read 'Configuration Data' value\n"); - free (lpBuffer); + free(lpBuffer); RegCloseKey(hPnpKey); return 0; } @@ -739,7 +743,7 @@ int main (int argc, char *argv[]) if (lpBuffer->PartialResourceList.Count == 0) { printf("Invalid resource count!\n"); - free (lpBuffer); + free(lpBuffer); return 0; } @@ -774,7 +778,7 @@ int main (int argc, char *argv[]) } #if 0 - printf ("Node: %x Size %hu (0x%hx)\n", + printf("Node: %x Size %hu (0x%hx)\n", lpDevNode->Node, lpDevNode->Size, lpDevNode->Size); @@ -789,10 +793,10 @@ return 0; if (lpDevNode->Size == 0) break; - printf ("Node: %x Size %hu (0x%hx)\n", - lpDevNode->Node, - lpDevNode->Size, - lpDevNode->Size); + printf("Node: %x Size %hu (0x%hx)\n", + lpDevNode->Node, + lpDevNode->Size, + lpDevNode->Size); dwDataSize += lpDevNode->Size; lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpDevNode + lpDevNode->Size); @@ -800,12 +804,12 @@ return 0; if (Ask) { - printf ("\n Press any key...\n"); + printf("\n Press any key...\n"); getch(); } else { - printf ("\n"); + printf("\n"); } dwDataSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK); @@ -813,23 +817,26 @@ return 0; while (dwDataSize < dwResourceSize) { - PrintDeviceData (lpDevNode); + if (lpDevNode->Size == 0) + break; + + PrintDeviceData(lpDevNode); if (Ask) { - printf ("\n Press any key...\n"); + printf("\n Press any key...\n"); getch(); } else { - printf ("\n"); + printf("\n"); } - + dwDataSize += lpDevNode->Size; lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpDevNode + lpDevNode->Size); } - free (lpBuffer); + free(lpBuffer); return 0; } From 6d403cae78802e8292caa749b95aec8fe8bfa4b7 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 21 Jun 2004 12:23:01 +0000 Subject: [PATCH 021/356] Detect parallel ports. svn path=/trunk/; revision=9796 --- freeldr/freeldr/arch/i386/hardware.c | 139 +++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 8 deletions(-) diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 7b375519cdf..46da8564b40 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -192,6 +192,7 @@ __KeStallExecutionProcessor(U32 Loops) for (i = 0; i < Loops; i++); } + VOID KeStallExecutionProcessor(U32 Microseconds) { U64 LoopCount = ((U64)delay_count * (U64)Microseconds) / 1000ULL; @@ -404,7 +405,6 @@ DetectPnpBios(HKEY SystemKey, U32 *BusNumber) CmResourceTypeDeviceSpecific; FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareUndetermined; -// FullResourceDescriptor->PartialResourceList.PartialDescriptors[0].Flags = Ptr = (char *)(((PVOID)&FullResourceDescriptor->PartialResourceList.PartialDescriptors[0]) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); @@ -430,10 +430,6 @@ DetectPnpBios(HKEY SystemKey, U32 *BusNumber) DeviceNode->Node, DeviceNode->Size, DeviceNode->Size)); -// printf("Node: %u Size %u (0x%x)\n", -// DeviceNode->Node, -// DeviceNode->Size, -// DeviceNode->Size); memcpy (Ptr, DeviceNode, @@ -1448,7 +1444,7 @@ DetectSerialPorts(HKEY BusKey) "Identifier", REG_SZ, (PU8)Buffer, - 5); + strlen(Buffer) + 1); if (Error != ERROR_SUCCESS) { DbgPrint((DPRINT_HWDETECT, @@ -1469,6 +1465,135 @@ DetectSerialPorts(HKEY BusKey) } +static VOID +DetectParallelPorts(HKEY BusKey) +{ + PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + U32 Irq[3] = {7, 5, (U32)-1}; + char Buffer[80]; + HKEY ControllerKey; + PU16 BasePtr; + U32 ControllerNumber; + U32 i; + S32 Error; + U32 Size; + + DbgPrint((DPRINT_HWDETECT, "DetectParallelPorts() called\n")); + + ControllerNumber = 0; + BasePtr = (PU16)0x408; + for (i = 0; i < 3; i++, BasePtr++) + { + if (*BasePtr == 0) + continue; + + DbgPrint((DPRINT_HWDETECT, + "Parallel port %u: %x\n", + ControllerNumber, + *BasePtr)); + + /* Create controller key */ + sprintf(Buffer, + "ParallelController\\%u", + ControllerNumber); + + Error = RegCreateKey(BusKey, + Buffer, + &ControllerKey); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, "Failed to create controller key\n")); + continue; + } + DbgPrint((DPRINT_HWDETECT, "Created key: %s\n", Buffer)); + + /* Set 'ComponentInformation' value */ + SetComponentInformation(ControllerKey, + 0x78, /* FIXME */ + ControllerNumber, + 0xFFFFFFFF); + + /* Build full device descriptor */ + Size = sizeof(CM_FULL_RESOURCE_DESCRIPTOR); + if (Irq[i] != (U32)-1) + Size += sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + + FullResourceDescriptor = MmAllocateMemory(Size); + if (FullResourceDescriptor == NULL) + { + DbgPrint((DPRINT_HWDETECT, + "Failed to allocate resource descriptor\n")); + continue; + } + memset(FullResourceDescriptor, 0, Size); + + /* Initialize resource descriptor */ + FullResourceDescriptor->InterfaceType = Isa; + FullResourceDescriptor->BusNumber = 0; + FullResourceDescriptor->PartialResourceList.Count = (Irq[i] != (U32)-1) ? 2 : 1; + + /* Set IO Port */ + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[0]; + PartialDescriptor->Type = CmResourceTypePort; + PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; + PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; + PartialDescriptor->u.Port.Start = (U64)*BasePtr; + PartialDescriptor->u.Port.Length = 3; + + /* Set Interrupt */ + if (Irq[i] != (U32)-1) + { + PartialDescriptor = &FullResourceDescriptor->PartialResourceList.PartialDescriptors[1]; + PartialDescriptor->Type = CmResourceTypeInterrupt; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; + PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; + PartialDescriptor->u.Interrupt.Level = Irq[i]; + PartialDescriptor->u.Interrupt.Vector = Irq[i]; + PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; + } + + /* Set 'Configuration Data' value */ + Error = RegSetValue(ControllerKey, + "Configuration Data", + REG_FULL_RESOURCE_DESCRIPTOR, + (PU8) FullResourceDescriptor, + Size); + MmFreeMemory(FullResourceDescriptor); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, + "RegSetValue(Configuration Data) failed (Error %u)\n", + (int)Error)); + } + + /* Set 'Identifier' value */ + sprintf(Buffer, + "PARALLEL%u", + i + 1); + Error = RegSetValue(ControllerKey, + "Identifier", + REG_SZ, + (PU8)Buffer, + strlen(Buffer) + 1); + if (Error != ERROR_SUCCESS) + { + DbgPrint((DPRINT_HWDETECT, + "RegSetValue() failed (Error %u)\n", + (int)Error)); + continue; + } + DbgPrint((DPRINT_HWDETECT, + "Created value: Identifier %s\n", + Buffer)); + + ControllerNumber++; + } + + DbgPrint((DPRINT_HWDETECT, "DetectParallelPorts() done\n")); +} + + static BOOLEAN DetectKeyboardDevice(VOID) { @@ -2081,9 +2206,7 @@ DetectIsaBios(HKEY SystemKey, U32 *BusNumber) DetectSerialPorts(BusKey); -#if 0 DetectParallelPorts(BusKey); -#endif DetectKeyboardController(BusKey); From 84fff6f7f22516ac070ea8b32db63fba1ecd1b55 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Mon, 21 Jun 2004 16:58:28 +0000 Subject: [PATCH 022/356] cvsignore maintainance svn path=/trunk/; revision=9797 --- reactos/drivers/dd/floppy/.cvsignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 reactos/drivers/dd/floppy/.cvsignore diff --git a/reactos/drivers/dd/floppy/.cvsignore b/reactos/drivers/dd/floppy/.cvsignore new file mode 100644 index 00000000000..fbfbcf8c4b6 --- /dev/null +++ b/reactos/drivers/dd/floppy/.cvsignore @@ -0,0 +1,2 @@ +*.coff +*.map \ No newline at end of file From edd6cd019054e5661803c880d0449b0fd606120b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 21 Jun 2004 17:11:00 +0000 Subject: [PATCH 023/356] Fixed icon masks. svn path=/trunk/; revision=9798 --- reactos/subsys/system/regedit/res/regedit.ico | Bin 22534 -> 22534 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/subsys/system/regedit/res/regedit.ico b/reactos/subsys/system/regedit/res/regedit.ico index b7481b412cf6f25e447fbf80fda2d91fc143fab8..d9811b9b6ac04d02a99545236266e4e3f4e6cfb3 100644 GIT binary patch delta 94 zcmZqMz}U8dal&jyrpX_fBqq;cwwnBjNntY|;{isXfC9^ZAOJE-Cd&nLOnxTK$Iik4 j0u4YhNs#J^|HLQ1WlrP*ivkI-YAdGy|2I!zDGCMvq2wbM delta 129 zcmZqMz}U8dal-7$?97sr=P+9dtU?1D|6O2IKoi5@PCm%qz^}o;z#ss`3P8-rz%rSU ZSsr8}2Tb+kd&~t04kNR}=4mVi!2mJNJTL$N From d82a66b2064c1c3fb9357c7061323e724936078e Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Mon, 21 Jun 2004 18:22:59 +0000 Subject: [PATCH 024/356] gone with the wind - sorry for that, I guess CVS isn't feeling well today svn path=/trunk/; revision=9799 --- reactos/drivers/dd/floppy/.cvsignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 reactos/drivers/dd/floppy/.cvsignore diff --git a/reactos/drivers/dd/floppy/.cvsignore b/reactos/drivers/dd/floppy/.cvsignore deleted file mode 100644 index fbfbcf8c4b6..00000000000 --- a/reactos/drivers/dd/floppy/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -*.coff -*.map \ No newline at end of file From ae0bc4e93976516c5a885a96bded044b17940c5d Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 21 Jun 2004 18:32:36 +0000 Subject: [PATCH 025/356] 1. fixed compiler warning 2. German resource update by Michael Fritscher svn path=/trunk/; revision=9800 --- reactos/subsys/system/regedit/De.rc | 339 ++++++++++++++++++++++++ reactos/subsys/system/regedit/hexedit.c | 2 +- reactos/subsys/system/regedit/rsrc.rc | 1 + 3 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 reactos/subsys/system/regedit/De.rc diff --git a/reactos/subsys/system/regedit/De.rc b/reactos/subsys/system/regedit/De.rc new file mode 100644 index 00000000000..f05fc7efb45 --- /dev/null +++ b/reactos/subsys/system/regedit/De.rc @@ -0,0 +1,339 @@ +/* + * Regedit resources + * + * Copyright 2002 Robert Dickenson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT + +/* + * Menu + */ + +IDC_REGEDIT MENU DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Beenden", ID_REGISTRY_EXIT + END + POPUP "&Help" + BEGIN + MENUITEM "&Über ...", ID_HELP_ABOUT + END +END + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "&Registry" + BEGIN + MENUITEM "Registry &importieren...", ID_REGISTRY_IMPORTREGISTRYFILE + + MENUITEM "Registry &exportieren...", ID_REGISTRY_EXPORTREGISTRYFILE + + MENUITEM SEPARATOR + MENUITEM "&Mit Neztwerkregistry verbinden...", + ID_REGISTRY_CONNECTNETWORKREGISTRY + , GRAYED + MENUITEM "&Von Netzwerkregistry trennen...", + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + , GRAYED + MENUITEM SEPARATOR + MENUITEM "&Drucken\tStrg+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Beenden", ID_REGISTRY_EXIT + END + POPUP "&Bearbeiten" + BEGIN + MENUITEM "&Ändern", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "&Neu" + BEGIN + MENUITEM "&Schlüssel", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&Zeichenkette", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Binärwert", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD Wert", ID_EDIT_NEW_DWORDVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Löschen\tEntf", ID_EDIT_DELETE + MENUITEM "&Unbenennen", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "Schlüsselname &kopieren", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Suchen\tStrg+F", ID_EDIT_FIND, GRAYED + MENUITEM "&Nächstes finden\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "&Ansicht" + BEGIN + MENUITEM "Status&leiste", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Trennen", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_VIEW_REFRESH + END + POPUP "&Favoriten" + BEGIN + MENUITEM "Zu den Favoriten &hinzugügen", ID_FAVOURITES_ADDTOFAVOURITES + , GRAYED + MENUITEM "Von den Favoriten &löschen", ID_FAVOURITES_REMOVEFAVOURITE + , GRAYED + END + POPUP "&Hilfe" + BEGIN + MENUITEM "&Hilfethemen\tF1", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "&Über Registry Editor", ID_HELP_ABOUT + END +END + +IDR_POPUP_MENUS MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Ändern", ID_EDIT_MODIFY + MENUITEM "Binäre Daten ändern", ID_EDIT_MODIFY_BIN + MENUITEM SEPARATOR + MENUITEM "&Löschen\tEntf", ID_EDIT_DELETE + MENUITEM "&Umbennenen", ID_EDIT_RENAME + END + POPUP "" + BEGIN + POPUP "&Neu" + BEGIN + MENUITEM "&Schlüssel", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&Zeichenkette", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Binärwert", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD Wert", ID_EDIT_NEW_DWORDVALUE + END + END +END + + +/* + * Dialog + */ + +IDD_EDIT_STRING DIALOG 32, 24, 252, 84 +STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP | + WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Zeichenkette ändern" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Daten:",IDC_STATIC,6,35,161,8 + EDITTEXT IDC_VALUE_DATA,6,46,240,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,142,64,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,196,64,50,14 +END + +IDD_EDIT_MULTI_STRING DIALOG 32, 24, 252, 174 +STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP | + WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Multi-Stringwert editieren" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Daten:",IDC_STATIC,6,35,161,8 + EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | WS_VSCROLL + DEFPUSHBUTTON "OK",IDOK,142,154,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,196,154,50,14 +END + +IDD_EDIT_BIN_DATA DIALOG 32, 24, 252, 174 +STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP | + WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Binärwert editieren" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Daten:",IDC_STATIC,6,35,161,8 + CONTROL "",IDC_VALUE_DATA,"HexEdit32",WS_VSCROLL | WS_BORDER | WS_TABSTOP,6,46,240,102 + DEFPUSHBUTTON "OK",IDOK,142,154,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,196,154,50,14 +END + + +IDD_EDIT_DWORD DIALOG 32, 24, 252, 104 +STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP | + WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "DWORD Wert editieren" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Name:",IDC_STATIC,6,6,134,8 + EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "&Daten:",IDC_STATIC,6,35,161,8 + EDITTEXT IDC_VALUE_DATA,6,46,116,12,ES_AUTOHSCROLL + GROUPBOX "Basis",IDC_STATIC,130,35,116,39 + AUTORADIOBUTTON "&Hexadezimal",IDC_FORMAT_HEX,141,46,60,10,WS_GROUP + AUTORADIOBUTTON "&Dezimal",IDC_FORMAT_DEC,141,59,60,10 + DEFPUSHBUTTON "OK",IDOK,142,82,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,196,82,50,14 +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "Name" + IDS_LIST_COLUMN_TYPE "Typ" + IDS_LIST_COLUMN_DATA "Daten" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Registry Editor" + IDC_REGEDIT "REGEDIT" + IDC_REGEDIT_FRAME "REGEDIT_FRAME" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "Befehle für für das Bearbeiten der ganzen Registry" + ID_EDIT_MENU "Befehle für um Schlüssel oder Werte zu ändern" + ID_VIEW_MENU "Befehle um das Fenster anzupassen" + ID_FAVOURITES_MENU "Befehle für die Favoriten" + ID_HELP_MENU "Befehle um die Hilfe oder Informationen über das Programm anzuzeigen" + ID_EDIT_NEW_MENU "Befehle für das Erstellen von neuen Schlüsseln oder Daten" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "Ändert die Daten eines Wertes" + ID_EDIT_NEW_KEY "Fügt einen neuen Schlüssel hinzu" + ID_EDIT_NEW_STRINGVALUE "Fügt einen neuen Zeichenkette hinzu " + ID_EDIT_NEW_BINARYVALUE "Fügt einen neuen Binärwärt hinzu" + ID_EDIT_NEW_DWORDVALUE "Fügt einen neuen DWORT Wert hinzu" + ID_REGISTRY_IMPORTREGISTRYFILE "Importiert eine Textddatei in die Registry" + ID_REGISTRY_EXPORTREGISTRYFILE + "Exportiert Teile oder die ganze Registry in eine Textdatei" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "Verbindet zu einer Registry eines Fremdcomputers" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "Trennt die Verbindung zu der Registry eines Fremdcomputers" + ID_REGISTRY_PRINT "Druckt Teile oder die gesamte Registry aus" +/* ID_HELP_HELPTOPICS "Öffnet die Hilfe" */ + ID_HELP_ABOUT "Zeigt Programmname, Version und Copyright an" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "Beendet den Registry Editor" + ID_FAVOURITES_ADDTOFAVOURITES "Fügt Schlüssel to den Favoriten hinzu" + ID_FAVOURITES_REMOVEFAVOURITE "Löscht Schlüssel von den Favoriten" + ID_VIEW_STATUSBAR "Zeigt oder versteckt die Statusleiste" + ID_VIEW_SPLIT "Ändert die Position das Fensterteilers" + ID_VIEW_REFRESH "Aktualisiert das Fenster" + ID_EDIT_DELETE "Löscht die Auswahl" + ID_EDIT_RENAME "Bennent die Auswahl um" + ID_EDIT_COPYKEYNAME "Kopiert den Schlüsselnamen in die Zwischenablage" + ID_EDIT_FIND "Findet eine Zeichenkette in einem Schlüssel, einem Namen oder in Daten" + ID_EDIT_FINDNEXT "Findet nächste Zeichenkette" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ERROR "Fehler" + IDS_BAD_VALUE "Kann den Wert '%s' nicht lesen" + IDS_UNSUPPORTED_TYPE "Kann Schlüssel von diesem Typ (%ld) nicht ändern" + IDS_TOO_BIG_VALUE "Der Wert ist zu groß (%ld)" + IDS_MULTI_SZ_EMPTY_STRING "Daten vom Typ REG_MULTI_SZ können keine leere Zeichenketten enthalten.\nDie leeren Zeichenkette wurden von der Liste gelöscht." + IDS_QUERY_DELETE_ONE "Diesen Wert wirklich löschen?" + IDS_QUERY_DELETE_MORE "Diese Werte wirklich löschen?" + IDS_QUERY_DELETE_CONFIRM "Löschen bestätigen" + IDS_ERR_DELVAL_CAPTION "Fehler beim Löschen von Werten" + IDS_ERR_DELETEVALUE "Es konnten nicht alle Werte gelöscht werden!" + IDS_ERR_RENVAL_CAPTION "Fehler beim Umbennnen des Wertes" + IDS_ERR_RENVAL_TOEMPTY "Kann %s nicht umbennenen. Der angebene Name ist leer." + +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_BINARY_EMPTY "(lerrer Binärwert)" + IDS_DEFAULT_VALUE_NAME "(Standard)" + IDS_VALUE_NOT_SET "(Wert nicht gesetzt)" + IDS_UNKNOWN_TYPE "Unbekannter Typ: (0x%lx)" + IDS_MY_COMPUTER "Arbeitsplatz" + IDS_IMPORT_REG_FILE "Registry importieren" + IDS_EXPORT_REG_FILE "Registry exportieren" + IDS_INVALID_DWORD "(ungültiger DWORD Wert)" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FLT_REGFILES "Registrierungsdateien" + IDS_FLT_REGFILES_FLT "*.reg" + IDS_FLT_REGEDIT4 "Win9x/NT4 Registrierungsdateien (REGEDIT4)" + IDS_FLT_REGEDIT4_FLT "*.reg" + IDS_FLT_ALLFILES "Alle Dateien (*.*)" + IDS_FLT_ALLFILES_FLT "*.*" +END + +/*****************************************************************/ + + +/* + * Dialog + */ + +IDD_DIALOG1 DIALOG DISCARDABLE 50, 50, 268, 98 +STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_BORDER +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_DIALOG2 DIALOG DISCARDABLE 0, 0, 187, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Dialog" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,130,7,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,130,24,50,14 +END + + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Öffnet die Hilfe." + * ID_HELP_ABOUT "Zeigt Programmname, Version und Copyright an" + *END + */ + +/*****************************************************************/ diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index c58cf1e5c52..b52907017a8 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -763,7 +763,7 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) switch(VkCode) { - case VK_LEFT:MessageBox(0, L"", L"", 0); + case VK_LEFT: if(hed->Position > 0) { if(--hed->CaretCol < 0) diff --git a/reactos/subsys/system/regedit/rsrc.rc b/reactos/subsys/system/regedit/rsrc.rc index fc5f795a49f..f9ed3b88ee1 100644 --- a/reactos/subsys/system/regedit/rsrc.rc +++ b/reactos/subsys/system/regedit/rsrc.rc @@ -27,6 +27,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* include localised resources */ +#include "De.rc" #include "En.rc" #include "Fr.rc" #include "It.rc" From 8d5c0638409d1224589092576905b22707c09cbf Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 21 Jun 2004 18:57:22 +0000 Subject: [PATCH 026/356] use FormatMessage() to print some error messages. Patch by Michael Fritscher. svn path=/trunk/; revision=9801 --- reactos/subsys/system/cmd/cmd.c | 4 ++-- reactos/subsys/system/cmd/cmd.h | 3 ++- reactos/subsys/system/cmd/console.c | 16 +++++++++++++++- reactos/subsys/system/cmd/internal.c | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 9a13b1b5324..7fc6c6692b8 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.15 2004/06/06 17:33:13 hbirr Exp $ +/* $Id: cmd.c,v 1.16 2004/06/21 18:57:22 weiden Exp $ * * CMD.C - command-line interface. * @@ -1334,7 +1334,7 @@ int main (int argc, char *argv[]) OPEN_EXISTING, 0, NULL); if (GetConsoleScreenBufferInfo(hConsole, &Info) == FALSE) { - ConErrPrintf (_T("GetConsoleScreenBufferInfo: Error: %ld\n"), GetLastError()); + ConOutFormatMessage(GetLastError()); return(1); } wColor = Info.wAttributes; diff --git a/reactos/subsys/system/cmd/cmd.h b/reactos/subsys/system/cmd/cmd.h index d9a48e43308..cd6534d44a2 100644 --- a/reactos/subsys/system/cmd/cmd.h +++ b/reactos/subsys/system/cmd/cmd.h @@ -1,4 +1,4 @@ -/* $Id: cmd.h,v 1.4 2003/12/26 09:52:37 navaraf Exp $ +/* $Id: cmd.h,v 1.5 2004/06/21 18:57:22 weiden Exp $ * * CMD.H - header file for the modules in CMD.EXE * @@ -170,6 +170,7 @@ VOID ConOutPrintf (LPTSTR, ...); VOID ConErrChar (TCHAR); VOID ConErrPuts (LPTSTR); VOID ConErrPrintf (LPTSTR, ...); +VOID ConOutFormatMessage (DWORD MessageId, ...); SHORT GetCursorX (VOID); SHORT GetCursorY (VOID); diff --git a/reactos/subsys/system/cmd/console.c b/reactos/subsys/system/cmd/console.c index 35a16c3a453..33e925092da 100644 --- a/reactos/subsys/system/cmd/console.c +++ b/reactos/subsys/system/cmd/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.5 2004/04/30 16:52:41 navaraf Exp $ +/* $Id: console.c,v 1.6 2004/06/21 18:57:22 weiden Exp $ * * CONSOLE.C - console input/output functions. * @@ -223,6 +223,20 @@ VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) #endif } +VOID ConOutFormatMessage (DWORD MessageId, ...) +{ + DWORD temp; + LPTSTR text; + va_list arg_ptr; + temp = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + MessageId, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &text, + 0, + &arg_ptr); + ConErrPrintf (text); +} VOID ConOutPrintf (LPTSTR szFormat, ...) { diff --git a/reactos/subsys/system/cmd/internal.c b/reactos/subsys/system/cmd/internal.c index c8a6f9feea0..0d03cf8322b 100644 --- a/reactos/subsys/system/cmd/internal.c +++ b/reactos/subsys/system/cmd/internal.c @@ -247,8 +247,8 @@ INT cmd_chdir (LPTSTR cmd, LPTSTR param) if (!SetCurrentDirectory (dir)) { //ErrorMessage (GetLastError(), _T("CD")); - ConErrPrintf (_T("Dir \"%s\" doesn't seem to exist!"),dir); - + ConOutFormatMessage(GetLastError()); + /* throw away current directory */ free (lpOldPath); lpOldPath = NULL; From d9954bc076142502d28d2c32bae2a99baf97f000 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 21 Jun 2004 19:32:49 +0000 Subject: [PATCH 027/356] disable explorer sidebar in SDI mode svn path=/trunk/; revision=9803 --- reactos/subsys/system/explorer/explorer_intres.rc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 5a6241bb229..319d9b75cca 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -81,7 +81,7 @@ BEGIN POPUP "²é¿´(&V)" BEGIN MENUITEM "¹¤¾ßÀ¸(&T)", ID_VIEW_TOOL_BAR - MENUITEM "²à±ßÀ¸(&S)", ID_VIEW_SIDE_BAR + MENUITEM "²à±ßÀ¸(&S)", ID_VIEW_SIDE_BAR, GRAYED MENUITEM "״̬À¸(&S)", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "Ë¢ÐÂ(&R)\tF5", ID_REFRESH @@ -486,8 +486,8 @@ BEGIN POPUP "&Prezentare" BEGIN MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR - MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR MENUITEM SEPARATOR MENUITEM "&Resetare\tF5", ID_REFRESH MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN @@ -802,7 +802,7 @@ BEGIN POPUP "&Ansicht" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR - MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Aktualisieren\tF5", ID_REFRESH @@ -1072,7 +1072,7 @@ BEGIN POPUP "&View" BEGIN MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR - MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED MENUITEM "&Status Bar", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Refresh\tF5", ID_REFRESH @@ -1524,7 +1524,7 @@ BEGIN POPUP "&Affichage" BEGIN MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR - MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED MENUITEM "Barre d'&état", ID_VIEW_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Refresh\tF5", ID_REFRESH From bfce2bcf202ccf8b2552dbf1b4c95e206949ea1d Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 21 Jun 2004 20:55:16 +0000 Subject: [PATCH 028/356] Another PSEH fix svn path=/trunk/; revision=9804 --- reactos/include/pseh/excpt.h | 32 +++++++++++++++++++++++++++++++ reactos/include/pseh/framebased.h | 10 +++------- reactos/lib/pseh/framebased.c | 13 +++++++------ reactos/tools/helper.mk | 6 +++--- 4 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 reactos/include/pseh/excpt.h diff --git a/reactos/include/pseh/excpt.h b/reactos/include/pseh/excpt.h new file mode 100644 index 00000000000..3dcbb36afb4 --- /dev/null +++ b/reactos/include/pseh/excpt.h @@ -0,0 +1,32 @@ +/* + Copyright (c) 2004 KJK::Hyperion + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef KJK_PSEH_EXCPT_H_ +#define KJK_PSEH_EXCPT_H_ + +#define _SEH_CONTINUE_EXECUTION (-1) +#define _SEH_CONTINUE_SEARCH (0) +#define _SEH_EXECUTE_HANDLER (1) + +#endif + +/* EOF */ diff --git a/reactos/include/pseh/framebased.h b/reactos/include/pseh/framebased.h index a203a045f27..94e348c18e3 100644 --- a/reactos/include/pseh/framebased.h +++ b/reactos/include/pseh/framebased.h @@ -24,11 +24,7 @@ #define KJK_PSEH_FRAMEBASED_H_ #include - -/* Safeguards against broken SDK/CRT headers */ -#ifndef _SEH_NO_SYSTEM_HEADERS -# include -#endif +#include #ifndef offsetof # include @@ -81,7 +77,7 @@ static __declspec(noreturn) void __stdcall _SEHCompilerSpecificHandler #define _SEH_TRY_FINALLY(FINALLY_) \ _SEH_TRY_FILTER_FINALLY \ ( \ - (_SEHFilter_t)(EXCEPTION_CONTINUE_SEARCH + 1), \ + (_SEHFilter_t)(_SEH_CONTINUE_SEARCH + 1), \ (FINALLY_) \ ) @@ -93,7 +89,7 @@ static __declspec(noreturn) void __stdcall _SEHCompilerSpecificHandler #define _SEH_TRY_HANDLE_FINALLY(FINALLY_) \ _SEH_TRY_FILTER_FINALLY \ ( \ - (_SEHFilter_t)(EXCEPTION_EXECUTE_HANDLER + 1), \ + (_SEHFilter_t)(_SEH_EXECUTE_HANDLER + 1), \ (FINALLY_) \ ) diff --git a/reactos/lib/pseh/framebased.c b/reactos/lib/pseh/framebased.c index 6393bba5f28..e858b21680a 100644 --- a/reactos/lib/pseh/framebased.c +++ b/reactos/lib/pseh/framebased.c @@ -25,6 +25,7 @@ #include #include +#include #include /* Assembly helpers, see i386/framebased.asm */ @@ -78,9 +79,9 @@ int __cdecl _SEHFrameHandler switch((UINT_PTR)frame->SPF_Handlers->SH_Filter) { - case EXCEPTION_EXECUTE_HANDLER + 1: - case EXCEPTION_CONTINUE_SEARCH + 1: - case EXCEPTION_CONTINUE_EXECUTION + 1: + case _SEH_EXECUTE_HANDLER + 1: + case _SEH_CONTINUE_SEARCH + 1: + case _SEH_CONTINUE_EXECUTION + 1: { ret = (int)((UINT_PTR)frame->SPF_Handlers->SH_Filter) - 1; break; @@ -98,13 +99,13 @@ int __cdecl _SEHFrameHandler } } - /* EXCEPTION_CONTINUE_EXECUTION */ + /* _SEH_CONTINUE_EXECUTION */ if(ret < 0) return ExceptionContinueExecution; - /* EXCEPTION_EXECUTE_HANDLER */ + /* _SEH_EXECUTE_HANDLER */ else if(ret > 0) _SEHCallHandler(frame); - /* EXCEPTION_CONTINUE_SEARCH */ + /* _SEH_CONTINUE_SEARCH */ else /* fall through */; } diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 71875be6d72..54aac3b16c1 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.68 2004/06/18 22:33:06 hyperion Exp $ +# $Id: helper.mk,v 1.69 2004/06/21 20:55:16 hyperion Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -583,8 +583,8 @@ endif ifeq ($(MK_MODE),kernel) MK_DEFBASE := 0x10000 MK_LIBS := $(addprefix $(DDK_PATH_LIB)/, $(TARGET_DDKLIBS) $(MK_DDKLIBS)) - MK_CFLAGS += -D_SEH_NO_NATIVE_NLG -D_SEH_NO_SYSTEM_HEADERS - MK_CPPFLAGS += -D_SEH_NO_NATIVE_NLG -D_SEH_NO_SYSTEM_HEADERS + MK_CFLAGS += -D_SEH_NO_NATIVE_NLG + MK_CPPFLAGS += -D_SEH_NO_NATIVE_NLG endif From 924522f57cd02b46a11f4c11a1d9cebf196d8547 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 21 Jun 2004 20:56:53 +0000 Subject: [PATCH 029/356] - Fixed the access to an uninitialized variable in IntCreateClass. svn path=/trunk/; revision=9805 --- reactos/subsys/win32k/ntuser/class.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/class.c b/reactos/subsys/win32k/ntuser/class.c index 6683da65076..6de093a39b7 100644 --- a/reactos/subsys/win32k/ntuser/class.c +++ b/reactos/subsys/win32k/ntuser/class.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: class.c,v 1.58 2004/06/20 00:45:36 navaraf Exp $ +/* $Id: class.c,v 1.59 2004/06/21 20:56:53 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -278,7 +278,7 @@ IntCreateClass( ULONG objectSize; BOOL Global; - Global = !(Flags & REGISTERCLASS_SYSTEM) ? ClassObject->style & CS_GLOBALCLASS : TRUE; + Global = (Flags & REGISTERCLASS_SYSTEM) || (lpwcx->style & CS_GLOBALCLASS) ? TRUE : FALSE; /* Check for double registration of the class. */ if (PsGetWin32Process() != NULL) From 7d5a8e2e07c1f39306bb0256dbc20e13546f056e Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 21 Jun 2004 21:00:37 +0000 Subject: [PATCH 030/356] - Reduced the necessary size of inquiry data to 4 byte. - Incremented the active irp counters in SpiAddActiveIrp, because the valid value is necessary in this function while starting new irp's. - Do not set the command queueing enable flag in SpiAddActiveIrp, because this is the job of a driver above scsiport. svn path=/trunk/; revision=9806 --- reactos/drivers/storage/scsiport/scsiport.c | 34 ++++++++++++--------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index 996b2988256..2caa7671ba7 100644 --- a/reactos/drivers/storage/scsiport/scsiport.c +++ b/reactos/drivers/storage/scsiport/scsiport.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: scsiport.c,v 1.61 2004/06/15 09:29:41 hbirr Exp $ +/* $Id: scsiport.c,v 1.62 2004/06/21 21:00:37 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -48,6 +48,8 @@ /* GLOBALS *******************************************************************/ +static ULONG InternalDebugLevel = 0; + static VOID SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PIRP NextIrp); @@ -202,10 +204,8 @@ ScsiDebugPrint(IN ULONG DebugPrintLevel, char Buffer[256]; va_list ap; -#if 0 - if (DebugPrintLevel > InternalDebugLevel) + if (DebugPrintLevel >= InternalDebugLevel) return; -#endif va_start(ap, DebugMessage); vsprintf(Buffer, DebugMessage, ap); @@ -1787,8 +1787,6 @@ SpiAllocateSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { DeviceExtension->CurrentSrbExtensions++; Srb->SrbExtension = DeviceExtension->VirtualAddress + index * DeviceExtension->SrbExtensionSize; -// Srb->QueueTag = i; -// Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; } } DPRINT("%x\n", Srb->SrbExtension); @@ -2042,7 +2040,14 @@ SpiScanAdapter (IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) if (NT_SUCCESS(ScanData->Status) && (Srb->SrbStatus == SRB_STATUS_SUCCESS || (Srb->SrbStatus == SRB_STATUS_DATA_OVERRUN && - Srb->DataTransferLength >= INQUIRYDATABUFFERSIZE)) && + /* + * FIXME: + * The NT 4.0 driver from an inic950 based scsi controller + * returns only 4 byte of inquiry data, but the device name + * is visible on NT 4.0. We must implement an other way + * to get the complete inquiry data. + */ + Srb->DataTransferLength >= /*INQUIRYDATABUFFERSIZE*/4)) && ((PINQUIRYDATA)Srb->DataBuffer)->DeviceTypeQualifier == 0) { /* Copy inquiry data */ @@ -2777,13 +2782,10 @@ SpiAddActiveIrp(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PSCSI_REQUEST_BLOCK Srb; LunExtension = Irp->Tail.Overlay.DriverContext[2]; Srb = Irp->Tail.Overlay.DriverContext[3]; - Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE; Irp->Tail.Overlay.DriverContext[0] = (PVOID)DeviceExtension->NextIrp; InterlockedExchangePointer(&DeviceExtension->NextIrp, Irp); Irp->Tail.Overlay.DriverContext[1] = (PVOID)LunExtension->NextIrp; InterlockedExchangePointer(&LunExtension->NextIrp, Irp); - InterlockedIncrement((PLONG)&LunExtension->ActiveIrpCount); - InterlockedIncrement((PLONG)&DeviceExtension->ActiveIrpCount); } static VOID @@ -2838,10 +2840,6 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, * FIXME: * Is this the right place to set this flag ? */ - if (DeviceExtension->PortConfig->MultipleRequestPerLu) - { - Srb->SrbFlags |= SRB_FLAGS_QUEUE_ACTION_ENABLE; - } NextIrp->Tail.Overlay.DriverContext[2] = (PVOID)Srb->QueueSortKey; LunExtension = Srb->OriginalRequest; @@ -3021,6 +3019,10 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, { LunExtension->PendingIrpCount--; DeviceExtension->PendingIrpCount--; + Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE; + LunExtension->ActiveIrpCount++; + DeviceExtension->ActiveIrpCount++; + RemoveEntryList((PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]); Irp->Tail.Overlay.DriverContext[2] = LunExtension; Srb->OriginalRequest = Irp; @@ -3058,6 +3060,10 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, LunExtension->PendingIrpCount--; DeviceExtension->PendingIrpCount--; + Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE; + LunExtension->ActiveIrpCount++; + DeviceExtension->ActiveIrpCount++; + SpiAllocateSrbExtension(DeviceExtension, Srb); KeReleaseSpinLockFromDpcLevel(&DeviceExtension->Lock); From 7b96a26e57d05185760764b1d02f8a1d4fb7ba72 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 21 Jun 2004 21:03:12 +0000 Subject: [PATCH 031/356] - Enabled the command queueing (in DiskClassCreateDeviceObject). - Do always reread the partition table in DiskBuildPartitionTable, because DiskBuildPartitionTable is only called for removable media's. - If there is no partition table available, set the disk data entries for this volume to the super floppy format (in DiskBuildPartitionTable). svn path=/trunk/; revision=9807 --- reactos/drivers/storage/disk/disk.c | 80 +++++++++++++++++++---------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 23de91ef1af..993f4c39e80 100644 --- a/reactos/drivers/storage/disk/disk.c +++ b/reactos/drivers/storage/disk/disk.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: disk.c,v 1.41 2004/05/10 18:02:20 gvg Exp $ +/* $Id: disk.c,v 1.42 2004/06/21 21:03:12 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -548,6 +548,14 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, DiskDeviceExtension->PathId = InquiryData->PathId; DiskDeviceExtension->TargetId = InquiryData->TargetId; DiskDeviceExtension->Lun = InquiryData->Lun; + DiskDeviceExtension->SrbFlags = 0; + + /* Enable the command queueing, if it possible */ + if (Capabilities->TaggedQueuing && + ((PINQUIRYDATA)InquiryData->InquiryData)->CommandQueue) + { + DiskDeviceExtension->SrbFlags |= SRB_FLAGS_QUEUE_ACTION_ENABLE; + } /* Get timeout value */ DiskDeviceExtension->TimeOutValue = @@ -589,7 +597,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, } /* Allocate sense data buffer */ - DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPool, + DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPoolCacheAligned, SENSE_BUFFER_SIZE); if (DiskDeviceExtension->SenseData == NULL) { @@ -853,14 +861,17 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension; DiskData = (PDISK_DATA)(DiskDeviceExtension + 1); - if (DiskDeviceExtension->StartingOffset.QuadPart) + Status = ScsiClassReadDriveCapacity(DiskDeviceObject); + if (!NT_SUCCESS(Status)) { - DPRINT("Partition already installed\n"); - return(STATUS_SUCCESS); + /* Drive is not ready. */ + DPRINT("Drive not ready\n"); + DiskData->DriveNotReady = TRUE; + return Status; } - /* Read partition table */ - Status = IoReadPartitionTable(DiskDeviceObject, + /* Read partition table */ + Status = IoReadPartitionTable(DiskDeviceExtension->PhysicalDevice, DiskDeviceExtension->DiskGeometry->BytesPerSector, TRUE, &PartitionList); @@ -886,27 +897,42 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, /* Set disk signature */ DiskData->Signature = PartitionList->Signature; - for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++) - { - PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber]; + DiskData->NextPartition = NULL; - DiskData->NextPartition = NULL; - DiskData->PartitionType = PartitionEntry->PartitionType; - DiskData->PartitionNumber = PartitionNumber + 1; - DiskData->PartitionOrdinal = PartitionNumber + 1; - DiskData->HiddenSectors = PartitionEntry->HiddenSectors; - DiskData->BootIndicator = PartitionEntry->BootIndicator; - DiskData->DriveNotReady = FALSE; - DiskDeviceExtension->StartingOffset = PartitionEntry->StartingOffset; - DiskDeviceExtension->PartitionLength = PartitionEntry->PartitionLength; + if (PartitionList->PartitionCount) + { + for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++) + { + PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber]; + + DiskData->PartitionType = PartitionEntry->PartitionType; + DiskData->PartitionNumber = PartitionNumber + 1; + DiskData->PartitionOrdinal = PartitionNumber + 1; + DiskData->HiddenSectors = PartitionEntry->HiddenSectors; + DiskData->BootIndicator = PartitionEntry->BootIndicator; + DiskData->DriveNotReady = FALSE; + DiskDeviceExtension->StartingOffset = PartitionEntry->StartingOffset; + DiskDeviceExtension->PartitionLength = PartitionEntry->PartitionLength; - DPRINT("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n", - PartitionNumber, - DiskData->PartitionNumber, - DiskData->BootIndicator, - DiskData->PartitionType, - DiskDeviceExtension->StartingOffset.QuadPart / 512 /*DrvParms.BytesPerSector*/, - DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/); + DPRINT1("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n", + PartitionNumber, + DiskData->PartitionNumber, + DiskData->BootIndicator, + DiskData->PartitionType, + DiskDeviceExtension->StartingOffset.QuadPart / 512 /*DrvParms.BytesPerSector*/, + DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/); + } + } + else + { + DiskData->PartitionType = 0; + DiskData->PartitionNumber = 1; + DiskData->PartitionOrdinal = 0; + DiskData->HiddenSectors = 0; + DiskData->BootIndicator = 0; + DiskData->DriveNotReady = FALSE; + DiskDeviceExtension->PartitionLength.QuadPart += DiskDeviceExtension->StartingOffset.QuadPart; + DiskDeviceExtension->StartingOffset.QuadPart = 0; } } @@ -980,7 +1006,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, if (!NT_SUCCESS(Status)) { /* Drive is not ready */ - DiskData->DriveNotReady = FALSE; + DiskData->DriveNotReady = TRUE; break; } From 362995c318bef6ac2ed44a6db7c8f901b121fd83 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 21 Jun 2004 21:07:29 +0000 Subject: [PATCH 032/356] Does ntoskrnl really need its own makefile? svn path=/trunk/; revision=9808 --- reactos/ntoskrnl/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 0af7d653557..f502b63657f 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.124 2004/06/21 04:12:59 ion Exp $ +# $Id: Makefile,v 1.125 2004/06/21 21:07:29 hyperion Exp $ # # ReactOS Operating System # @@ -52,6 +52,9 @@ endif # require os code to explicitly request A/W version of structs/functions CFLAGS += -D_DISABLE_TIDENTS +# no native setjmp/longjmp in the kernel +CFLAGS += -D_SEH_NO_NATIVE_NLG + CFLAGS += $(STD_CFLAGS) ASFLAGS += $(STD_ASFLAGS) RCFLAGS += $(STD_RCFLAGS) From c7ce024b3a3688a77a380aa8f1527db23b88eb92 Mon Sep 17 00:00:00 2001 From: Vizzini Date: Tue, 22 Jun 2004 03:02:33 +0000 Subject: [PATCH 033/356] minor debug message fix svn path=/trunk/; revision=9809 --- reactos/drivers/storage/floppy/hardware.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index e881d83f1eb..ec340e99b83 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -288,7 +288,7 @@ NTSTATUS NTAPI HwTurnOffMotor(PCONTROLLER_INFO ControllerInfo) * - Called at DISPATCH_LEVEL */ { - KdPrint(("floppy: HwTurnOffMotor: writing byte 0x%x to offset 0x%x\n", DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE)); + KdPrint(("floppy: HwTurnOffMotor: writing byte 0x%x to offset 0x%x\n", DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE, DIGITAL_OUTPUT_REGISTER)); WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + DIGITAL_OUTPUT_REGISTER, DOR_FDC_ENABLE|DOR_DMA_IO_INTERFACE_ENABLE); From 55dc4a9268a95fca3c907cad1dda8ac86839119a Mon Sep 17 00:00:00 2001 From: Richard Campbell Date: Tue, 22 Jun 2004 10:46:09 +0000 Subject: [PATCH 034/356] very basic makefile for vs2003 (and the free tools). Please note that some programs don't compile properly, will take a look at this later. svn path=/trunk/; revision=9810 --- reactos/tools/makefile.vs2003 | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 reactos/tools/makefile.vs2003 diff --git a/reactos/tools/makefile.vs2003 b/reactos/tools/makefile.vs2003 deleted file mode 100644 index def91aa5543..00000000000 --- a/reactos/tools/makefile.vs2003 +++ /dev/null @@ -1,13 +0,0 @@ -tools : buildno.c depends.c mkconfig.c mkflpimg.c rcopy.c rdel.c regtests.c rline.c rmkdir.c rrmdir.c rsym.c rtouch.c - cl buildno.c - cl depends.c - cl mkconfig.c - cl mkflpimg.c - cl rcopy.c - cl rdel.c - cl regtests.c - cl rline.c - cl rmkdir.c - cl rrmdir.c - cl rsym.c - cl rtouch.c \ No newline at end of file From 2e89468648315cfc9e6101b8b377eb2a96e1c452 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Tue, 22 Jun 2004 12:43:49 +0000 Subject: [PATCH 035/356] small bugfix - debug/release inconsistency - found by Thomas Weidenmueller svn path=/trunk/; revision=9811 --- reactos/subsys/win32k/ntuser/window.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 73857010f62..dd68202915c 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: window.c,v 1.240 2004/06/20 16:06:05 navaraf Exp $ +/* $Id: window.c,v 1.241 2004/06/22 12:43:49 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1934,7 +1934,9 @@ IntCreateWindowEx(DWORD dwExStyle, if ((WindowObject->ClientRect.right - WindowObject->ClientRect.left) < 0 || (WindowObject->ClientRect.bottom - WindowObject->ClientRect.top) < 0) + { DPRINT("Sending bogus WM_SIZE\n"); + } lParam = MAKE_LONG(WindowObject->ClientRect.right - WindowObject->ClientRect.left, From a8b5ba5a727297947449d6f51de632cd3fe0686a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 22 Jun 2004 14:00:36 +0000 Subject: [PATCH 036/356] Add missing IOCTL codes. svn path=/trunk/; revision=9812 --- reactos/include/ntos/cdrom.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/reactos/include/ntos/cdrom.h b/reactos/include/ntos/cdrom.h index 92e74835cf1..95e13249475 100644 --- a/reactos/include/ntos/cdrom.h +++ b/reactos/include/ntos/cdrom.h @@ -1,10 +1,10 @@ -/* $Id: cdrom.h,v 1.6 2003/06/26 20:02:03 ekohl Exp $ +/* $Id: cdrom.h,v 1.7 2004/06/22 14:00:36 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: include/ntos/cdrom.h * PURPOSE: CD-ROM related definitions used by all the parts of the system - * PROGRAMMER: Eric Kohl + * PROGRAMMER: Eric Kohl * UPDATE HISTORY: * 10/04/2002: Created */ @@ -20,6 +20,12 @@ #define IOCTL_CDROM_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_CDROM_CHECK_VERIFY CTL_CODE(IOCTL_CDROM_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_MEDIA_REMOVAL CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_EJECT_MEDIA CTL_CODE(IOCTL_CDROM_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_LOAD_MEDIA CTL_CODE(IOCTL_CDROM_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_RESERVE CTL_CODE(IOCTL_CDROM_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_RELEASE CTL_CODE(IOCTL_CDROM_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_FIND_NEW_DEVICES CTL_CODE(IOCTL_CDROM_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) #define MAXIMUM_NUMBER_TRACKS 100 From 47e5aeceab8ad92c3865f0daee1490bc30a4df01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 22 Jun 2004 20:08:17 +0000 Subject: [PATCH 037/356] Convert between RGBQUAD and PALETTEENTRY svn path=/trunk/; revision=9814 --- reactos/subsys/win32k/include/palette.h | 2 ++ reactos/subsys/win32k/objects/dib.c | 7 ++-- reactos/subsys/win32k/objects/palette.c | 44 ++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/include/palette.h b/reactos/subsys/win32k/include/palette.h index 5368f746429..073022a7920 100644 --- a/reactos/subsys/win32k/include/palette.h +++ b/reactos/subsys/win32k/include/palette.h @@ -33,6 +33,8 @@ HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, ULONG Red, ULONG Green, ULONG Blue); +HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, + CONST RGBQUAD *Colors); #define PALETTE_FreePalette(hPalette) GDIOBJ_FreeObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE, GDIOBJFLAG_DEFAULT) #define PALETTE_LockPalette(hPalette) ((PPALGDI)GDIOBJ_LockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)) #define PALETTE_UnlockPalette(hPalette) GDIOBJ_UnlockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE) diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index b535517406f..2a0cea6435b 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.51 2004/06/20 00:45:37 navaraf Exp $ + * $Id: dib.c,v 1.52 2004/06/22 20:08:17 gvg Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -54,9 +54,8 @@ NtGdiSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, CONST RGBQUAD *Col /* Rebuild the palette. */ NtGdiDeleteObject(dc->w.hPalette); - dc->w.hPalette = PALETTE_AllocPalette(PAL_INDEXED, - 1 << BitmapObj->dib->dsBmih.biBitCount, - (PULONG)BitmapObj->ColorMap, 0, 0, 0); + dc->w.hPalette = PALETTE_AllocPaletteIndexedRGB(1 << BitmapObj->dib->dsBmih.biBitCount, + BitmapObj->ColorMap); } else Entries = 0; diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index c03b66a4a3f..617eac8a57a 100644 --- a/reactos/subsys/win32k/objects/palette.c +++ b/reactos/subsys/win32k/objects/palette.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: palette.c,v 1.19 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: palette.c,v 1.20 2004/06/22 20:08:17 gvg Exp $ */ #include #ifndef NO_MAPPING @@ -98,6 +98,48 @@ PALETTE_AllocPalette(ULONG Mode, return NewPalette; } +HPALETTE FASTCALL +PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, + CONST RGBQUAD *Colors) +{ + HPALETTE NewPalette; + PPALGDI PalGDI; + unsigned i; + + NewPalette = (HPALETTE) GDIOBJ_AllocObj(sizeof(PALGDI), GDI_OBJECT_TYPE_PALETTE, (GDICLEANUPPROC) PALETTE_InternalDelete); + if (NULL == NewPalette) + { + return NULL; + } + + PalGDI = PALETTE_LockPalette(NewPalette); + ASSERT( PalGDI ); + + PalGDI->Self = NewPalette; + PalGDI->Mode = PAL_INDEXED; + + PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); + if (NULL == PalGDI->IndexedColors) + { + PALETTE_UnlockPalette(NewPalette); + PALETTE_FreePalette(NewPalette); + return NULL; + } + for (i = 0; i < NumColors; i++) + { + PalGDI->IndexedColors[i].peRed = Colors[i].rgbRed; + PalGDI->IndexedColors[i].peGreen = Colors[i].rgbGreen; + PalGDI->IndexedColors[i].peBlue = Colors[i].rgbBlue; + PalGDI->IndexedColors[i].peFlags = 0; + } + + PalGDI->NumColors = NumColors; + + PALETTE_UnlockPalette(NewPalette); + + return NewPalette; +} + // Create the system palette HPALETTE FASTCALL PALETTE_Init(VOID) { From 9130d5d683a5e8af08bc95ffdee9caf1833eb1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 22 Jun 2004 23:27:48 +0000 Subject: [PATCH 038/356] Update version number to 0.2.x svn path=/trunk/; revision=9817 --- reactos/README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/README b/reactos/README index ac71c277bcf..2a4e7f8da66 100644 --- a/reactos/README +++ b/reactos/README @@ -1,6 +1,6 @@ ======================== -ReactOS Version 0.1.x -Updated March 19th, 2003 +ReactOS Version 0.2.x +Updated June 23rd, 2004 ======================== 1. What is ReactOS? From ba71f3769043dc8315dbdfd7dcc874a3f2103e9c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 00:12:41 +0000 Subject: [PATCH 039/356] CM (Registry Manager) Stubs added (Registry Callbacks) svn path=/trunk/; revision=9818 --- reactos/ntoskrnl/cm/cm.h | 15 +++++++++++++++ reactos/ntoskrnl/cm/ntfunc.c | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/reactos/ntoskrnl/cm/cm.h b/reactos/ntoskrnl/cm/cm.h index 2b9ef9c63d3..8e9f4719d5b 100644 --- a/reactos/ntoskrnl/cm/cm.h +++ b/reactos/ntoskrnl/cm/cm.h @@ -356,6 +356,12 @@ extern KSPIN_LOCK CmiKeyListLock; extern LIST_ENTRY CmiHiveListHead; extern ERESOURCE CmiHiveListLock; +/* Registry Callback Function */ +typedef NTSTATUS (*PEX_CALLBACK_FUNCTION ) ( + IN PVOID CallbackContext, + IN PVOID Argument1, + IN PVOID Argument2 + ); VOID CmiVerifyBinHeader(PHBIN BinHeader); @@ -386,6 +392,15 @@ CmiVerifyRegistryHive(PREGISTRY_HIVE RegistryHive); #define VERIFY_REGISTRY_HIVE(x) #endif +NTSTATUS STDCALL +CmRegisterCallback(IN PEX_CALLBACK_FUNCTION Function, + IN PVOID Context, + IN OUT PLARGE_INTEGER Cookie + ); + +NTSTATUS STDCALL +CmUnRegisterCallback(IN LARGE_INTEGER Cookie); + NTSTATUS STDCALL CmiObjectParse(IN PVOID ParsedObject, OUT PVOID *NextObject, diff --git a/reactos/ntoskrnl/cm/ntfunc.c b/reactos/ntoskrnl/cm/ntfunc.c index fe26fcc2c73..327fb8e74d9 100644 --- a/reactos/ntoskrnl/cm/ntfunc.c +++ b/reactos/ntoskrnl/cm/ntfunc.c @@ -31,6 +31,31 @@ static BOOLEAN CmiRegistryInitialized = FALSE; /* FUNCTIONS ****************************************************************/ +/* + * @unimplemented + */ +NTSTATUS STDCALL +CmRegisterCallback(IN PEX_CALLBACK_FUNCTION Function, + IN PVOID Context, + IN OUT PLARGE_INTEGER Cookie + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ + +NTSTATUS STDCALL +CmUnRegisterCallback(IN LARGE_INTEGER Cookie) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + NTSTATUS STDCALL NtCreateKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, From f737c1e98a5be37d11a335c4f76ebf964d18c98c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 00:15:59 +0000 Subject: [PATCH 040/356] DBG Stubs Added. svn path=/trunk/; revision=9819 --- reactos/ntoskrnl/dbg/dbgctrl.c | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/reactos/ntoskrnl/dbg/dbgctrl.c b/reactos/ntoskrnl/dbg/dbgctrl.c index 33df5344fc9..a1206a39a0b 100644 --- a/reactos/ntoskrnl/dbg/dbgctrl.c +++ b/reactos/ntoskrnl/dbg/dbgctrl.c @@ -35,6 +35,49 @@ /* FUNCTIONS *****************************************************************/ +/* + * @unimplemented + */ +ULONG +__cdecl +DbgPrintReturnControlC( + PCH Format, + ... + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + NTSTATUS STDCALL NtSystemDebugControl(DEBUG_CONTROL_CODE ControlCode, PVOID InputBuffer, From 9467b632c17824119f6308e837a46192b6bab4ae Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 00:41:55 +0000 Subject: [PATCH 041/356] FSRTL Types and Prototypes Added. svn path=/trunk/; revision=9820 --- reactos/include/ddk/fsfuncs.h | 137 +++++++++++++++++++++++++++++++++- reactos/include/ddk/fstypes.h | 101 ++++++++++++++++++++++++- 2 files changed, 236 insertions(+), 2 deletions(-) diff --git a/reactos/include/ddk/fsfuncs.h b/reactos/include/ddk/fsfuncs.h index 98c725eac8c..4907134f372 100644 --- a/reactos/include/ddk/fsfuncs.h +++ b/reactos/include/ddk/fsfuncs.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_DDK_FSFUNCS_H #define __INCLUDE_DDK_FSFUNCS_H -/* $Id: fsfuncs.h,v 1.22 2003/12/17 20:27:06 ekohl Exp $ */ +/* $Id: fsfuncs.h,v 1.23 2004/06/23 00:41:55 ion Exp $ */ #define FlagOn(x,f) ((x) & (f)) #include @@ -12,6 +12,12 @@ FsRtlFreeFileLock( IN PFILE_LOCK FileLock ); +STDCALL +VOID +FsRtlAcquireFileExclusive ( + IN PFILE_OBJECT FileObject + ); + PFILE_LOCK STDCALL FsRtlAllocateFileLock ( @@ -257,6 +263,19 @@ FsRtlGetNextMcbEntry (IN PMCB Mcb, OUT PULONG SectorCount); #define FsRtlEnterFileSystem KeEnterCriticalRegion #define FsRtlExitFileSystem KeLeaveCriticalRegion + +VOID +FsRtlIncrementCcFastReadNotPossible( VOID ); + +VOID +FsRtlIncrementCcFastReadWait( VOID ); + +VOID +FsRtlIncrementCcFastReadNoWait( VOID ); + +VOID +FsRtlIncrementCcFastReadResourceMiss( VOID ); + VOID STDCALL FsRtlInitializeFileLock ( @@ -276,11 +295,27 @@ FsRtlInitializeMcb (IN PMCB Mcb, VOID STDCALL FsRtlInitializeOplock(IN OUT POPLOCK Oplock); + VOID STDCALL FsRtlInitializeTunnelCache ( IN PTUNNEL Cache ); + +STDCALL +NTSTATUS +FsRtlInsertPerFileObjectContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext, + IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr + ); + +STDCALL +NTSTATUS +FsRtlInsertPerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr + ); + BOOLEAN STDCALL FsRtlIsDbcsInExpression ( @@ -317,6 +352,11 @@ FsRtlIsNameInExpression ( BOOLEAN STDCALL FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus); +ULONG +FsRtlIsPagingFile ( + IN PFILE_OBJECT FileObject + ); + BOOLEAN STDCALL FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus); @@ -339,6 +379,14 @@ BOOLEAN STDCALL FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb, OUT PLONGLONG Vbn, OUT PLONGLONG Lbn); +STDCALL +BOOLEAN +FsRtlLookupLastLargeMcbEntryAndIndex ( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index + ); BOOLEAN STDCALL FsRtlLookupLastMcbEntry (IN PMCB Mcb, @@ -350,6 +398,21 @@ FsRtlLookupMcbEntry (IN PMCB Mcb, OUT PLBN Lbn, OUT PULONG SectorCount OPTIONAL, OUT PULONG Index); +STDCALL +PFSRTL_PER_STREAM_CONTEXT +FsRtlLookupPerStreamContextInternal ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ); + +STDCALL +PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ +FsRtlLookupPerFileObjectContext ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ); BOOLEAN STDCALL @@ -424,6 +487,36 @@ BOOLEAN (*PCHECK_FOR_TRAVERSE_ACCESS) ( IN PVOID TargetContext, IN PSECURITY_SUBJECT_CONTEXT SubjectContext ); +STDCALL +VOID +FsRtlNotifyFilterChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL + ); + +STDCALL +VOID +FsRtlNotifyFilterReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext, + IN PVOID FilterContext + ); VOID STDCALL FsRtlNotifyFullChangeDirectory ( @@ -551,11 +644,24 @@ FsRtlProcessFileLock ( IN PVOID Context OPTIONAL ); +STDCALL +NTSTATUS +FsRtlRegisterFileSystemFilterCallbacks ( + IN struct _DRIVER_OBJECT *FilterDriverObject, + IN PFS_FILTER_CALLBACKS Callbacks + ); + NTSTATUS STDCALL FsRtlRegisterUncProvider(IN OUT PHANDLE Handle, IN PUNICODE_STRING RedirectorDeviceName, IN BOOLEAN MailslotsSupported); +STDCALL +VOID +FsRtlReleaseFile ( + IN PFILE_OBJECT FileObject + ); + VOID STDCALL FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, @@ -566,6 +672,29 @@ FsRtlRemoveMcbEntry (IN PMCB Mcb, IN VBN Vbn, IN ULONG SectorCount); +STDCALL +PFSRTL_PER_STREAM_CONTEXT +FsRtlRemovePerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ); + +STDCALL +PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ +FsRtlRemovePerFileObjectContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ); + +STDCALL +VOID +FsRtlResetLargeMcb ( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized + ); + BOOLEAN STDCALL FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, @@ -579,6 +708,12 @@ FsRtlSyncVolumes ( DWORD Unknown2 ); +STDCALL +VOID +FsRtlTeardownPerStreamContexts ( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader + ); + VOID STDCALL FsRtlTruncateLargeMcb(IN PLARGE_MCB Mcb, IN LONGLONG Vbn); diff --git a/reactos/include/ddk/fstypes.h b/reactos/include/ddk/fstypes.h index ba198a1c0fb..366c83b897b 100644 --- a/reactos/include/ddk/fstypes.h +++ b/reactos/include/ddk/fstypes.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_DDK_FSTYPES_H #define __INCLUDE_DDK_FSTYPES_H -/* $Id: fstypes.h,v 1.15 2004/03/18 16:19:25 weiden Exp $ */ +/* $Id: fstypes.h,v 1.16 2004/06/23 00:41:55 ion Exp $ */ #ifndef __USE_W32API @@ -35,6 +35,90 @@ typedef VOID (*PUNLOCK_ROUTINE) ( IN PFILE_LOCK_INFO FileLockInfo ); +typedef +BOOLEAN (*PFILTER_REPORT_CHANGE) ( + IN PVOID NotifyContext, + IN PVOID FilterContext + ); + +typedef enum _FS_FILTER_SECTION_SYNC_TYPE { + SyncTypeOther = 0, + SyncTypeCreateSection +} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE; + +typedef union _FS_FILTER_PARAMETERS { + + /* AcquireForModifiedPageWriter */ + struct { + PLARGE_INTEGER EndingOffset; + } AcquireForModifiedPageWriter; + + /* ReleaseForModifiedPageWriter */ + struct { + PERESOURCE ResourceToRelease; + } ReleaseForModifiedPageWriter; + + /* AcquireForSectionSynchronization */ + struct { + FS_FILTER_SECTION_SYNC_TYPE SyncType; + ULONG PageProtection; + } AcquireForSectionSynchronization; + + /* Other */ + struct { + PVOID Argument1; + PVOID Argument2; + PVOID Argument3; + PVOID Argument4; + PVOID Argument5; + } Others; + +} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS; + +typedef struct _FS_FILTER_CALLBACK_DATA { + + ULONG SizeOfFsFilterCallbackData; + UCHAR Operation; + UCHAR Reserved; + struct _DEVICE_OBJECT *DeviceObject; + struct _FILE_OBJECT *FileObject; + FS_FILTER_PARAMETERS Parameters; + +} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA; + +typedef +NTSTATUS +(*PFS_FILTER_CALLBACK) ( + IN PFS_FILTER_CALLBACK_DATA Data, + OUT PVOID *CompletionContext + ); + +typedef +VOID +(*PFS_FILTER_COMPLETION_CALLBACK) ( + IN PFS_FILTER_CALLBACK_DATA Data, + IN NTSTATUS OperationStatus, + IN PVOID CompletionContext + ); + +typedef struct _FS_FILTER_CALLBACKS { + + ULONG SizeOfFsFilterCallbacks; + ULONG Reserved; + PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization; + PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization; + PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization; + PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization; + PFS_FILTER_CALLBACK PreAcquireForCcFlush; + PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush; + PFS_FILTER_CALLBACK PreReleaseForCcFlush; + PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush; + PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter; + PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter; + PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter; + PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter; + +} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS; typedef struct _FILE_LOCK { PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine; @@ -71,6 +155,21 @@ typedef struct _NOTIFY_SYNC } NOTIFY_SYNC, * PNOTIFY_SYNC; +typedef struct _FSRTL_ADVANCED_FCB_HEADER { + FSRTL_COMMON_FCB_HEADER Header; + PFAST_MUTEX FastMutex; + LIST_ENTRY FilterContexts; +} FSRTL_ADVANCED_FCB_HEADER; + +typedef FSRTL_ADVANCED_FCB_HEADER *PFSRTL_ADVANCED_FCB_HEADER; + +typedef struct _FSRTL_PER_STREAM_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; + typedef VOID (*POPLOCK_WAIT_COMPLETE_ROUTINE)(PVOID Context, PIRP Irp); From 76321fa02553b938596e8f5c2f76d871f5142f0c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 00:42:21 +0000 Subject: [PATCH 042/356] FSRTL Stubs Added. svn path=/trunk/; revision=9821 --- reactos/ntoskrnl/fs/mcb.c | 60 ++++++++++++++++++++++++- reactos/ntoskrnl/fs/mdl.c | 41 ++++++++++++++++- reactos/ntoskrnl/fs/notify.c | 63 +++++++++++++++++++++++++- reactos/ntoskrnl/fs/util.c | 86 +++++++++++++++++++++++++++++++++++- 4 files changed, 245 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/fs/mcb.c b/reactos/ntoskrnl/fs/mcb.c index 9eba3576d86..6afde133188 100644 --- a/reactos/ntoskrnl/fs/mcb.c +++ b/reactos/ntoskrnl/fs/mcb.c @@ -1,4 +1,4 @@ -/* $Id: mcb.c,v 1.11 2003/12/30 18:52:03 fireball Exp $ +/* $Id: mcb.c,v 1.12 2004/06/23 00:42:21 ion Exp $ * * reactos/ntoskrnl/fs/mcb.c * @@ -128,6 +128,51 @@ FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb, return(FALSE); } +/* + * @unimplemented + */ +STDCALL +BOOLEAN +FsRtlLookupLastLargeMcbEntryAndIndex ( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index + ) +{ + UNIMPLEMENTED; + return(FALSE); +} + +/* + * @unimplemented + */ +STDCALL +PFSRTL_PER_STREAM_CONTEXT +FsRtlLookupPerStreamContextInternal ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ) +{ + UNIMPLEMENTED; + return(FALSE); +} + +/* + * @unimplemented + */ +STDCALL +PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ +FsRtlLookupPerFileObjectContext ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ) +{ + UNIMPLEMENTED; + return(FALSE); +} /* * @unimplemented @@ -220,6 +265,19 @@ FsRtlRemoveMcbEntry (IN PMCB Mcb, } +/* + * @unimplemented + */ +STDCALL +VOID +FsRtlResetLargeMcb ( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized + ) +{ + UNIMPLEMENTED; +} + /* * @unimplemented */ diff --git a/reactos/ntoskrnl/fs/mdl.c b/reactos/ntoskrnl/fs/mdl.c index 7de60fc6db5..0855039fede 100644 --- a/reactos/ntoskrnl/fs/mdl.c +++ b/reactos/ntoskrnl/fs/mdl.c @@ -1,4 +1,4 @@ -/* $Id: mdl.c,v 1.5 2003/07/10 06:27:13 royce Exp $ +/* $Id: mdl.c,v 1.6 2004/06/23 00:42:21 ion Exp $ * * reactos/ntoskrnl/fs/mdl.c * @@ -7,6 +7,45 @@ #include #include +#include + +/* + * @unimplemented + */ +VOID +FsRtlIncrementCcFastReadResourceMiss( VOID ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +FsRtlIncrementCcFastReadNotPossible( VOID ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +FsRtlIncrementCcFastReadWait( VOID ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +FsRtlIncrementCcFastReadNoWait( VOID ) +{ + UNIMPLEMENTED; +} + + /********************************************************************** * NAME EXPORTED * FsRtlMdlRead@24 diff --git a/reactos/ntoskrnl/fs/notify.c b/reactos/ntoskrnl/fs/notify.c index 8188961044f..8f8f10e25a7 100644 --- a/reactos/ntoskrnl/fs/notify.c +++ b/reactos/ntoskrnl/fs/notify.c @@ -1,4 +1,4 @@ -/* $Id: notify.c,v 1.9 2003/12/30 18:52:03 fireball Exp $ +/* $Id: notify.c,v 1.10 2004/06/23 00:42:21 ion Exp $ * * reactos/ntoskrnl/fs/notify.c * @@ -6,6 +6,8 @@ #include #include +#define NDEBUG +#include /********************************************************************** * NAME EXPORTED @@ -46,6 +48,7 @@ FsRtlNotifyChangeDirectory ( } + /********************************************************************** * NAME EXPORTED * FsRtlNotifyCleanup@12 @@ -69,6 +72,50 @@ FsRtlNotifyCleanup ( } +/* + * @unimplemented + */ +STDCALL +VOID +FsRtlNotifyFilterChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +FsRtlNotifyFilterReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext, + IN PVOID FilterContext + ) +{ + UNIMPLEMENTED; +} + + /********************************************************************** * NAME EXPORTED * FsRtlNotifyFullChangeDirectory@40 @@ -261,4 +308,18 @@ FsRtlNotifyVolumeEvent ( return STATUS_NOT_IMPLEMENTED; } +/* + * + * @unimplemented + */ +STDCALL +NTSTATUS +FsRtlRegisterFileSystemFilterCallbacks ( + IN struct _DRIVER_OBJECT *FilterDriverObject, + IN PFS_FILTER_CALLBACKS Callbacks + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} /* EOF */ diff --git a/reactos/ntoskrnl/fs/util.c b/reactos/ntoskrnl/fs/util.c index f542730acfc..c5cdd1c2df1 100644 --- a/reactos/ntoskrnl/fs/util.c +++ b/reactos/ntoskrnl/fs/util.c @@ -1,4 +1,4 @@ -/* $Id: util.c,v 1.15 2003/08/03 15:53:45 ea Exp $ +/* $Id: util.c,v 1.16 2004/06/23 00:42:21 ion Exp $ * * reactos/ntoskrnl/fs/util.c * @@ -6,6 +6,8 @@ #include #include +#define NDEBUG +#include /********************************************************************** * NAME EXPORTED @@ -87,6 +89,18 @@ FsRtlIsNtstatusExpected ( : TRUE; } +/* + * @unimplemented + */ +ULONG +FsRtlIsPagingFile ( + IN PFILE_OBJECT FileObject + ) +{ + UNIMPLEMENTED; + return 0; +} + /********************************************************************** * NAME EXPORTED @@ -271,6 +285,48 @@ FsRtlGetFileSize ( return Status; } +/* + * @unimplemented + */ +STDCALL +NTSTATUS +FsRtlInsertPerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +PFSRTL_PER_STREAM_CONTEXT +FsRtlRemovePerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +FsRtlInsertPerFileObjectContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext, + IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} /********************************************************************** * NAME EXPORTED @@ -318,6 +374,21 @@ FsRtlPostStackOverflow ( } +/* + * @unimplemented + */ +STDCALL +PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ +FsRtlRemovePerFileObjectContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL + ) +{ + UNIMPLEMENTED; + return NULL; +} + /********************************************************************** * NAME EXPORTED * FsRtlSyncVolumes@12 @@ -344,5 +415,16 @@ FsRtlSyncVolumes ( } -/* EOF */ +/* + * @unimplemented + */ +STDCALL +VOID +FsRtlTeardownPerStreamContexts ( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader + ) +{ + UNIMPLEMENTED; +} +/* EOF */ From be03c322b3be171128e6ece936f83fb98f804a5f Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 00:49:22 +0000 Subject: [PATCH 043/356] DBG/KD Types and Prototypes Added. svn path=/trunk/; revision=9822 --- reactos/ntoskrnl/include/internal/dbg.h | 24 +++++++++++++++++++++++ reactos/ntoskrnl/include/internal/kd.h | 26 ++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/include/internal/dbg.h b/reactos/ntoskrnl/include/internal/dbg.h index 824d33688ff..bebb68081c7 100644 --- a/reactos/ntoskrnl/include/internal/dbg.h +++ b/reactos/ntoskrnl/include/internal/dbg.h @@ -4,6 +4,8 @@ #include #include +#define KdPrintEx(_x_) DbgPrintEx _x_ + NTSTATUS STDCALL LpcSendDebugMessagePort(PEPORT Port, PLPC_DBG_MESSAGE Message, @@ -15,4 +17,26 @@ DbgkForwardException(EXCEPTION_RECORD Er, ULONG FirstChance); BOOLEAN DbgShouldPrint(PCH Filename); +ULONG +__cdecl +DbgPrintReturnControlC( + PCH Format, + ... + ); + +STDCALL +NTSTATUS +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level + ); + +STDCALL +NTSTATUS +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State + ); + #endif /* __INCLUDE_INTERNAL_DBG_H */ diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h index f523d07504a..6eee2e87b5d 100644 --- a/reactos/ntoskrnl/include/internal/kd.h +++ b/reactos/ntoskrnl/include/internal/kd.h @@ -1,4 +1,4 @@ -/* $Id: kd.h,v 1.24 2004/03/11 21:50:23 dwelch Exp $ +/* $Id: kd.h,v 1.25 2004/06/23 00:49:22 ion Exp $ * * kernel debugger prototypes */ @@ -49,6 +49,30 @@ DebugLogInit(VOID); VOID DebugLogInit2(VOID); +VOID +STDCALL +KdDisableDebugger( + VOID + ); + +VOID +STDCALL +KdEnableDebugger( + VOID + ); + +NTSTATUS +STDCALL +KdPowerTransition( + ULONG PowerState + ); + +BOOLEAN +STDCALL +KeIsAttachedProcess( + VOID + ); + VOID KdInit1(VOID); From 657b2275c714891df7c3d97ef47cee050fff95e3 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 00:49:43 +0000 Subject: [PATCH 044/356] KD Stubs Added. svn path=/trunk/; revision=9823 --- reactos/ntoskrnl/kd/kdebug.c | 66 ++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/kd/kdebug.c b/reactos/ntoskrnl/kd/kdebug.c index 67cd35774ef..14affa237e8 100644 --- a/reactos/ntoskrnl/kd/kdebug.c +++ b/reactos/ntoskrnl/kd/kdebug.c @@ -1,4 +1,4 @@ -/* $Id: kdebug.c,v 1.51 2004/02/24 21:25:41 weiden Exp $ +/* $Id: kdebug.c,v 1.52 2004/06/23 00:49:43 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,6 +15,7 @@ #include #include #include "../dbg/kdb.h" +#include /* serial debug connection */ #define DEFAULT_DEBUG_PORT 2 /* COM2 */ @@ -31,11 +32,23 @@ BOOLEAN __declspec(dllexport) KdDebuggerEnabled = FALSE; /* EXPORTED */ +BOOLEAN +__declspec(dllexport) +KdEnteredDebugger = FALSE; /* EXPORTED */ + BOOLEAN __declspec(dllexport) KdDebuggerNotPresent = TRUE; /* EXPORTED */ +ULONG +__declspec(dllexport) +KiBugCheckData; /* EXPORTED */ +BOOLEAN +__declspec(dllexport) +KiEnableTimerWatchdog = FALSE; /* EXPORTED */ + + static BOOLEAN KdpBreakPending = FALSE; ULONG KdDebugState = KD_DEBUG_DISABLED; ULONG KdpPortIrq = 0; @@ -372,6 +385,43 @@ KdpPrintString(PANSI_STRING String) /* NTOSKRNL.KdPollBreakIn */ +/* + * @unimplemented + */ +VOID +STDCALL +KdDisableDebugger( + VOID + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +KdEnableDebugger ( + VOID + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +KeIsAttachedProcess( + VOID + ) +{ + UNIMPLEMENTED; + return FALSE; +} + /* * @implemented */ @@ -472,6 +522,18 @@ KdSystemDebugControl(ULONG Code) } } +/* + * @unimplemented + */ +NTSTATUS +STDCALL +KdPowerTransition( + ULONG PowerState + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} /* Support routines for the GDB stubs */ @@ -492,4 +554,4 @@ KdGetChar(VOID) return Value; } -/* EOF */ + /* EOF */ From 61d1eb4f34839e8a92dfa39f4416bd2bcaebe71b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 05:04:30 +0000 Subject: [PATCH 045/356] Added reason for copyimage fixme, declared as unimplemented, and added variable to only display dbgprint once. svn path=/trunk/; revision=9824 --- reactos/lib/user32/windows/bitmap.c | 77 +++++++++++++++++------------ 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/reactos/lib/user32/windows/bitmap.c b/reactos/lib/user32/windows/bitmap.c index 4e6338a1cd0..a75e2a66b33 100644 --- a/reactos/lib/user32/windows/bitmap.c +++ b/reactos/lib/user32/windows/bitmap.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmap.c,v 1.29 2004/04/13 00:06:50 weiden Exp $ +/* $Id: bitmap.c,v 1.30 2004/06/23 05:04:30 ion Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -42,7 +42,6 @@ HICON ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, in CURSORICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width, int height, int colors); CURSORICONDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir, int width, int height, int colors); - /* FUNCTIONS *****************************************************************/ /* @@ -661,39 +660,53 @@ LoadBitmapW(HINSTANCE hInstance, LPCWSTR lpBitmapName) /* - * @implemented + * @unimplemented */ HANDLE WINAPI CopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags) { - switch (type) - { - case IMAGE_BITMAP: - { - DbgPrint("WARNING: Incomplete implementation of CopyImage!\n"); - /* FIXME: support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE, - LR_COPYRETURNORG, LR_CREATEDIBSECTION, - and LR_MONOCHROME; */ - HBITMAP res; - BITMAP bm; + switch (type) + { + case IMAGE_BITMAP: + { + DbgPrint("WARNING: Incomplete implementation of CopyImage!\n"); + /* FIXME: support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE, + LR_COPYRETURNORG, LR_CREATEDIBSECTION, + and LR_MONOCHROME; */ + HBITMAP res; + BITMAP bm; - if (!GetObjectW(hnd, sizeof(bm), &bm)) return 0; - bm.bmBits = NULL; - if ((res = CreateBitmapIndirect(&bm))) - { - char *buf = HeapAlloc(GetProcessHeap(), 0, bm.bmWidthBytes * bm.bmHeight); - GetBitmapBits(hnd, bm.bmWidthBytes * bm.bmHeight, buf); - SetBitmapBits(res, bm.bmWidthBytes * bm.bmHeight, buf); - HeapFree(GetProcessHeap(), 0, buf); - } - return res; - } - case IMAGE_ICON: - DbgPrint("FIXME: CopyImage doesn't support IMAGE_ICON correctly!\n"); - return CopyIcon(hnd); - case IMAGE_CURSOR: - DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n"); - return CopyCursor(hnd); - } - return 0; + if (!GetObjectW(hnd, sizeof(bm), &bm)) return 0; + bm.bmBits = NULL; + if ((res = CreateBitmapIndirect(&bm))) + { + char *buf = HeapAlloc(GetProcessHeap(), 0, bm.bmWidthBytes * bm.bmHeight); + GetBitmapBits(hnd, bm.bmWidthBytes * bm.bmHeight, buf); + SetBitmapBits(res, bm.bmWidthBytes * bm.bmHeight, buf); + HeapFree(GetProcessHeap(), 0, buf); + } + return res; + } + case IMAGE_ICON: + { + static BOOL IconMsgDisplayed = FALSE; + /* FIXME: support loading the image as shared from an instance */ + if (!IconMsgDisplayed) { + DbgPrint("FIXME: CopyImage doesn't support IMAGE_ICON correctly!\n"); + IconMsgDisplayed = TRUE; + } + return CopyIcon(hnd); + } + case IMAGE_CURSOR: + { + static BOOL IconMsgDisplayed = FALSE; + /* FIXME: support loading the image as shared from an instance */ + if (!IconMsgDisplayed) { + DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n"); + IconMsgDisplayed = TRUE; + } + return CopyCursor(hnd); + } + } + return 0; } From 4d08b708f414916fe3e5e977f37f444f15223e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 23 Jun 2004 07:31:22 +0000 Subject: [PATCH 046/356] Handle RLE bottom-up dibs svn path=/trunk/; revision=9825 --- reactos/subsys/win32k/eng/surface.c | 101 +++++++++++++----------- reactos/subsys/win32k/objects/dib.c | 18 ++--- reactos/subsys/win32k/objects/objconv.c | 6 +- reactos/subsys/win32k/objects/text.c | 4 +- 4 files changed, 66 insertions(+), 63 deletions(-) diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index e95dc5de38a..db655e99051 100644 --- a/reactos/subsys/win32k/eng/surface.c +++ b/reactos/subsys/win32k/eng/surface.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: surface.c,v 1.40 2004/05/30 14:01:12 weiden Exp $ +/* $Id: surface.c,v 1.41 2004/06/23 07:31:22 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -317,57 +317,68 @@ EngCreateBitmap(IN SIZEL Size, PVOID UncompressedBits; ULONG UncompressedFormat; - NewBitmap = (PVOID)CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); - if( !ValidEngHandle( NewBitmap ) ) +if (Width < 0) __asm__("int $3\n"); + NewBitmap = (HBITMAP) CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); + if (! ValidEngHandle(NewBitmap)) return 0; SurfGDI->BitsPerPixel = BitsPerFormat(Format); - if (Format == BMF_4RLE) { - SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_4BPP)); - SurfObj->cjBits = SurfObj->lDelta * Size.cy; - UncompressedFormat = BMF_4BPP; + if (Format == BMF_4RLE) + { + SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_4BPP)); + SurfObj->cjBits = SurfObj->lDelta * Size.cy; + UncompressedFormat = BMF_4BPP; UncompressedBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0); - Decompress4bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta); - } else { - if (Format == BMF_8RLE) { - SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_8BPP)); - SurfObj->cjBits = SurfObj->lDelta * Size.cy; - UncompressedFormat = BMF_8BPP; - UncompressedBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0); - Decompress8bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta); - } else { - SurfObj->lDelta = Width; - SurfObj->cjBits = SurfObj->lDelta * Size.cy; - UncompressedBits = Bits; - UncompressedFormat = Format; - } - } - if(UncompressedBits!=NULL) - { - SurfObj->pvBits = UncompressedBits; - } else - { - if (SurfObj->cjBits == 0) - { - SurfObj->pvBits = NULL; + Decompress4bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta); } - else + else if (Format == BMF_8RLE) { - if(Flags & BMF_USERMEM) - { - SurfObj->pvBits = EngAllocUserMem(SurfObj->cjBits, 0); - } else { - if(Flags & BMF_NOZEROINIT) - { - SurfObj->pvBits = EngAllocMem(0, SurfObj->cjBits, 0); - } else { - SurfObj->pvBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0); - } - } + SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_8BPP)); + SurfObj->cjBits = SurfObj->lDelta * Size.cy; + UncompressedFormat = BMF_8BPP; + UncompressedBits = EngAllocMem(FL_ZERO_MEMORY, SurfObj->cjBits, 0); + Decompress8bpp(Size, (BYTE *)Bits, (BYTE *)UncompressedBits, SurfObj->lDelta); + } + else + { + SurfObj->lDelta = Width; + SurfObj->cjBits = Width * Size.cy; + UncompressedBits = Bits; + UncompressedFormat = Format; } - } - SurfObj->dhsurf = 0; // device managed surface + if (UncompressedBits != NULL) + { + SurfObj->pvBits = UncompressedBits; + } + else + { + if (SurfObj->cjBits == 0) + { + SurfObj->pvBits = NULL; + } + else + { + if (0 != (Flags & BMF_USERMEM)) + { + SurfObj->pvBits = EngAllocUserMem(SurfObj->cjBits, 0); + } + else + { + SurfObj->pvBits = EngAllocMem(0 != (Flags & BMF_NOZEROINIT) ? 0 : FL_ZERO_MEMORY, + SurfObj->cjBits, 0); + } + } + } + + + if (0 == (Flags & BMF_TOPDOWN)) + { + SurfObj->pvBits = (PVOID) ((PCHAR) UncompressedBits + SurfObj->cjBits - SurfObj->lDelta); + SurfObj->lDelta = - SurfObj->lDelta; + } + + SurfObj->dhsurf = 0; /* device managed surface */ SurfObj->hsurf = 0; SurfObj->dhpdev = NULL; SurfObj->hdev = NULL; @@ -380,7 +391,7 @@ EngCreateBitmap(IN SIZEL Size, InitializeFuncs(SurfGDI, UncompressedFormat); - // Use flags to determine bitmap type -- TOP_DOWN or whatever + /* Use flags to determine bitmap type -- TOP_DOWN or whatever */ return NewBitmap; } diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 2a0cea6435b..d966f1c31be 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.52 2004/06/22 20:08:17 gvg Exp $ + * $Id: dib.c,v 1.53 2004/06/23 07:31:22 gvg Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -132,8 +132,7 @@ IntSetDIBits( //RGBQUAD *lpRGB; HPALETTE DDB_Palette, DIB_Palette; ULONG DDB_Palette_Type, DIB_Palette_Type; - const BYTE *vBits = (const BYTE*)Bits; - INT scanDirection = 1, DIBWidth; + INT DIBWidth; // Check parameters if (!(bitmap = BITMAPOBJ_LockBitmap(hBitmap))) @@ -160,18 +159,11 @@ IntSetDIBits( // Determine width of DIB DIBWidth = DIB_GetDIBWidthBytes(SourceSize.cx, bmi->bmiHeader.biBitCount); - // Determine DIB Vertical Orientation - if(bmi->bmiHeader.biHeight > 0) - { - scanDirection = -1; - vBits += DIBWidth * bmi->bmiHeader.biHeight - DIBWidth; - } - SourceBitmap = EngCreateBitmap(SourceSize, - DIBWidth * scanDirection, + DIBWidth, BitmapFormat(bmi->bmiHeader.biBitCount, bmi->bmiHeader.biCompression), - 0, - (PVOID)vBits ); + 0 < bmi->bmiHeader.biHeight ? 0 : BMF_TOPDOWN, + (PVOID) Bits); SourceSurf = (SURFOBJ*)AccessUserObject((ULONG)SourceBitmap); // Destination palette obtained from the hDC diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c index e9f74bde459..0ffea950ff9 100644 --- a/reactos/subsys/win32k/objects/objconv.c +++ b/reactos/subsys/win32k/objects/objconv.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: objconv.c,v 1.18 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: objconv.c,v 1.19 2004/06/23 07:31:22 gvg Exp $ */ #include HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) @@ -31,13 +31,13 @@ HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) { BitmapHandle = EngCreateBitmap(Size, BitmapObj->dib->dsBm.bmWidthBytes, BitmapFormat(BitmapObj->dib->dsBm.bmBitsPixel, BI_RGB), - 0, BitmapObj->dib->dsBm.bmBits); + BMF_TOPDOWN, BitmapObj->dib->dsBm.bmBits); } else { BitmapHandle = EngCreateBitmap(Size, BitmapObj->bitmap.bmWidthBytes, BitmapFormat(BitmapObj->bitmap.bmBitsPixel, BI_RGB), - 0, BitmapObj->bitmap.bmBits); + BMF_TOPDOWN, BitmapObj->bitmap.bmBits); } if (NULL != BitmapHandle && NULL != GDIDevice) { diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index bd5731dd01f..90a50f4f0cb 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.97 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: text.c,v 1.98 2004/06/23 07:31:22 gvg Exp $ */ #include #include @@ -1865,7 +1865,7 @@ NtGdiExtTextOut( * limit the work of the transbitblt. */ - HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, 0, glyph->bitmap.buffer); + HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, BMF_TOPDOWN, glyph->bitmap.buffer); SourceGlyphSurf = (SURFOBJ*)AccessUserObject((ULONG) HSourceGlyph); /* From 80dcdcc7f613f7655258996ddd150a86d508fbb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 23 Jun 2004 07:40:45 +0000 Subject: [PATCH 047/356] Remove debugging statement svn path=/trunk/; revision=9826 --- reactos/subsys/win32k/eng/surface.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index db655e99051..658fcc0869d 100644 --- a/reactos/subsys/win32k/eng/surface.c +++ b/reactos/subsys/win32k/eng/surface.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: surface.c,v 1.41 2004/06/23 07:31:22 gvg Exp $ +/* $Id: surface.c,v 1.42 2004/06/23 07:40:45 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -317,7 +317,6 @@ EngCreateBitmap(IN SIZEL Size, PVOID UncompressedBits; ULONG UncompressedFormat; -if (Width < 0) __asm__("int $3\n"); NewBitmap = (HBITMAP) CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); if (! ValidEngHandle(NewBitmap)) return 0; From 411068e4cc2dfd960d04242cd3234f1e8bec3d7b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 23 Jun 2004 14:09:55 +0000 Subject: [PATCH 048/356] Implement the ability to write the bootcode to a floppy disk. svn path=/trunk/; revision=9829 --- reactos/subsys/system/usetup/bootsup.c | 386 ++++++++++++ reactos/subsys/system/usetup/bootsup.h | 16 +- reactos/subsys/system/usetup/usetup.c | 834 ++++++++----------------- 3 files changed, 658 insertions(+), 578 deletions(-) diff --git a/reactos/subsys/system/usetup/bootsup.c b/reactos/subsys/system/usetup/bootsup.c index 68fa979277e..6182e541500 100644 --- a/reactos/subsys/system/usetup/bootsup.c +++ b/reactos/subsys/system/usetup/bootsup.c @@ -29,6 +29,7 @@ #include "usetup.h" #include "inicache.h" +#include "filesup.h" #include "bootsup.h" #define NDEBUG @@ -1727,4 +1728,389 @@ UpdateBootIni(PWSTR BootIniPath, return(Status); } + +BOOLEAN +CheckInstallFatBootcodeToPartition(PUNICODE_STRING SystemRootPath) +{ + if (DoesFileExist(SystemRootPath->Buffer, L"ntldr") || + DoesFileExist(SystemRootPath->Buffer, L"boot.ini")) + { + return TRUE; + } + else if (DoesFileExist(SystemRootPath->Buffer, L"io.sys") || + DoesFileExist(SystemRootPath->Buffer, L"msdos.sys")) + { + return TRUE; + } + + return FALSE; +} + + +NTSTATUS +InstallFatBootcodeToPartition(PUNICODE_STRING SystemRootPath, + PUNICODE_STRING SourceRootPath, + PUNICODE_STRING DestinationArcPath, + UCHAR PartitionType) +{ + WCHAR SrcPath[MAX_PATH]; + WCHAR DstPath[MAX_PATH]; + NTSTATUS Status; + + /* FAT or FAT32 partition */ + DPRINT1("System path: '%wZ'\n", SystemRootPath); + + if (DoesFileExist(SystemRootPath->Buffer, L"ntldr") == TRUE || + DoesFileExist(SystemRootPath->Buffer, L"boot.ini") == TRUE) + { + /* Search root directory for 'ntldr' and 'boot.ini'. */ + DPRINT("Found Microsoft Windows NT/2000/XP boot loader\n"); + + /* Copy FreeLoader to the boot partition */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\freeldr.sys"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.sys"); + + DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath); + Status = SetupCopyFile(SrcPath, DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); + return Status; + } + + /* Create or update freeldr.ini */ + if (DoesFileExist(SystemRootPath->Buffer, L"freeldr.ini") == FALSE) + { + /* Create new 'freeldr.ini' */ + DPRINT1("Create new 'freeldr.ini'\n"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.ini"); + + Status = CreateFreeLoaderIniForReactos(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status); + return Status; + } + + /* Install new bootcode */ + if (PartitionType == PARTITION_FAT32 || + PartitionType == PARTITION_FAT32_XINT13) + { + /* Install FAT32 bootcode */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat32.bin"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\bootsect.ros"); + + DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, DstPath); + Status = InstallFat32BootCodeToFile(SrcPath, + DstPath, + SystemRootPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat32BootCodeToFile() failed (Status %lx)\n", Status); + return Status; + } + } + else + { + /* Install FAT16 bootcode */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat.bin"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\bootsect.ros"); + + DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath); + Status = InstallFat16BootCodeToFile(SrcPath, + DstPath, + SystemRootPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat16BootCodeToFile() failed (Status %lx)\n", Status); + return Status; + } + } + + /* Update 'boot.ini' */ + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\boot.ini"); + + DPRINT1("Update 'boot.ini': %S\n", DstPath); + Status = UpdateBootIni(DstPath, + L"C:\\bootsect.ros", + L"\"ReactOS\""); + if (!NT_SUCCESS(Status)) + { + DPRINT1("UpdateBootIni() failed (Status %lx)\n", Status); + return Status; + } + } + else + { + /* Update existing 'freeldr.ini' */ + DPRINT1("Update existing 'freeldr.ini'\n"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.ini"); + + Status = UpdateFreeLoaderIni(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status); + return Status; + } + } + } + else if (DoesFileExist(SystemRootPath->Buffer, L"io.sys") == TRUE || + DoesFileExist(SystemRootPath->Buffer, L"msdos.sys") == TRUE) + { + /* Search for root directory for 'io.sys' and 'msdos.sys'. */ + DPRINT1("Found Microsoft DOS or Windows 9x boot loader\n"); + + /* Copy FreeLoader to the boot partition */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\freeldr.sys"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.sys"); + + DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath); + Status = SetupCopyFile(SrcPath, DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); + return Status; + } + + /* Create or update 'freeldr.ini' */ + if (DoesFileExist(SystemRootPath->Buffer, L"freeldr.ini") == FALSE) + { + /* Create new 'freeldr.ini' */ + DPRINT1("Create new 'freeldr.ini'\n"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.ini"); + + Status = CreateFreeLoaderIniForDos(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CreateFreeLoaderIniForDos() failed (Status %lx)\n", Status); + return Status; + } + + /* Save current bootsector as 'BOOTSECT.DOS' */ + wcscpy(SrcPath, SystemRootPath->Buffer); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\bootsect.dos"); + + DPRINT1("Save bootsector: %S ==> %S\n", SrcPath, DstPath); + Status = SaveCurrentBootSector(SrcPath, + DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SaveCurrentBootSector() failed (Status %lx)\n", Status); + return Status; + } + + /* Install new bootsector */ + if (PartitionType == PARTITION_FAT32 || + PartitionType == PARTITION_FAT32_XINT13) + { + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat32.bin"); + + DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer); + Status = InstallFat32BootCodeToDisk(SrcPath, + SystemRootPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat32BootCodeToDisk() failed (Status %lx)\n", Status); + return Status; + } + } + else + { + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat.bin"); + + DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer); + Status = InstallFat16BootCodeToDisk(SrcPath, + SystemRootPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status); + return Status; + } + } + } + else + { + /* Update existing 'freeldr.ini' */ + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.ini"); + + Status = UpdateFreeLoaderIni(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status); + return Status; + } + } + } + else + { + /* No or unknown boot loader */ + DPRINT1("No or unknown boot loader found\n"); + + /* Copy FreeLoader to the boot partition */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\freeldr.sys"); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.sys"); + + DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath); + Status = SetupCopyFile(SrcPath, DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); + return Status; + } + + /* Create or update 'freeldr.ini' */ + if (DoesFileExist(SystemRootPath->Buffer, L"freeldr.ini") == FALSE) + { + /* Create new freeldr.ini */ + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.ini"); + + DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath); + Status = CreateFreeLoaderIniForReactos(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status); + return Status; + } + + /* Save current bootsector as 'BOOTSECT.OLD' */ + wcscpy(SrcPath, SystemRootPath->Buffer); + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\bootsect.old"); + + DPRINT1("Save bootsector: %S ==> %S\n", SrcPath, DstPath); + Status = SaveCurrentBootSector(SrcPath, + DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SaveCurrentBootSector() failed (Status %lx)\n", Status); + return Status; + } + + /* Install new bootsector */ + if (PartitionType == PARTITION_FAT32 || + PartitionType == PARTITION_FAT32_XINT13) + { + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat32.bin"); + + DPRINT("Install FAT32 bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer); + Status = InstallFat32BootCodeToDisk(SrcPath, + SystemRootPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat32BootCodeToDisk() failed (Status %lx)\n", Status); + return Status; + } + } + else + { + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat.bin"); + + DPRINT("Install FAT bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer); + Status = InstallFat16BootCodeToDisk(SrcPath, + SystemRootPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status); + return Status; + } + } + } + else + { + /* Update existing 'freeldr.ini' */ + wcscpy(DstPath, SystemRootPath->Buffer); + wcscat(DstPath, L"\\freeldr.ini"); + + Status = UpdateFreeLoaderIni(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status); + return Status; + } + } + } + + return STATUS_SUCCESS; +} + + +NTSTATUS +InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath, + PUNICODE_STRING DestinationArcPath) +{ + WCHAR SrcPath[MAX_PATH]; + WCHAR DstPath[MAX_PATH]; + NTSTATUS Status; + + /* Copy FreeLoader to the boot partition */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\freeldr.sys"); + + wcscat(DstPath, L"\\Device\\Floppy0\\freeldr.sys"); + + DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath); + Status = SetupCopyFile(SrcPath, DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); + return Status; + } + + /* Create new 'freeldr.ini' */ + wcscat(DstPath, L"\\Device\\Floppy0\\freeldr.ini"); + + DPRINT("Create new 'freeldr.ini'\n"); + Status = CreateFreeLoaderIniForReactos(DstPath, + DestinationArcPath->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status); + return Status; + } + + /* Install FAT12/16 boosector */ + wcscpy(SrcPath, SourceRootPath->Buffer); + wcscat(SrcPath, L"\\loader\\fat.bin"); + + wcscat(DstPath, L"\\Device\\Floppy0"); + + DPRINT("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath); + Status = InstallFat16BootCodeToDisk(SrcPath, + DstPath); + if (!NT_SUCCESS(Status)) + { + DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status); + return Status; + } + + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/subsys/system/usetup/bootsup.h b/reactos/subsys/system/usetup/bootsup.h index ad2993d5e89..f80bdc01908 100644 --- a/reactos/subsys/system/usetup/bootsup.h +++ b/reactos/subsys/system/usetup/bootsup.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bootsup.h,v 1.6 2003/08/19 15:54:47 ekohl Exp $ +/* $Id: bootsup.h,v 1.7 2004/06/23 14:09:55 ekohl Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: subsys/system/usetup/bootsup.h @@ -65,12 +65,24 @@ NTSTATUS InstallFat32BootCodeToDisk(PWSTR SrcPath, PWSTR RootPath); - NTSTATUS UpdateBootIni(PWSTR BootIniPath, PWSTR EntryName, PWSTR EntryValue); +BOOLEAN +CheckInstallFatBootcodeToPartition(PUNICODE_STRING SystemRootPath); + +NTSTATUS +InstallFatBootcodeToPartition(PUNICODE_STRING SystemRootPath, + PUNICODE_STRING SourceRootPath, + PUNICODE_STRING DestinationArcPath, + UCHAR PartitionType); + +NTSTATUS +InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath, + PUNICODE_STRING DestinationArcPath); + #endif /* __BOOTSUP_H__ */ /* EOF */ diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index 1e432d41504..b52cc8308a2 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -58,6 +58,8 @@ typedef enum _PAGE_NUMBER INTRO_PAGE, INSTALL_INTRO_PAGE, +// SCSI_CONTROLLER_PAGE, + DEVICE_SETTINGS_PAGE, COMPUTER_SETTINGS_PAGE, DISPLAY_SETTINGS_PAGE, @@ -78,6 +80,8 @@ typedef enum _PAGE_NUMBER FILE_COPY_PAGE, REGISTRY_PAGE, BOOT_LOADER_PAGE, + BOOT_LOADER_FLOPPY_PAGE, + BOOT_LOADER_HARDDISK_PAGE, REPAIR_INTRO_PAGE, @@ -435,8 +439,7 @@ CheckUnattendedSetup(VOID) RtlInitUnicodeString(&FileName, UnattendInfPath); - /* Load txtsetup.sif from install media. */ - + /* Load 'unattend.inf' from install media. */ Status = InfOpenFile(&UnattendInf, &FileName, &ErrorLine); @@ -835,9 +838,45 @@ InstallIntroPage(PINPUT_RECORD Ir) if (IsUnattendedSetup) { - return(SELECT_PARTITION_PAGE); + return SELECT_PARTITION_PAGE; } + while(TRUE) + { + ConInKey(Ir); + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + return QUIT_PAGE; + break; + } + else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return DEVICE_SETTINGS_PAGE; +// return SCSI_CONTROLLER_PAGE; + } + } + + return INSTALL_INTRO_PAGE; +} + + +#if 0 +static PAGE_NUMBER +ScsiControllerPage(PINPUT_RECORD Ir) +{ + SetTextXY(6, 8, "Setup detected the following mass storage devices:"); + + /* FIXME: print loaded mass storage driver descriptions */ +#if 0 + SetTextXY(8, 10, "TEST device"); +#endif + + + SetStatusText(" ENTER = Continue F3 = Quit"); + while(TRUE) { ConInKey(Ir); @@ -855,8 +894,9 @@ InstallIntroPage(PINPUT_RECORD Ir) } } - return INSTALL_INTRO_PAGE; + return SCSI_CONTROLLER_PAGE; } +#endif static PAGE_NUMBER @@ -3245,596 +3285,224 @@ RegistryPage(PINPUT_RECORD Ir) static PAGE_NUMBER BootLoaderPage(PINPUT_RECORD Ir) { - WCHAR SrcPath[MAX_PATH]; - WCHAR DstPath[MAX_PATH]; - NTSTATUS Status; - - SetTextXY(6, 8, "Installing the boot loader"); + UCHAR PartitionType; + BOOLEAN InstallOnFloppy; + USHORT Line = 12; SetStatusText(" Please wait..."); - if (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_ENTRY_UNUSED) + PartitionType = PartitionList->ActiveBootPartition->PartInfo[0].PartitionType; + + if (PartitionType == PARTITION_ENTRY_UNUSED) { - DPRINT1("Error: active partition invalid (unused)\n"); - PopupError("The active partition is unused (invalid).\n", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } + DPRINT("Error: active partition invalid (unused)\n"); + InstallOnFloppy = TRUE; } - - if (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == 0x0A) + else if (PartitionType == 0x0A) { /* OS/2 boot manager partition */ - DPRINT1("Found OS/2 boot manager partition\n"); - PopupError("Setup found an OS/2 boot manager partiton.\n" - "The OS/2 boot manager is not supported yet!", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } + DPRINT("Found OS/2 boot manager partition\n"); + InstallOnFloppy = TRUE; } - else if (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == 0x83) + else if (PartitionType == 0x83) { /* Linux ext2 partition */ - DPRINT1("Found Linux ext2 partition\n"); - PopupError("Setup found a Linux ext2 partiton.\n" - "Linux ext2 partitions are not supported yet!", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } + DPRINT("Found Linux ext2 partition\n"); + InstallOnFloppy = TRUE; } - else if (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_IFS) + else if (PartitionType == PARTITION_IFS) { /* NTFS partition */ - DPRINT1("Found NTFS partition\n"); - PopupError("Setup found an NTFS partiton.\n" - "NTFS partitions are not supported yet!", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } + DPRINT("Found NTFS partition\n"); + InstallOnFloppy = TRUE; } - else if ((PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT_12) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT_16) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_HUGE) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_XINT13) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13)) - { - /* FAT or FAT32 partition */ - DPRINT1("System path: '%wZ'\n", &SystemRootPath); - - if (DoesFileExist(SystemRootPath.Buffer, L"ntldr") == TRUE || - DoesFileExist(SystemRootPath.Buffer, L"boot.ini") == TRUE) + else if ((PartitionType == PARTITION_FAT_12) || + (PartitionType == PARTITION_FAT_16) || + (PartitionType == PARTITION_HUGE) || + (PartitionType == PARTITION_XINT13) || + (PartitionType == PARTITION_FAT32) || + (PartitionType == PARTITION_FAT32_XINT13)) { - /* Search root directory for 'ntldr' and 'boot.ini'. */ - DPRINT1("Found Microsoft Windows NT/2000/XP boot loader\n"); - - /* Copy FreeLoader to the boot partition */ - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\freeldr.sys"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.sys"); - - DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath); - Status = SetupCopyFile(SrcPath, DstPath); - if (!NT_SUCCESS(Status)) - { - DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); - PopupError("Setup failed to copy 'freeldr.sys'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Create or update freeldr.ini */ - if (DoesFileExist(SystemRootPath.Buffer, L"freeldr.ini") == FALSE) - { - /* Create new 'freeldr.ini' */ - DPRINT1("Create new 'freeldr.ini'\n"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.ini"); - - Status = CreateFreeLoaderIniForReactos(DstPath, - DestinationArcPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status); - PopupError("Setup failed to create 'freeldr.ini'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Install new bootcode */ - if ((PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13)) - { - /* Install FAT32 bootcode */ - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\fat32.bin"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\bootsect.ros"); - - DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, DstPath); - Status = InstallFat32BootCodeToFile(SrcPath, - DstPath, - SystemRootPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("InstallFat32BootCodeToFile() failed (Status %lx)\n", Status); - PopupError("Setup failed to install the FAT32 bootcode.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - else - { - /* Install FAT16 bootcode */ - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\fat.bin"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\bootsect.ros"); - - DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath); - Status = InstallFat16BootCodeToFile(SrcPath, - DstPath, - SystemRootPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("InstallFat16BootCodeToFile() failed (Status %lx)\n", Status); - PopupError("Setup failed to install the FAT bootcode.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - - /* Update 'boot.ini' */ - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\boot.ini"); - - DPRINT1("Update 'boot.ini': %S\n", DstPath); - Status = UpdateBootIni(DstPath, - L"C:\\bootsect.ros", - L"\"ReactOS\""); - if (!NT_SUCCESS(Status)) - { - DPRINT1("UpdateBootIni() failed (Status %lx)\n", Status); - PopupError("Setup failed to update \'boot.ini\'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - else - { - /* Update existing 'freeldr.ini' */ - DPRINT1("Update existing 'freeldr.ini'\n"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.ini"); - - Status = UpdateFreeLoaderIni(DstPath, - DestinationArcPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status); - PopupError("Setup failed to update 'freeldr.ini'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } + DPRINT("Found FAT partition\n"); + InstallOnFloppy = FALSE; } - else if (DoesFileExist(SystemRootPath.Buffer, L"io.sys") == TRUE || - DoesFileExist(SystemRootPath.Buffer, L"msdos.sys") == TRUE) - { - /* Search for root directory for 'io.sys' and 'msdos.sys'. */ - DPRINT1("Found Microsoft DOS or Windows 9x boot loader\n"); - - /* Copy FreeLoader to the boot partition */ - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\freeldr.sys"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.sys"); - - DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath); - Status = SetupCopyFile(SrcPath, DstPath); - if (!NT_SUCCESS(Status)) - { - DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); - PopupError("Setup failed to copy 'freeldr.sys'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Create or update 'freeldr.ini' */ - if (DoesFileExist(SystemRootPath.Buffer, L"freeldr.ini") == FALSE) - { - /* Create new 'freeldr.ini' */ - DPRINT1("Create new 'freeldr.ini'\n"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.ini"); - - Status = CreateFreeLoaderIniForDos(DstPath, - DestinationArcPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CreateFreeLoaderIniForDos() failed (Status %lx)\n", Status); - PopupError("Setup failed to create 'freeldr.ini'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Save current bootsector as 'BOOTSECT.DOS' */ - wcscpy(SrcPath, SystemRootPath.Buffer); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\bootsect.dos"); - - DPRINT1("Save bootsector: %S ==> %S\n", SrcPath, DstPath); - Status = SaveCurrentBootSector(SrcPath, - DstPath); - if (!NT_SUCCESS(Status)) - { - DPRINT1("SaveCurrentBootSector() failed (Status %lx)\n", Status); - PopupError("Setup failed to save the current bootsector.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Install new bootsector */ - if ((PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13)) - { - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\fat32.bin"); - - DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, SystemRootPath.Buffer); - Status = InstallFat32BootCodeToDisk(SrcPath, - SystemRootPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("InstallFat32BootCodeToDisk() failed (Status %lx)\n", Status); - PopupError("Setup failed to install the FAT32 bootcode.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - else - { - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\fat.bin"); - - DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, SystemRootPath.Buffer); - Status = InstallFat16BootCodeToDisk(SrcPath, - SystemRootPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status); - PopupError("Setup failed to install the FAT bootcode.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - } - else - { - /* Update existing 'freeldr.ini' */ - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.ini"); - - Status = UpdateFreeLoaderIni(DstPath, - DestinationArcPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status); - PopupError("Setup failed to update 'freeldr.ini'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - } - else - { - /* No or unknown boot loader */ - DPRINT1("No or unknown boot loader found\n"); - - /* Copy FreeLoader to the boot partition */ - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\freeldr.sys"); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.sys"); - - DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath); - Status = SetupCopyFile(SrcPath, DstPath); - if (!NT_SUCCESS(Status)) - { - DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status); - PopupError("Setup failed to copy 'freeldr.sys'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Create or update 'freeldr.ini' */ - if (DoesFileExist(SystemRootPath.Buffer, L"freeldr.ini") == FALSE) - { - /* Create new freeldr.ini */ - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.ini"); - - DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath); - Status = CreateFreeLoaderIniForReactos(DstPath, - DestinationArcPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status); - PopupError("Setup failed to create \'freeldr.ini\'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Save current bootsector as 'BOOTSECT.OLD' */ - wcscpy(SrcPath, SystemRootPath.Buffer); - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\bootsect.old"); - - DPRINT1("Save bootsector: %S ==> %S\n", SrcPath, DstPath); - Status = SaveCurrentBootSector(SrcPath, - DstPath); - if (!NT_SUCCESS(Status)) - { - DPRINT1("SaveCurrentBootSector() failed (Status %lx)\n", Status); - PopupError("Setup failed save the current bootsector.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - - /* Install new bootsector */ - if ((PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32) || - (PartitionList->ActiveBootPartition->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13)) - { - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\fat32.bin"); - - DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, SystemRootPath.Buffer); - Status = InstallFat32BootCodeToDisk(SrcPath, - SystemRootPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("InstallFat32BootCodeToDisk() failed (Status %lx)\n", Status); - PopupError("Setup failed to install the FAT32 bootcode.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - else - { - wcscpy(SrcPath, SourceRootPath.Buffer); - wcscat(SrcPath, L"\\loader\\fat.bin"); - - DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, SystemRootPath.Buffer); - Status = InstallFat16BootCodeToDisk(SrcPath, - SystemRootPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status); - PopupError("Setup failed to install the FAT bootcode.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - } - else - { - /* Update existing 'freeldr.ini' */ - wcscpy(DstPath, SystemRootPath.Buffer); - wcscat(DstPath, L"\\freeldr.ini"); - - Status = UpdateFreeLoaderIni(DstPath, - DestinationArcPath.Buffer); - if (!NT_SUCCESS(Status)) - { - DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status); - PopupError("Setup failed to update 'freeldr.ini'.", - "ENTER = Reboot computer"); - - while(TRUE) - { - ConInKey(Ir); - - if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return QUIT_PAGE; - } - } - } - } - } - } else { /* Unknown partition */ - DPRINT1("Unknown partition found\n"); - PopupError("Setup found an unknown partiton type.\n" - "This partition type is not supported!", + DPRINT("Unknown partition found\n"); + InstallOnFloppy = TRUE; + } + + if (InstallOnFloppy == TRUE) + { + return BOOT_LOADER_FLOPPY_PAGE; + } + + SetTextXY(6, 8, "Setup is installing the boot loader"); + + SetTextXY(8, 12, "Install bootloader on the harddisk (MBR)."); + SetTextXY(8, 13, "Install bootloader on a floppy disk."); + InvertTextXY (8, Line, 48, 1); + + SetStatusText(" ENTER = Continue F3 = Quit"); + + while(TRUE) + { + ConInKey(Ir); + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + NormalTextXY (8, Line, 48, 1); + if (Line == 12) + Line = 13; + else if (Line == 13) + Line = 12; +#if 0 + else + Line++; +#endif + InvertTextXY (8, Line, 48, 1); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + NormalTextXY (8, Line, 48, 1); + if (Line == 12) + Line = 13; + else if (Line == 13) + Line = 12; +#if 0 + else + Line--; +#endif + InvertTextXY (8, Line, 48, 1); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + return QUIT_PAGE; + break; + } + else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + if (Line == 12) + { + return BOOT_LOADER_HARDDISK_PAGE; + } + else if (Line == 13) + { + return BOOT_LOADER_FLOPPY_PAGE; + } + + return BOOT_LOADER_PAGE; + } + + } + + return BOOT_LOADER_PAGE; +} + + +static PAGE_NUMBER +BootLoaderFloppyPage(PINPUT_RECORD Ir) +{ + NTSTATUS Status; + + SetTextXY(6, 8, "Setup cannot install the bootloader on your computers"); + SetTextXY(6, 9, "harddisk"); + + SetTextXY(6, 13, "Please insert a formatted floppy disk in drive A: and"); + SetTextXY(6, 14, "press ENTER."); + + + SetStatusText(" ENTER = Continue F3 = Quit"); +// SetStatusText(" Please wait..."); + + while(TRUE) + { + ConInKey(Ir); + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + return QUIT_PAGE; + break; + } + else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + if (DoesFileExist(L"\\Device\\Floppy0", L"\\") == FALSE) + { + PopupError("No disk in drive A:.", + "ENTER = Continue"); + while(TRUE) + { + ConInKey(Ir); + + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + break; + } + + return BOOT_LOADER_FLOPPY_PAGE; + } + + Status = InstallFatBootcodeToFloppy(&SourceRootPath, + &DestinationArcPath); + if (!NT_SUCCESS(Status)) + { + /* Print error message */ + return BOOT_LOADER_FLOPPY_PAGE; + } + + return SUCCESS_PAGE; + } + } + + return BOOT_LOADER_FLOPPY_PAGE; +} + + +static PAGE_NUMBER +BootLoaderHarddiskPage(PINPUT_RECORD Ir) +{ + UCHAR PartitionType; + NTSTATUS Status; + + PartitionType = PartitionList->ActiveBootPartition->PartInfo[0].PartitionType; + if ((PartitionType == PARTITION_FAT_12) || + (PartitionType == PARTITION_FAT_16) || + (PartitionType == PARTITION_HUGE) || + (PartitionType == PARTITION_XINT13) || + (PartitionType == PARTITION_FAT32) || + (PartitionType == PARTITION_FAT32_XINT13)) + { + Status = InstallFatBootcodeToPartition(&SystemRootPath, + &SourceRootPath, + &DestinationArcPath, + PartitionType); + if (!NT_SUCCESS(Status)) + { + PopupError("Setup failed to install the FAT bootcode on the system partition.", + "ENTER = Reboot computer"); + + while(TRUE) + { + ConInKey(Ir); + + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return QUIT_PAGE; + } + } + } + + return SUCCESS_PAGE; + } + else + { + PopupError("failed to install FAT bootcode on the system partition.", "ENTER = Reboot computer"); while(TRUE) @@ -3848,7 +3516,7 @@ BootLoaderPage(PINPUT_RECORD Ir) } } - return SUCCESS_PAGE; + return BOOT_LOADER_HARDDISK_PAGE; } @@ -4028,6 +3696,12 @@ NtProcessStartup(PPEB Peb) Page = InstallIntroPage(&Ir); break; +#if 0 + case SCSI_CONTROLLER_PAGE: + Page = ScsiControllerPage(&Ir); + break; +#endif + #if 0 case OEM_DRIVER_PAGE: Page = OemDriverPage(&Ir); @@ -4102,6 +3776,14 @@ NtProcessStartup(PPEB Peb) Page = BootLoaderPage(&Ir); break; + case BOOT_LOADER_FLOPPY_PAGE: + Page = BootLoaderFloppyPage(&Ir); + break; + + case BOOT_LOADER_HARDDISK_PAGE: + Page = BootLoaderHarddiskPage(&Ir); + break; + /* Repair pages */ case REPAIR_INTRO_PAGE: From 94c3ee3a6a901e1b24171226b89b4db79e2d4553 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 23 Jun 2004 15:30:21 +0000 Subject: [PATCH 049/356] little fixes svn path=/trunk/; revision=9830 --- reactos/subsys/win32k/objects/color.c | 4 ++-- reactos/subsys/win32k/objects/text.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 9bf96aa14a4..0e53f752d98 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.42 2004/05/22 22:07:42 navaraf Exp $ */ +/* $Id: color.c,v 1.43 2004/06/23 15:30:20 weiden Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -519,7 +519,7 @@ NtGdiUpdateColors(HDC hDC) { HWND hWnd; - hWnd = IntWindowFromDC(hDC); + hWnd = (HWND)NtUserCallOneParam((DWORD)hDC, ONEPARAM_ROUTINE_WINDOWFROMDC); if (hWnd == NULL) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 90a50f4f0cb..d9fe42fa4b4 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.98 2004/06/23 07:31:22 gvg Exp $ */ +/* $Id: text.c,v 1.99 2004/06/23 15:30:21 weiden Exp $ */ #include #include @@ -284,7 +284,7 @@ IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) if (!NT_SUCCESS(Status)) { - DPRINT("Could not font file: %wZ\n", Filename); + DPRINT("Could not font file: %wZ\n", FileName); NtGdiDeleteObject(NewFont); return 0; } From a1c2b75227862665a327bedd9b35789386e7d77f Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 23 Jun 2004 15:38:07 +0000 Subject: [PATCH 050/356] don't use the pointer if it's NULL... svn path=/trunk/; revision=9831 --- reactos/subsys/win32k/ntuser/focus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/focus.c b/reactos/subsys/win32k/ntuser/focus.c index e833cc1040f..806dd7df226 100644 --- a/reactos/subsys/win32k/ntuser/focus.c +++ b/reactos/subsys/win32k/ntuser/focus.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: focus.c,v 1.23 2004/06/20 22:25:14 gvg Exp $ + * $Id: focus.c,v 1.24 2004/06/23 15:38:07 weiden Exp $ */ #include @@ -452,7 +452,7 @@ NtUserSetFocus(HWND hWnd) if (Window->Style & (WS_MINIMIZE | WS_DISABLED)) { IntReleaseWindowObject(Window); - return ThreadQueue ? 0 : ThreadQueue->FocusWindow; + return (ThreadQueue ? ThreadQueue->FocusWindow : 0); } if (Window->MessageQueue != ThreadQueue) From 7ebb752f567c776f2c59b6c32c05ccceee2fc5d7 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 23 Jun 2004 19:32:17 +0000 Subject: [PATCH 051/356] fixed handling of variable arguments and free memory allocated by FormatMessage(). Thanks to Michael Fritscher for spotting this bug. svn path=/trunk/; revision=9833 --- reactos/subsys/system/cmd/console.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/system/cmd/console.c b/reactos/subsys/system/cmd/console.c index 33e925092da..e5e22648284 100644 --- a/reactos/subsys/system/cmd/console.c +++ b/reactos/subsys/system/cmd/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.6 2004/06/21 18:57:22 weiden Exp $ +/* $Id: console.c,v 1.7 2004/06/23 19:32:17 weiden Exp $ * * CONSOLE.C - console input/output functions. * @@ -225,17 +225,29 @@ VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) VOID ConOutFormatMessage (DWORD MessageId, ...) { - DWORD temp; + DWORD ret; LPTSTR text; va_list arg_ptr; - temp = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + + va_start (arg_ptr, MessageId); + ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, MessageId, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &text, 0, &arg_ptr); - ConErrPrintf (text); + + va_end (arg_ptr); + if(ret > 0) + { + ConErrPuts (text); + LocalFree(text); + } + else + { + ConErrPrintf (_T("Unknown error: %d\n"), MessageId); + } } VOID ConOutPrintf (LPTSTR szFormat, ...) From 814c815bc1d3214406f37b2672529c4230d4c918 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 19:42:14 +0000 Subject: [PATCH 052/356] Fixed KeRaiseUserException to return old EIP. svn path=/trunk/; revision=9834 --- reactos/ntoskrnl/include/internal/ke.h | 2 +- reactos/ntoskrnl/ke/i386/exp.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 0069df63d02..67a8cd61faf 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -79,7 +79,7 @@ KiDeliverNormalApc(VOID); BOOLEAN STDCALL KeRemoveQueueApc (PKAPC Apc); PLIST_ENTRY STDCALL KeRundownQueue(IN PKQUEUE Queue); -VOID STDCALL +NTSTATUS STDCALL KeRaiseUserException(NTSTATUS ExceptionCode); diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index f034a19a918..58e237b20e7 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -746,14 +746,16 @@ KeInitExceptions(VOID) * @implemented */ -VOID STDCALL +NTSTATUS STDCALL KeRaiseUserException(IN NTSTATUS ExceptionCode) { /* FIXME: This needs SEH */ + ULONG OldEip; + PKTHREAD Thread = KeGetCurrentThread(); - PKTHREAD Thread = KeGetCurrentThread(); - - ProbeForWrite(&Thread->Teb->ExceptionCode, sizeof(NTSTATUS), sizeof(NTSTATUS)); /* NT doesn't check this -- bad? */ - Thread->TrapFrame->Eip = (ULONG_PTR)LdrpGetSystemDllRaiseExceptionDispatcher(); - Thread->Teb->ExceptionCode = ExceptionCode; + ProbeForWrite(&Thread->Teb->ExceptionCode, sizeof(NTSTATUS), sizeof(NTSTATUS)); /* NT doesn't check this -- bad? */ + OldEip = Thread->TrapFrame->Eip; + Thread->TrapFrame->Eip = (ULONG_PTR)LdrpGetSystemDllRaiseExceptionDispatcher(); + Thread->Teb->ExceptionCode = ExceptionCode; + return((NTSTATUS)OldEip); } From 96523ea31421031e0ce64ba45692c37d648f9c50 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 19:48:39 +0000 Subject: [PATCH 053/356] Fixed KeRaiseUserException to return old EIP. svn path=/trunk/; revision=9835 --- reactos/include/ddk/kefuncs.h | 2 +- reactos/ntoskrnl/include/internal/ke.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index f6f7014cb03..a7aa8ca40bc 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -262,7 +262,7 @@ KeRaiseIrqlToDpcLevel ( * ARGUMENTS: * ExceptionCode = Status code of the exception */ -VOID +NTSTATUS STDCALL KeRaiseUserException ( IN NTSTATUS ExceptionCode diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 67a8cd61faf..c474b9f1f42 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -80,8 +80,7 @@ BOOLEAN STDCALL KeRemoveQueueApc (PKAPC Apc); PLIST_ENTRY STDCALL KeRundownQueue(IN PKQUEUE Queue); NTSTATUS STDCALL -KeRaiseUserException(NTSTATUS ExceptionCode); - +KeRaiseUserException(IN NTSTATUS ExceptionCode); /* INITIALIZATION FUNCTIONS *************************************************/ From cd97bd13dae6306f3d2c03920a46fedd2d1bc367 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 19:48:53 +0000 Subject: [PATCH 054/356] Added Ldr Stub Prototypes svn path=/trunk/; revision=9836 --- reactos/include/ddk/ldrfuncs.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/reactos/include/ddk/ldrfuncs.h b/reactos/include/ddk/ldrfuncs.h index 229d36e8c9c..f1988e2d234 100644 --- a/reactos/include/ddk/ldrfuncs.h +++ b/reactos/include/ddk/ldrfuncs.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_DDK_LDRFUNCS_H #define __INCLUDE_DDK_LDRFUNCS_H -/* $Id: ldrfuncs.h,v 1.5 2002/09/08 10:47:44 chorns Exp $ */ +/* $Id: ldrfuncs.h,v 1.6 2004/06/23 19:48:53 ion Exp $ */ NTSTATUS STDCALL LdrAccessResource(IN PVOID BaseAddress, @@ -14,4 +14,17 @@ LdrFindResource_U(IN PVOID BaseAddress, IN ULONG Level, OUT PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry); +NTSTATUS STDCALL +LdrFindResourceDirectory_U( IN PVOID BaseAddress, + IN PLDR_RESOURCE_INFO ResourceInfo, + IN ULONG Level, + OUT PIMAGE_RESOURCE_DIRECTORY *ResourceDirectory); + +NTSTATUS STDCALL +LdrEnumResources(IN PVOID BaseAddress, + IN PLDR_RESOURCE_INFO ResourceInfo, + IN ULONG Level, + IN OUT PULONG ResourceCount, + OUT PVOID Resources OPTIONAL); + #endif /* __INCLUDE_DDK_LDRFUNCS_H */ From 517e96313d8fdcf787207f81b6582650fef3b124 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 19:49:11 +0000 Subject: [PATCH 055/356] Added Ldr Stubs svn path=/trunk/; revision=9837 --- reactos/ntoskrnl/ldr/resource.c | 37 ++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ldr/resource.c b/reactos/ntoskrnl/ldr/resource.c index b2fe198bcc5..f67e5e3828c 100644 --- a/reactos/ntoskrnl/ldr/resource.c +++ b/reactos/ntoskrnl/ldr/resource.c @@ -1,4 +1,4 @@ -/* $Id: resource.c,v 1.6 2003/08/22 20:00:39 weiden Exp $ +/* $Id: resource.c,v 1.7 2004/06/23 19:49:11 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -190,4 +190,39 @@ found:; return Status; } +/* STUBS */ + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +LdrFindResourceDirectory_U( + IN PVOID BaseAddress, + IN PLDR_RESOURCE_INFO ResourceInfo, + IN ULONG Level, + OUT PIMAGE_RESOURCE_DIRECTORY *ResourceDirectory +) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +LdrEnumResources( + IN PVOID BaseAddress, + IN PLDR_RESOURCE_INFO ResourceInfo, + IN ULONG Level, + IN OUT PULONG ResourceCount, + OUT PVOID Resources OPTIONAL +) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ From 83f7c0f1265d72c0d2e4c530478364c8548f0fd9 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 19:49:21 +0000 Subject: [PATCH 056/356] Added Lpc Stubs svn path=/trunk/; revision=9838 --- reactos/ntoskrnl/lpc/reply.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/lpc/reply.c b/reactos/ntoskrnl/lpc/reply.c index 4db58f2785d..0de25529c3c 100644 --- a/reactos/ntoskrnl/lpc/reply.c +++ b/reactos/ntoskrnl/lpc/reply.c @@ -1,4 +1,4 @@ -/* $Id: reply.c,v 1.19 2003/08/07 11:47:33 silverblade Exp $ +/* $Id: reply.c,v 1.20 2004/06/23 19:49:21 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -335,5 +335,19 @@ NtReplyWaitReplyPort (HANDLE PortHandle, return(STATUS_NOT_IMPLEMENTED); } +/* + * @unimplemented + */ +NTSTATUS +STDCALL +LpcRequestWaitReplyPort ( + IN PEPORT Port, + IN PLPC_MESSAGE LpcMessageRequest, + OUT PLPC_MESSAGE LpcMessageReply + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} /* EOF */ From b8b9f846b6820130701fef77a70bbf8c22c7af36 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 23 Jun 2004 20:23:59 +0000 Subject: [PATCH 057/356] - Improved removable media support. svn path=/trunk/; revision=9839 --- reactos/drivers/fs/vfat/create.c | 81 ++++++++++++++------------------ reactos/drivers/fs/vfat/fsctl.c | 63 ++++++++++++++++++++----- reactos/drivers/fs/vfat/vfat.h | 6 ++- 3 files changed, 92 insertions(+), 58 deletions(-) diff --git a/reactos/drivers/fs/vfat/create.c b/reactos/drivers/fs/vfat/create.c index 2204b4b9273..1f95922f578 100644 --- a/reactos/drivers/fs/vfat/create.c +++ b/reactos/drivers/fs/vfat/create.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: create.c,v 1.67 2004/03/31 03:30:36 jimtabor Exp $ +/* $Id: create.c,v 1.68 2004/06/23 20:23:59 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: drivers/fs/vfat/create.c @@ -338,11 +338,11 @@ VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, { PVFATFCB ParentFcb; PVFATFCB Fcb; - DISK_GEOMETRY DiskGeometry; NTSTATUS Status; UNICODE_STRING NameU; WCHAR Name[MAX_PATH]; ULONG Size; + ULONG MediaChangeCount; // PDEVICE_OBJECT DeviceObject = DeviceExt->StorageDevice->Vpb->DeviceObject; @@ -370,50 +370,41 @@ VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, DPRINT ("PathName to open: '%wZ'\n", FileNameU); - Size = sizeof(DISK_GEOMETRY); - Status = VfatBlockDeviceIoControl(DeviceExt->StorageDevice, - IOCTL_DISK_GET_DRIVE_GEOMETRY, - NULL, - 0, - &DiskGeometry, - &Size, - FALSE); - - if (DiskGeometry.MediaType != FixedMedia ) - { - - Status = VfatBlockDeviceIoControl (DeviceExt->StorageDevice, - IOCTL_DISK_CHECK_VERIFY, - NULL, - 0, - NULL, - 0, - TRUE); - - if (Status == STATUS_VERIFY_REQUIRED) - { - PDEVICE_OBJECT DeviceToVerify; - - DPRINT ("Media change detected!\n"); - DPRINT ("Device %p\n", DeviceObject); - - DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); - IoSetDeviceToVerify (PsGetCurrentThread (), - NULL); - - Status = IoVerifyVolume (DeviceToVerify, - FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT ("Status %lx\n", Status); - return Status; - } - } - else if (!NT_SUCCESS(Status)) + if (!DeviceExt->FatInfo.FixedMedia) { - DPRINT ("Status %lx\n", Status); - return Status; - } + Size = sizeof(ULONG); + Status = VfatBlockDeviceIoControl (DeviceExt->StorageDevice, + IOCTL_DISK_CHECK_VERIFY, + NULL, + 0, + &MediaChangeCount, + &Size, + FALSE); + + if (Status == STATUS_VERIFY_REQUIRED || MediaChangeCount != DeviceExt->MediaChangeCount) + { + PDEVICE_OBJECT DeviceToVerify; + + DPRINT ("Media change detected!\n"); + DPRINT ("Device %p\n", DeviceExt->StorageDevice); + + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + IoSetDeviceToVerify (PsGetCurrentThread (), + NULL); + + Status = IoVerifyVolume (DeviceToVerify, + FALSE); + if (!NT_SUCCESS(Status)) + { + DPRINT ("Status %lx\n", Status); + return Status; + } + } + else if (!NT_SUCCESS(Status)) + { + DPRINT ("Status %lx\n", Status); + return Status; + } } diff --git a/reactos/drivers/fs/vfat/fsctl.c b/reactos/drivers/fs/vfat/fsctl.c index 5bd8bc9dcda..890595b35f9 100644 --- a/reactos/drivers/fs/vfat/fsctl.c +++ b/reactos/drivers/fs/vfat/fsctl.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: fsctl.c,v 1.31 2004/06/20 09:52:58 navaraf Exp $ +/* $Id: fsctl.c,v 1.32 2004/06/23 20:23:59 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -31,7 +31,7 @@ #include #include -//#define NDEBUG +#define NDEBUG #include #include "vfat.h" @@ -74,6 +74,7 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, DPRINT("VfatBlockDeviceIoControl faild (%x)\n", Status); return Status; } + FatInfo.FixedMedia = DiskGeometry.MediaType == FixedMedia ? TRUE : FALSE; if (DiskGeometry.MediaType == FixedMedia || DiskGeometry.MediaType == RemovableMedia) { // We have found a hard disk @@ -274,6 +275,7 @@ VfatMountDevice(PDEVICE_EXTENSION DeviceExt, { NTSTATUS Status; BOOLEAN RecognizedFS; + ULONG Size; DPRINT("Mounting VFAT device...\n"); @@ -284,6 +286,22 @@ VfatMountDevice(PDEVICE_EXTENSION DeviceExt, } DPRINT("MountVfatdev %d, PAGE_SIZE = %d\n", DeviceExt->FatInfo.BytesPerCluster, PAGE_SIZE); + if (!DeviceExt->FatInfo.FixedMedia) + { + Size = sizeof(ULONG); + Status = VfatBlockDeviceIoControl (DeviceToMount, + IOCTL_DISK_CHECK_VERIFY, + NULL, + 0, + &DeviceExt->MediaChangeCount, + &Size, + FALSE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + return(STATUS_SUCCESS); } @@ -478,29 +496,50 @@ VfatVerify (PVFAT_IRP_CONTEXT IrpContext) { PDEVICE_OBJECT DeviceToVerify; NTSTATUS Status = STATUS_SUCCESS; - + FATINFO FatInfo; + BOOLEAN RecognizedFS; + ULONG Size; + PDEVICE_EXTENSION DeviceExt = IrpContext->DeviceExt; DPRINT("VfatVerify(IrpContext %x)\n", IrpContext); DeviceToVerify = IrpContext->Stack->Parameters.VerifyVolume.DeviceObject; + Size = sizeof(ULONG); Status = VfatBlockDeviceIoControl(DeviceToVerify, IOCTL_DISK_CHECK_VERIFY, NULL, 0, - NULL, - NULL, + &DeviceExt->MediaChangeCount, + &Size, FALSE); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status) && Status != STATUS_VERIFY_REQUIRED) { DPRINT("VfatBlockDeviceIoControl() failed (Status %lx)\n", Status); - - /* FIXME: Compare volume label */ - - DPRINT(" returning STATUS_WRONG_VOLUME\n"); - Status = STATUS_WRONG_VOLUME; } - DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME; + else + { + Status = VfatHasFileSystem(DeviceToVerify, &RecognizedFS, &FatInfo); + if (!NT_SUCCESS(Status) || RecognizedFS == FALSE) + { + Status = STATUS_WRONG_VOLUME; + } + else if (sizeof(FATINFO) == RtlCompareMemory(&FatInfo, &DeviceExt->FatInfo, sizeof(FATINFO))) + { + /* + * FIXME: + * Preformated floppy disks have very often a serial number of 0000:0000. + * We should calculate a crc sum over the sectors from the root directory as secondary volume number. + * Each write to the root directory must update this crc sum. + */ + + DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME; + } + else + { + Status = STATUS_WRONG_VOLUME; + } + } return Status; } diff --git a/reactos/drivers/fs/vfat/vfat.h b/reactos/drivers/fs/vfat/vfat.h index 63a19ef5365..0eb9b0d53a4 100644 --- a/reactos/drivers/fs/vfat/vfat.h +++ b/reactos/drivers/fs/vfat/vfat.h @@ -1,4 +1,4 @@ -/* $Id: vfat.h,v 1.63 2004/05/15 23:00:02 hbirr Exp $ */ +/* $Id: vfat.h,v 1.64 2004/06/23 20:23:59 hbirr Exp $ */ #include @@ -129,6 +129,7 @@ typedef struct ULONG NumberOfClusters; ULONG FatType; ULONG Sectors; + BOOL FixedMedia; } FATINFO, *PFATINFO; struct _VFATFCB; @@ -162,6 +163,9 @@ typedef struct struct _VFATFCB * VolumeFcb; LIST_ENTRY VolumeListEntry; + + ULONG MediaChangeCount; + } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB; typedef struct From 62a4509b5fba9c40eff678838d2021622f3085b5 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:01:28 +0000 Subject: [PATCH 058/356] Added Ex Stubs svn path=/trunk/; revision=9840 --- reactos/ntoskrnl/ex/interlck.c | 19 ++++- reactos/ntoskrnl/ex/list.c | 17 +++- reactos/ntoskrnl/ex/rundown.c | 142 +++++++++++++++++++++++++++++++++ reactos/ntoskrnl/ex/synch.c | 76 ++++++++++++++++++ reactos/ntoskrnl/ex/sysinfo.c | 42 +++++++++- reactos/ntoskrnl/ex/time.c | 14 +++- reactos/ntoskrnl/ex/util.c | 63 +++++++++++++++ 7 files changed, 369 insertions(+), 4 deletions(-) create mode 100644 reactos/ntoskrnl/ex/rundown.c create mode 100644 reactos/ntoskrnl/ex/synch.c create mode 100644 reactos/ntoskrnl/ex/util.c diff --git a/reactos/ntoskrnl/ex/interlck.c b/reactos/ntoskrnl/ex/interlck.c index ef627177fcd..5d5ea238424 100644 --- a/reactos/ntoskrnl/ex/interlck.c +++ b/reactos/ntoskrnl/ex/interlck.c @@ -1,4 +1,4 @@ -/* $Id: interlck.c,v 1.12 2004/06/01 01:00:25 sedwards Exp $ +/* $Id: interlck.c,v 1.13 2004/06/23 21:01:27 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -217,6 +217,23 @@ ExInterlockedCompareExchange64 (IN OUT PLONGLONG Destination, return oldval; } +/* + * @unimplemented + */ +LONGLONG +FASTCALL +ExfInterlockedCompareExchange64( + IN OUT LONGLONG volatile *Destination, + IN PLONGLONG ExChange, + IN PLONGLONG Comperand + ) +{ + LONGLONG oldval; + + UNIMPLEMENTED; + return oldval; +} + /* * @implemented */ diff --git a/reactos/ntoskrnl/ex/list.c b/reactos/ntoskrnl/ex/list.c index 2088ef93683..f74ef818070 100644 --- a/reactos/ntoskrnl/ex/list.c +++ b/reactos/ntoskrnl/ex/list.c @@ -1,4 +1,4 @@ -/* $Id: list.c,v 1.11 2003/08/14 18:30:28 silverblade Exp $ +/* $Id: list.c,v 1.12 2004/06/23 21:01:27 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -25,6 +25,21 @@ static KSPIN_LOCK ExpGlobalListLock = { 0, }; /* FUNCTIONS *************************************************************/ +/* + * @unimplemented + */ +PSLIST_ENTRY +FASTCALL +ExInterlockedFlushSList ( + IN PSLIST_HEADER ListHead + ) +{ + PSLIST_ENTRY Old = NULL; + + UNIMPLEMENTED; + return Old; +} + /* * @implemented */ diff --git a/reactos/ntoskrnl/ex/rundown.c b/reactos/ntoskrnl/ex/rundown.c new file mode 100644 index 00000000000..3cf95f96cc9 --- /dev/null +++ b/reactos/ntoskrnl/ex/rundown.c @@ -0,0 +1,142 @@ +/* + * ReactOS kernel + * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team + * + * 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. + */ +/* + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ex/rundown.c + * PURPOSE: Rundown Functions + * PORTABILITY: Checked + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +BOOLEAN +FASTCALL +ExAcquireRundownProtection ( + PVOID ProcessRundownProtect + ) +{ + UNIMPLEMENTED; + return FALSE; +} +/* + * @unimplemented + */ +BOOLEAN +FASTCALL +ExAcquireRundownProtectionEx ( + IN PVOID ProcessRundownProtect, + IN PVOID Unknown + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +VOID +FASTCALL +ExInitializeRundownProtection ( + IN PVOID ProcessRundownProtect + ) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +VOID +FASTCALL +ExReInitializeRundownProtection ( + IN PVOID ProcessRundownProtect + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +BOOLEAN +FASTCALL +ExReleaseRundownProtection ( + IN PVOID ProcessRundownProtect + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOLEAN +FASTCALL +ExReleaseRundownProtectionEx ( + IN PVOID ProcessRundownProtect, + IN PVOID Unknown + ) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +VOID +FASTCALL +ExRundownCompleted ( + IN PVOID ProcessRundownProtect + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +PVOID +FASTCALL +ExWaitForRundownProtectionRelease ( + PVOID ProcessRundownProtect + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ex/synch.c b/reactos/ntoskrnl/ex/synch.c new file mode 100644 index 00000000000..caaf8333569 --- /dev/null +++ b/reactos/ntoskrnl/ex/synch.c @@ -0,0 +1,76 @@ +/* + * ReactOS kernel + * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team + * + * 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. + */ +/* + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ex/synch.c + * PURPOSE: Synchronization Functions (Pushlocks) + * PORTABILITY: Checked + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +PVOID +FASTCALL +ExfAcquirePushLockExclusive ( + PVOID Lock + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +PVOID +FASTCALL +ExfAcquirePushLockShared ( + PVOID Lock + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +PVOID +FASTCALL +ExfReleasePushLock ( + PVOID Lock + ) +{ + UNIMPLEMENTED; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 8bd9bbbc29f..9c238b8802d 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.36 2004/06/13 10:35:52 navaraf Exp $ +/* $Id: sysinfo.c,v 1.37 2004/06/23 21:01:27 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,6 +37,46 @@ extern ULONG Ke386Cpuid; /* FUNCTIONS *****************************************************************/ +/* + * @unimplemented + */ +VOID +STDCALL +ExEnumHandleTable ( + PULONG HandleTable, + PVOID Callback, + PVOID Param, + PHANDLE Handle OPTIONAL + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +VOID +STDCALL +ExGetCurrentProcessorCounts ( + PVOID IdleThreadTime, + PVOID SystemTime, + PVOID Number + ) +{ + UNIMPLEMENTED; +} +/* + * @unimplemented + */ +VOID +STDCALL +ExGetCurrentProcessorCpuUsage ( + PVOID RetVal + ) +{ + UNIMPLEMENTED; +} + NTSTATUS STDCALL NtQuerySystemEnvironmentValue (IN PUNICODE_STRING UnsafeName, OUT PVOID UnsafeValue, diff --git a/reactos/ntoskrnl/ex/time.c b/reactos/ntoskrnl/ex/time.c index e706c72d479..6553c55e398 100644 --- a/reactos/ntoskrnl/ex/time.c +++ b/reactos/ntoskrnl/ex/time.c @@ -1,4 +1,4 @@ -/* $Id: time.c,v 1.19 2003/10/12 17:05:44 hbirr Exp $ +/* $Id: time.c,v 1.20 2004/06/23 21:01:27 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -125,6 +125,18 @@ ExLocalTimeToSystemTime ( _SystemTimeZoneInfo.Bias * TICKSPERMINUTE; } +/* + * @unimplemented + */ +VOID +STDCALL +ExSetTimerResolution ( + IN ULONG DesiredTime, + IN BOOLEAN SetResolution + ) +{ + UNIMPLEMENTED; +} /* * @implemented diff --git a/reactos/ntoskrnl/ex/util.c b/reactos/ntoskrnl/ex/util.c new file mode 100644 index 00000000000..24661d3646c --- /dev/null +++ b/reactos/ntoskrnl/ex/util.c @@ -0,0 +1,63 @@ +/* + * ReactOS kernel + * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team + * + * 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. + */ +/* + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ex/misc.c + * PURPOSE: Executive Utility Functions + * PORTABILITY: Checked + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +ExUuidCreate( + OUT UUID *Uuid + ) +{ + UNIMPLEMENTED; + return FALSE; +} +/* + * @unimplemented + */ +STDCALL +BOOLEAN +ExVerifySuite( + SUITE_TYPE SuiteType + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* EOF */ From 68f96d4b10d18ab536e03222e1da7d20c60bf690 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:02:35 +0000 Subject: [PATCH 059/356] Added Ex Prototypes svn path=/trunk/; revision=9841 --- reactos/include/ddk/exfuncs.h | 157 ++++++++++++++++++++++++- reactos/include/ddk/extypes.h | 51 +++++++- reactos/ntoskrnl/include/internal/ke.h | 40 ++++++- reactos/ntoskrnl/include/internal/ps.h | 18 ++- 4 files changed, 257 insertions(+), 9 deletions(-) diff --git a/reactos/include/ddk/exfuncs.h b/reactos/include/ddk/exfuncs.h index 3dda28ba517..fd126c305df 100644 --- a/reactos/include/ddk/exfuncs.h +++ b/reactos/include/ddk/exfuncs.h @@ -46,6 +46,32 @@ ExAcquireResourceSharedLite ( BOOLEAN Wait ); BOOLEAN +FASTCALL +ExAcquireRundownProtection ( + PVOID ProcessRundownProtect + ); +BOOLEAN +FASTCALL +ExAcquireRundownProtectionEx ( + IN PVOID ProcessRundownProtect, + IN PVOID Unknown + ); +PVOID +FASTCALL +ExfAcquirePushLockExclusive ( + PVOID Lock + ); +PVOID +FASTCALL +ExfAcquirePushLockShared ( + PVOID Lock + ); +PVOID +FASTCALL +ExfReleasePushLock ( + PVOID Lock + ); +BOOLEAN STDCALL ExAcquireSharedStarveExclusive ( PERESOURCE Resource, @@ -120,6 +146,15 @@ ExAllocatePoolWithTag ( IN ULONG Tag ); +PVOID +NTAPI +ExAllocatePoolWithTagPriority( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag, + IN EX_POOL_PRIORITY Priority + ); + VOID STDCALL ExConvertExclusiveToSharedLite ( @@ -152,6 +187,15 @@ ExDisableResourceBoostLite ( PERESOURCE Resource ); +VOID +STDCALL +ExEnumHandleTable ( + PULONG HandleTable, + PVOID Callback, + PVOID Param, + PHANDLE Handle OPTIONAL + ); + NTSTATUS STDCALL ExExtendZone ( @@ -199,6 +243,28 @@ ExFreePool ( #define ExGetCurrentResourceThread() \ ((ERESOURCE_THREAD)KeGetCurrentThread()) +LONGLONG +FASTCALL +ExfInterlockedCompareExchange64( + IN OUT LONGLONG volatile *Destination, + IN PLONGLONG ExChange, + IN PLONGLONG Comperand + ); + +VOID +STDCALL +ExGetCurrentProcessorCounts ( + PVOID IdleThreadTime, + PVOID SystemTime, + PVOID Number + ); + +VOID +STDCALL +ExGetCurrentProcessorCpuUsage ( + PVOID RetVal + ); + ULONG STDCALL ExGetExclusiveWaiterCount ( @@ -242,6 +308,12 @@ ExInitializeResourceLite ( PERESOURCE Resource ); +VOID +FASTCALL +ExInitializeRundownProtection ( + PVOID ProcessRundown + ); + /* * VOID * ExInitializeSListHead ( @@ -333,6 +405,7 @@ ExInterlockedDecrementLong ( PLONG Addend, PKSPIN_LOCK Lock ); + ULONG STDCALL ExInterlockedExchangeUlong ( @@ -340,6 +413,7 @@ ExInterlockedExchangeUlong ( ULONG Value, PKSPIN_LOCK Lock ); + NTSTATUS STDCALL ExInterlockedExtendZone ( @@ -349,6 +423,12 @@ ExInterlockedExtendZone ( PKSPIN_LOCK Lock ); +PSLIST_ENTRY +FASTCALL +ExInterlockedFlushSList ( + IN PSLIST_HEADER ListHead + ); + /* * PVOID * ExInterlockedFreeToZone ( @@ -498,6 +578,14 @@ ExQueueWorkItem ( PWORK_QUEUE_ITEM WorkItem, WORK_QUEUE_TYPE QueueType ); + +SIZE_T +STDCALL +ExQueryPoolBlockSize ( + IN PVOID PoolBlock, + OUT PBOOLEAN QuotaCharged + ); + VOID STDCALL ExRaiseAccessViolation ( @@ -513,6 +601,21 @@ STDCALL ExRaiseStatus ( NTSTATUS Status ); +VOID +STDCALL +ExRaiseException ( + PEXCEPTION_RECORD pExcptRec + ); +VOID +STDCALL +ExRaiseHardError ( + IN NTSTATUS ErrorStatus, + IN ULONG NumberOfParameters, + IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL, + IN PVOID *Parameters, + IN HARDERROR_RESPONSE_OPTION ResponseOption, + OUT PHARDERROR_RESPONSE Response + ); PVOID STDCALL @@ -527,6 +630,12 @@ STDCALL ExReinitializeResourceLite ( PERESOURCE Resource ); +VOID +FASTCALL +ExReInitializeRundownProtection ( + PVOID ProcessRundown + ); + /* ReactOS Specific: begin */ VOID FASTCALL @@ -566,7 +675,22 @@ ExReleaseResourceForThreadLite ( PERESOURCE Resource, ERESOURCE_THREAD ResourceThreadId ); - +BOOLEAN +FASTCALL +ExReleaseRundownProtection ( + IN PVOID ProcessRundownProtect + ); +BOOLEAN +FASTCALL +ExReleaseRundownProtectionEx ( + IN PVOID ProcessRundownProtect, + IN PVOID Unknown + ); +VOID +FASTCALL +ExRundownCompleted ( + PVOID ProcessRundown + ); VOID STDCALL ExSetResourceOwnerPointer ( @@ -574,6 +698,23 @@ ExSetResourceOwnerPointer ( IN PVOID OwnerPointer ); +VOID +STDCALL +ExSetTimerResolution ( + IN ULONG DesiredTime, + IN BOOLEAN SetResolution + ); + +STDCALL +BOOLEAN +ExVerifySuite( + SUITE_TYPE SuiteType + ); + +BOOLEAN +STDCALL +ExSystemExceptionFilter(); + VOID STDCALL ExSystemTimeToLocalTime ( @@ -599,6 +740,20 @@ ExUnregisterCallback ( IN PVOID CallbackRegistration ); +typedef GUID UUID; + +STDCALL +NTSTATUS +ExUuidCreate( + OUT UUID *Uuid + ); + +PVOID +FASTCALL +ExWaitForRundownProtectionRelease ( + PVOID ProcessRundownProtect + ); + PSLIST_ENTRY FASTCALL InterlockedPopEntrySList ( diff --git a/reactos/include/ddk/extypes.h b/reactos/include/ddk/extypes.h index 9d9f82468a7..f335dc8bf96 100644 --- a/reactos/include/ddk/extypes.h +++ b/reactos/include/ddk/extypes.h @@ -1,4 +1,4 @@ -/* $Id: extypes.h,v 1.21 2003/11/14 15:19:35 ekohl Exp $ */ +/* $Id: extypes.h,v 1.22 2004/06/23 21:02:35 ion Exp $ */ #ifndef __INCLUDE_DDK_EXTYPES_H #define __INCLUDE_DDK_EXTYPES_H @@ -137,6 +137,55 @@ typedef struct _PAGED_LOOKASIDE_LIST FAST_MUTEX Obsoleted; } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; +typedef enum _EX_POOL_PRIORITY { + LowPoolPriority, + LowPoolPrioritySpecialPoolOverrun = 8, + LowPoolPrioritySpecialPoolUnderrun = 9, + NormalPoolPriority = 16, + NormalPoolPrioritySpecialPoolOverrun = 24, + NormalPoolPrioritySpecialPoolUnderrun = 25, + HighPoolPriority = 32, + HighPoolPrioritySpecialPoolOverrun = 40, + HighPoolPrioritySpecialPoolUnderrun = 41 + + } EX_POOL_PRIORITY; + +typedef enum _SUITE_TYPE { + SmallBusiness, + Enterprise, + BackOffice, + CommunicationServer, + TerminalServer, + SmallBusinessRestricted, + EmbeddedNT, + DataCenter, + SingleUserTS, + Personal, + Blade, + MaxSuiteType +} SUITE_TYPE; + +typedef enum _HARDERROR_RESPONSE_OPTION { + OptionAbortRetryIgnore, + OptionOk, + OptionOkCancel, + OptionRetryCancel, + OptionYesNo, + OptionYesNoCancel, + OptionShutdownSystem +} HARDERROR_RESPONSE_OPTION, *PHARDERROR_RESPONSE_OPTION; + +typedef enum _HARDERROR_RESPONSE { + ResponseReturnToCaller, + ResponseNotHandled, + ResponseAbort, + ResponseCancel, + ResponseIgnore, + ResponseNo, + ResponseOk, + ResponseRetry, + ResponseYes +} HARDERROR_RESPONSE, *PHARDERROR_RESPONSE; /* callback object (not functional in NT4)*/ diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index c474b9f1f42..49d122d2ae1 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -53,6 +53,34 @@ DbgBreakPointNoBugCheck(VOID); VOID STDCALL KeRescheduleThread(); + +STDCALL +VOID +KeProfileInterrupt( + PKTRAP_FRAME TrapFrame +); + +STDCALL +VOID +KeProfileInterruptWithSource( + IN PKTRAP_FRAME TrapFrame, + IN KPROFILE_SOURCE Source +); + +/*STDCALL +BOOLEAN +KiIpiServiceRoutine( + IN PKTRAP_FRAME TrapFrame, + IN PKEXCEPTION_FRAME ExceptionFrame +);*/ + +STDCALL +VOID +KeUpdateSystemTime( + IN PKTRAP_FRAME TrapFrame, + IN ULONG Increment +); + VOID KiUpdateSystemTime (KIRQL oldIrql, ULONG Eip); KIRQL KeAcquireDispatcherDatabaseLock(VOID); @@ -71,17 +99,13 @@ VOID KeDumpStackFrames(PULONG Frame); BOOLEAN KiTestAlert(VOID); VOID KeRemoveAllWaitsThread(struct _ETHREAD* Thread, NTSTATUS WaitStatus, BOOL Unblock); PULONG KeGetStackTopThread(struct _ETHREAD* Thread); -VOID KeContextToTrapFrame(PCONTEXT Context, - PKTRAP_FRAME TrapFrame); +VOID KeContextToTrapFrame(PCONTEXT Context, PKTRAP_FRAME TrapFrame); VOID KiDeliverNormalApc(VOID); BOOLEAN STDCALL KeRemoveQueueApc (PKAPC Apc); PLIST_ENTRY STDCALL KeRundownQueue(IN PKQUEUE Queue); -NTSTATUS STDCALL -KeRaiseUserException(IN NTSTATUS ExceptionCode); - /* INITIALIZATION FUNCTIONS *************************************************/ VOID KeInitExceptions(VOID); @@ -138,6 +162,12 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG ExceptionNr, ULONG cr2); VOID KiUpdateProcessThreadTime(VOID); +STDCALL +VOID +KeUpdateRunTime( + IN PKTRAP_FRAME TrapFrame +); + #endif /* not __ASM__ */ #define MAXIMUM_PROCESSORS 32 diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index ad4d3799c80..78247d95e6a 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: ps.h,v 1.58 2004/03/14 18:11:25 ekohl Exp $ +/* $Id: ps.h,v 1.59 2004/06/23 21:02:16 ion Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Process manager definitions @@ -63,7 +63,7 @@ typedef struct _KAPC_STATE UCHAR KernelApcInProgress; UCHAR KernelApcPending; USHORT UserApcPending; -} KAPC_STATE, *PKAPC_STATE; +} KAPC_STATE, *PKAPC_STATE, *__restrict PRKAPC_STATE; #include @@ -505,6 +505,20 @@ NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount); VOID KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First); NTSTATUS KeReleaseThread(PETHREAD Thread); + +STDCALL +VOID +KeStackAttachProcess ( + IN PKPROCESS Process, + OUT PRKAPC_STATE ApcState + ); + +STDCALL +VOID +KeUnstackDetachProcess ( + IN PRKAPC_STATE ApcState + ); + VOID STDCALL PiDeleteProcess(PVOID ObjectBody); VOID PsReapThreads(VOID); VOID PsUnfreezeOtherThread(PETHREAD Thread); From d039c1362d7bf62f890c6a5276a93b1eef61b35b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:03:43 +0000 Subject: [PATCH 060/356] Added new files for Ex Stubs svn path=/trunk/; revision=9842 --- reactos/ntoskrnl/Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index f502b63657f..0ba13084ebc 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.125 2004/06/21 21:07:29 hyperion Exp $ +# $Id: Makefile,v 1.126 2004/06/23 21:03:43 ion Exp $ # # ReactOS Operating System # @@ -262,9 +262,12 @@ OBJECTS_EX = \ ex/napi.o \ ex/power.o \ ex/resource.o \ - ex/time.o \ + ex/rundown.o \ ex/stree.o \ + ex/synch.o \ ex/sysinfo.o \ + ex/time.o \ + ex/util.o \ ex/win32k.o \ ex/work.o \ ex/zone.o From 2b0f40b581d77ff0d851d3f00da7452c52453d69 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:37:06 +0000 Subject: [PATCH 061/356] Added Ex Stubs svn path=/trunk/; revision=9843 --- reactos/ntoskrnl/ex/interlck.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ex/interlck.c b/reactos/ntoskrnl/ex/interlck.c index 5d5ea238424..b174fe66280 100644 --- a/reactos/ntoskrnl/ex/interlck.c +++ b/reactos/ntoskrnl/ex/interlck.c @@ -1,4 +1,4 @@ -/* $Id: interlck.c,v 1.13 2004/06/23 21:01:27 ion Exp $ +/* $Id: interlck.c,v 1.14 2004/06/23 21:37:06 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -13,7 +13,8 @@ #include - +#define NDEBUG +#include /* FUNCTIONS *****************************************************************/ #ifdef ExInterlockedDecrementLong From f66364821ff312db53c420f76baff84d41494fb9 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:42:50 +0000 Subject: [PATCH 062/356] Added Io Stubs svn path=/trunk/; revision=9844 --- reactos/ntoskrnl/io/device.c | 145 +++++++++++++++++- reactos/ntoskrnl/io/driver.c | 30 +++- reactos/ntoskrnl/io/errlog.c | 13 +- reactos/ntoskrnl/io/file.c | 143 +++++++++++++++++- reactos/ntoskrnl/io/fs.c | 16 +- reactos/ntoskrnl/io/iocomp.c | 37 +++++ reactos/ntoskrnl/io/irp.c | 56 ++++++- reactos/ntoskrnl/io/pnpmgr.c | 9 +- reactos/ntoskrnl/io/pnpnotify.c | 16 ++ reactos/ntoskrnl/io/process.c | 14 +- reactos/ntoskrnl/io/share.c | 6 +- reactos/ntoskrnl/io/wmi.c | 257 ++++++++++++++++++++++++++++++++ reactos/ntoskrnl/io/xhaldisp.c | 149 +++++++++++++++++- 13 files changed, 876 insertions(+), 15 deletions(-) create mode 100644 reactos/ntoskrnl/io/wmi.c diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index d461ae0f444..158f938425e 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -1,4 +1,4 @@ -/* $Id: device.c,v 1.70 2004/04/08 16:01:47 navaraf Exp $ +/* $Id: device.c,v 1.71 2004/06/23 21:42:49 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -164,6 +164,21 @@ IoAttachDeviceByPointer( return STATUS_SUCCESS; } +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoAttachDeviceToDeviceStackSafe( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice, + OUT PDEVICE_OBJECT *AttachedToDeviceObject + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* * IoDeleteDevice * @@ -206,6 +221,64 @@ IoDeleteDevice(PDEVICE_OBJECT DeviceObject) ObDereferenceObject(DeviceObject); } + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoEnumerateDeviceObjectList( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT *DeviceObjectList, + IN ULONG DeviceObjectListSize, + OUT PULONG ActualNumberDeviceObjects + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +PDEVICE_OBJECT +IoGetDeviceAttachmentBaseRef( + IN PDEVICE_OBJECT DeviceObject + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoGetDiskDeviceObject( + IN PDEVICE_OBJECT FileSystemDeviceObject, + OUT PDEVICE_OBJECT *DiskDeviceObject + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +PDEVICE_OBJECT +IoGetLowerDeviceObject( + IN PDEVICE_OBJECT DeviceObject + ) +{ + UNIMPLEMENTED; + return 0; +} + /* * IoGetRelatedDeviceObject * @@ -614,6 +687,34 @@ IoOpenDeviceInstanceKey( return STATUS_NOT_IMPLEMENTED; } +/* + * @unimplemented + */ +STDCALL +VOID +IoRegisterBootDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context + ) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoRegisterLastChanceShutdownNotification( + IN PDEVICE_OBJECT DeviceObject + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* * IoQueryDeviceEnumInfo * @@ -630,4 +731,46 @@ IoQueryDeviceEnumInfo( return 0; } +/* + * @unimplemented + */ +STDCALL +VOID +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +IoSynchronousInvalidateDeviceRelations( + IN PDEVICE_OBJECT DeviceObject, + IN DEVICE_RELATION_TYPE Type + ) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoValidateDeviceIoControlAccess( + IN PIRP Irp, + IN ULONG RequiredAccess + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 3968fea861d..ca646cc74b1 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.47 2004/06/20 00:44:55 navaraf Exp $ +/* $Id: driver.c,v 1.48 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1478,6 +1478,34 @@ IopReinitializeDrivers(VOID) /* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoCreateDriver ( + IN PUNICODE_STRING DriverName, OPTIONAL + IN PDRIVER_INITIALIZE InitializationFunction + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +IoDeleteDriver ( + IN PDRIVER_OBJECT DriverObject + ) +{ + UNIMPLEMENTED; +} + + /* * NtLoadDriver * diff --git a/reactos/ntoskrnl/io/errlog.c b/reactos/ntoskrnl/io/errlog.c index 09c424b52bb..49c9452cbce 100644 --- a/reactos/ntoskrnl/io/errlog.c +++ b/reactos/ntoskrnl/io/errlog.c @@ -1,4 +1,4 @@ -/* $Id: errlog.c,v 1.16 2003/12/30 18:52:04 fireball Exp $ +/* $Id: errlog.c,v 1.17 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -382,6 +382,17 @@ IoAllocateErrorLogEntry (IN PVOID IoObject, return (PVOID)((ULONG_PTR)LogEntry + sizeof(ERROR_LOG_ENTRY)); } +/* + * @unimplemented + */ +STDCALL +VOID +IoFreeErrorLogEntry( + PVOID ElEntry + ) +{ + UNIMPLEMENTED; +} /* * @implemented diff --git a/reactos/ntoskrnl/io/file.c b/reactos/ntoskrnl/io/file.c index c664058ebb0..378bffea75f 100644 --- a/reactos/ntoskrnl/io/file.c +++ b/reactos/ntoskrnl/io/file.c @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.28 2003/12/13 14:36:42 ekohl Exp $ +/* $Id: file.c,v 1.29 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -131,6 +131,133 @@ NtQueryInformationFile(HANDLE FileHandle, } +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoCheckQuerySetFileInformation( + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + IN BOOLEAN SetOperation + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoCheckQuerySetVolumeInformation( + IN FS_INFORMATION_CLASS FsInformationClass, + IN ULONG Length, + IN BOOLEAN SetOperation + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoCheckQuotaBufferValidity( + IN PFILE_QUOTA_INFORMATION QuotaBuffer, + IN ULONG QuotaLength, + OUT PULONG ErrorOffset + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoCreateFileSpecifyDeviceObjectHint( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG Disposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength, + IN CREATE_FILE_TYPE CreateFileType, + IN PVOID ExtraCreateParameters OPTIONAL, + IN ULONG Options, + IN PVOID DeviceObject + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +PFILE_OBJECT +IoCreateStreamFileObjectEx( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + OUT PHANDLE FileObjectHandle OPTIONAL + ) +{ + UNIMPLEMENTED; + return 0; +} +/* + * @unimplemented + */ +STDCALL +PFILE_OBJECT +IoCreateStreamFileObjectLite( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +BOOLEAN +IoIsFileOriginRemote( + IN PFILE_OBJECT FileObject + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoQueryFileDosDeviceName( + IN PFILE_OBJECT FileObject, + OUT POBJECT_NAME_INFORMATION *ObjectNameInformation + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* * @implemented */ @@ -352,6 +479,20 @@ NtSetInformationFile(HANDLE FileHandle, } +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoSetFileOrigin( + IN PFILE_OBJECT FileObject, + IN BOOLEAN Remote + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + NTSTATUS STDCALL NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PFILE_BASIC_INFORMATION FileInformation) diff --git a/reactos/ntoskrnl/io/fs.c b/reactos/ntoskrnl/io/fs.c index a928c510a9c..6a37dfbd6a8 100644 --- a/reactos/ntoskrnl/io/fs.c +++ b/reactos/ntoskrnl/io/fs.c @@ -1,5 +1,4 @@ -/* $Id: fs.c,v 1.40 2003/12/13 14:36:42 ekohl Exp $ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/fs.c @@ -54,6 +53,19 @@ IopNotifyFileSystemChange(PDEVICE_OBJECT DeviceObject, /* FUNCTIONS *****************************************************************/ +/* + * @unimplemented + */ +STDCALL +VOID +IoCancelFileOpen( + IN PDEVICE_OBJECT DeviceObject, + IN PFILE_OBJECT FileObject + ) +{ + UNIMPLEMENTED; +} + /* * @implemented */ diff --git a/reactos/ntoskrnl/io/iocomp.c b/reactos/ntoskrnl/io/iocomp.c index 635fabadf73..c26eb2cd1bf 100644 --- a/reactos/ntoskrnl/io/iocomp.c +++ b/reactos/ntoskrnl/io/iocomp.c @@ -67,6 +67,43 @@ NtpDeleteIoCompletion(PVOID ObjectBody) } +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoSetCompletionRoutineEx( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PIO_COMPLETION_ROUTINE CompletionRoutine, + IN PVOID Context, + IN BOOLEAN InvokeOnSuccess, + IN BOOLEAN InvokeOnError, + IN BOOLEAN InvokeOnCancel + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoSetIoCompletion ( + IN PVOID IoCompletion, + IN PVOID KeyContext, + IN PVOID ApcContext, + IN NTSTATUS IoStatus, + IN ULONG_PTR IoStatusInformation, + IN BOOLEAN Quota + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + VOID NtInitializeIoCompletionImplementation(VOID) { diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index ec80cff8de2..b3aa19da446 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.61 2004/06/06 08:36:31 hbirr Exp $ +/* $Id: irp.c,v 1.62 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -45,6 +45,19 @@ /* FUNCTIONS ****************************************************************/ +/* + * @unimplemented + */ +STDCALL +BOOLEAN +IoForwardIrpSynchronously( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + UNIMPLEMENTED; + return FALSE; +} /* * @implemented @@ -60,6 +73,47 @@ IoFreeIrp(PIRP Irp) ExFreePool(Irp); } +/* + * @unimplemented + */ +STDCALL +ULONG +IoGetRequestorProcessId( + IN PIRP Irp + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoGetRequestorSessionId( + IN PIRP Irp, + OUT PULONG pSessionId + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +BOOLEAN +IoIsValidNameGraftingBuffer( + IN PIRP Irp, + IN PREPARSE_DATA_BUFFER ReparseBuffer + ) +{ + UNIMPLEMENTED; + return FALSE; +} /* * @unimplemented diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 392c100887b..5acc109f6af 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.29 2004/06/10 11:00:28 ekohl Exp $ +/* $Id: pnpmgr.c,v 1.30 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -195,11 +195,13 @@ IoOpenDeviceRegistryKey( /* * @unimplemented */ -VOID STDCALL +VOID IoRequestDeviceEject( - IN PDEVICE_OBJECT PhysicalDeviceObject) + IN PDEVICE_OBJECT PhysicalDeviceObject + ) { + UNIMPLEMENTED; } @@ -1411,6 +1413,7 @@ IopInvalidateDeviceRelations( return STATUS_SUCCESS; } + VOID INIT_FUNCTION PnpInit(VOID) { diff --git a/reactos/ntoskrnl/io/pnpnotify.c b/reactos/ntoskrnl/io/pnpnotify.c index 144610da1c9..bed60325639 100644 --- a/reactos/ntoskrnl/io/pnpnotify.c +++ b/reactos/ntoskrnl/io/pnpnotify.c @@ -22,6 +22,22 @@ /* FUNCTIONS *****************************************************************/ +/* + * @unimplemented + */ +STDCALL +ULONG +IoPnPDeliverServicePowerNotification( + ULONG VetoedPowerOperation OPTIONAL, + ULONG PowerNotification, + ULONG Unknown OPTIONAL, + BOOLEAN Synchronous + ) +{ + UNIMPLEMENTED; + return 0; +} + /* * @unimplemented */ diff --git a/reactos/ntoskrnl/io/process.c b/reactos/ntoskrnl/io/process.c index 2c783fa7d6b..b6f6c440927 100644 --- a/reactos/ntoskrnl/io/process.c +++ b/reactos/ntoskrnl/io/process.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: process.c,v 1.16 2003/12/30 18:52:04 fireball Exp $ +/* $Id: process.c,v 1.17 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -57,6 +57,18 @@ IoGetStackLimits(OUT PULONG LowLimit, *HighLimit = (ULONG)NtCurrentTeb()->Tib.StackBase; } +/* + * @unimplemented + */ +STDCALL +BOOLEAN +IoIsSystemThread( + IN PETHREAD Thread + ) +{ + UNIMPLEMENTED; + return FALSE; +} /* * @implemented diff --git a/reactos/ntoskrnl/io/share.c b/reactos/ntoskrnl/io/share.c index 09aeb05c4e3..13150c12d77 100644 --- a/reactos/ntoskrnl/io/share.c +++ b/reactos/ntoskrnl/io/share.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: share.c,v 1.9 2003/07/10 15:47:00 royce Exp $ +/* $Id: share.c,v 1.10 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -330,8 +330,8 @@ IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess, IN UCHAR MajorFunction, IN UCHAR MinorFunction, IN ULONG IoControlCode, - IN PFILE_INFORMATION_CLASS FileInformationClass OPTIONAL, - IN PFS_INFORMATION_CLASS FsInformationClass OPTIONAL) + IN PVOID ExtraData OPTIONAL, + IN PVOID ExtraData2 OPTIONAL) { UNIMPLEMENTED; return(STATUS_NOT_IMPLEMENTED); diff --git a/reactos/ntoskrnl/io/wmi.c b/reactos/ntoskrnl/io/wmi.c new file mode 100644 index 00000000000..314950c4b10 --- /dev/null +++ b/reactos/ntoskrnl/io/wmi.c @@ -0,0 +1,257 @@ +/* $Id: wmi.c,v 1.1 2004/06/23 21:42:50 ion Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/io/wmi.c + * PURPOSE: Windows Management Instrumentation + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * UPDATE HISTORY: + * Created 23/06/04 + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIRegistrationControl( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Action + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIAllocateInstanceIds( + IN GUID *Guid, + IN ULONG InstanceCount, + OUT ULONG *FirstInstanceId + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMISuggestInstanceName( + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN PUNICODE_STRING SymbolicLinkName OPTIONAL, + IN BOOLEAN CombineNames, + OUT PUNICODE_STRING SuggestedInstanceName + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIWriteEvent( + IN PVOID WnodeEventItem + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS IoWMIOpenBlock( + IN GUID *DataBlockGuid, + IN ULONG DesiredAccess, + OUT PVOID *DataBlockObject + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS IoWMIQueryAllData( + IN PVOID DataBlockObject, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIQueryAllDataMultiple( + IN PVOID *DataBlockObjectList, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIQuerySingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIQuerySingleInstanceMultiple( + IN PVOID *DataBlockObjectList, + IN PUNICODE_STRING InstanceNames, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMISetSingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMISetSingleItem( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG DataItemId, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIExecuteMethod( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN OUT PULONG OutBufferSize, + IN OUT PUCHAR InOutBuffer + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMISetNotificationCallback( + IN PVOID Object, + IN WMI_NOTIFICATION_CALLBACK Callback, + IN PVOID Context + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIHandleToInstanceName( + IN PVOID DataBlockObject, + IN HANDLE FileHandle, + OUT PUNICODE_STRING InstanceName + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWMIDeviceObjectToInstanceName( + IN PVOID DataBlockObject, + IN PDEVICE_OBJECT DeviceObject, + OUT PUNICODE_STRING InstanceName + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/*Eof*/ diff --git a/reactos/ntoskrnl/io/xhaldisp.c b/reactos/ntoskrnl/io/xhaldisp.c index 3f0afdeb5f3..0589c3997c7 100644 --- a/reactos/ntoskrnl/io/xhaldisp.c +++ b/reactos/ntoskrnl/io/xhaldisp.c @@ -1,4 +1,4 @@ -/* $Id: xhaldisp.c,v 1.8 2003/02/26 14:12:43 ekohl Exp $ +/* $Id: xhaldisp.c,v 1.9 2004/06/23 21:42:50 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -14,6 +14,10 @@ #include #include +#define NDEBUG +#include + + /* DATA **********************************************************************/ @@ -49,4 +53,147 @@ HAL_PRIVATE_DISPATCH EXPORTED HalPrivateDispatchTable = // ?? }; +/* + * @unimplemented + * +STDCALL +VOID +IoAssignDriveLetters( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString + ) +{ + UNIMPLEMENTED; +*/ + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoCreateDisk( + IN PDEVICE_OBJECT DeviceObject, + IN struct _CREATE_DISK* Disk + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoGetBootDiskInformation( + IN OUT PBOOTDISK_INFORMATION BootDiskInformation, + IN ULONG Size + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoReadDiskSignature( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG BytesPerSector, + OUT PDISK_SIGNATURE Signature + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoReadPartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX** DriveLayout + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoSetPartitionInformationEx( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG PartitionNumber, + IN struct _SET_PARTITION_INFORMATION_EX* PartitionInfo + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoSetSystemPartition( + PUNICODE_STRING VolumeNameString + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoVerifyPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN FixErrors + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoVolumeDeviceToDosName( + IN PVOID VolumeDeviceObject, + OUT PUNICODE_STRING DosName + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +IoWritePartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX* DriveLayfout + ) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ From 3074af46ff9ddb126e88cd313f1de259e8203b6c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:43:19 +0000 Subject: [PATCH 063/356] Added Io Stub Prototypes svn path=/trunk/; revision=9845 --- reactos/include/ddk/iodef.h | 11 + reactos/include/ddk/iofuncs.h | 555 +++++++++++++++++++++++++++++++++- reactos/include/ddk/iotypes.h | 132 +++++++- 3 files changed, 689 insertions(+), 9 deletions(-) diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index 263841df188..2ba09992c09 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -454,6 +454,17 @@ typedef ULONG FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; #define IRP_MN_QUERY_DIRECTORY 0x01 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 + +typedef struct _FILE_QUOTA_INFORMATION { + ULONG NextEntryOffset; + ULONG SidLength; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER QuotaUsed; + LARGE_INTEGER QuotaThreshold; + LARGE_INTEGER QuotaLimit; + LARGE_INTEGER Sid; +} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION; + /* * Floppy device data type */ diff --git a/reactos/include/ddk/iofuncs.h b/reactos/include/ddk/iofuncs.h index a2138deabdb..ff937ce58e1 100644 --- a/reactos/include/ddk/iofuncs.h +++ b/reactos/include/ddk/iofuncs.h @@ -1,6 +1,6 @@ #ifndef _INCLUDE_DDK_IOFUNCS_H #define _INCLUDE_DDK_IOFUNCS_H -/* $Id: iofuncs.h,v 1.41 2003/11/19 20:57:22 gdalsnes Exp $ */ +/* $Id: iofuncs.h,v 1.42 2004/06/23 21:43:19 ion Exp $ */ #ifdef __NTOSKRNL__ extern POBJECT_TYPE EXPORTED IoAdapterObjectType; @@ -415,8 +415,8 @@ IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess, IN UCHAR MajorFunction, IN UCHAR MinorFunction, IN ULONG IoControlCode, - IN PFILE_INFORMATION_CLASS FileInformationClass OPTIONAL, - IN PFS_INFORMATION_CLASS FsInformationClass OPTIONAL); + IN PVOID ExtraData OPTIONAL, + IN PVOID ExtraData2 OPTIONAL); NTSTATUS STDCALL @@ -788,11 +788,11 @@ STDCALL IoIsOperationSynchronous ( IN PIRP Irp ); -BOOLEAN STDCALL -IoIsSystemThread ( - PVOID Unknown0 - ); +BOOLEAN +IoIsSystemThread( + IN struct _ETHREAD* Thread + ); PIRP STDCALL IoMakeAssociatedIrp ( @@ -1238,6 +1238,547 @@ IoWritePartitionTable ( PDRIVE_LAYOUT_INFORMATION PartitionBuffer ); +/* STUBS*/ + +STDCALL +NTSTATUS +IoAttachDeviceToDeviceStackSafe( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice, + OUT PDEVICE_OBJECT *AttachedToDeviceObject + ); + +STDCALL +VOID +IoCancelFileOpen( + IN PDEVICE_OBJECT DeviceObject, + IN PFILE_OBJECT FileObject + ); + +STDCALL +NTSTATUS +IoCheckQuerySetFileInformation( + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + IN BOOLEAN SetOperation + ); + +STDCALL +NTSTATUS +IoCheckQuerySetVolumeInformation( + IN FS_INFORMATION_CLASS FsInformationClass, + IN ULONG Length, + IN BOOLEAN SetOperation + ); + + +STDCALL +NTSTATUS +IoCheckQuotaBufferValidity( + IN PFILE_QUOTA_INFORMATION QuotaBuffer, + IN ULONG QuotaLength, + OUT PULONG ErrorOffset + ); + +STDCALL +NTSTATUS +IoCreateFileSpecifyDeviceObjectHint( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG Disposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength, + IN CREATE_FILE_TYPE CreateFileType, + IN PVOID ExtraCreateParameters OPTIONAL, + IN ULONG Options, + IN PVOID DeviceObject + ); + +STDCALL +PFILE_OBJECT +IoCreateStreamFileObjectEx( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + OUT PHANDLE FileObjectHandle OPTIONAL + ); + +STDCALL +PFILE_OBJECT +IoCreateStreamFileObjectLite( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL + ); + +STDCALL +NTSTATUS +IoEnumerateDeviceObjectList( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT *DeviceObjectList, + IN ULONG DeviceObjectListSize, + OUT PULONG ActualNumberDeviceObjects + ); + +STDCALL +BOOLEAN +IoForwardIrpSynchronously( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +#define IoForwardAndCatchIrp IoForwardIrpSynchronously + +STDCALL +VOID +IoFreeErrorLogEntry( + PVOID ElEntry + ); + +STDCALL +ULONG +IoPnPDeliverServicePowerNotification( + ULONG VetoedPowerOperation OPTIONAL, + ULONG PowerNotification, + ULONG Unknown OPTIONAL, + BOOLEAN Synchronous + ); + +STDCALL +NTSTATUS +IoGetBootDiskInformation( + IN OUT PBOOTDISK_INFORMATION BootDiskInformation, + IN ULONG Size + ); + +STDCALL +PDEVICE_OBJECT +IoGetDeviceAttachmentBaseRef( + IN PDEVICE_OBJECT DeviceObject + ); + +STDCALL +NTSTATUS +IoGetDiskDeviceObject( + IN PDEVICE_OBJECT FileSystemDeviceObject, + OUT PDEVICE_OBJECT *DiskDeviceObject + ); + +STDCALL +PDEVICE_OBJECT +IoGetLowerDeviceObject( + IN PDEVICE_OBJECT DeviceObject + ); + +STDCALL +ULONG +IoGetRequestorProcessId( + IN PIRP Irp + ); + +STDCALL +BOOLEAN +IoIsFileOriginRemote( + IN PFILE_OBJECT FileObject + ); + +STDCALL +BOOLEAN +IoIsValidNameGraftingBuffer( + IN PIRP Irp, + IN PREPARSE_DATA_BUFFER ReparseBuffer + ); + +STDCALL +NTSTATUS +IoQueryFileDosDeviceName( + IN PFILE_OBJECT FileObject, + OUT POBJECT_NAME_INFORMATION *ObjectNameInformation + ); + +STDCALL +VOID +IoRegisterBootDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context + ); + +STDCALL +NTSTATUS +IoRegisterLastChanceShutdownNotification( + IN PDEVICE_OBJECT DeviceObject + ); + +STDCALL +VOID +IoReuseIrp( + IN OUT PIRP Irp, + IN NTSTATUS Iostatus + ); + +STDCALL +NTSTATUS +IoSetCompletionRoutineEx( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PIO_COMPLETION_ROUTINE CompletionRoutine, + IN PVOID Context, + IN BOOLEAN InvokeOnSuccess, + IN BOOLEAN InvokeOnError, + IN BOOLEAN InvokeOnCancel + ); + +STDCALL +NTSTATUS +IoSetFileOrigin( + IN PFILE_OBJECT FileObject, + IN BOOLEAN Remote + ); + +STDCALL +NTSTATUS +IoSetSystemPartition( + PUNICODE_STRING VolumeNameString + ); + +STDCALL +NTSTATUS +IoVolumeDeviceToDosName( + IN PVOID VolumeDeviceObject, + OUT PUNICODE_STRING DosName + ); + + +STDCALL +NTSTATUS +IoSetPartitionInformationEx( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG PartitionNumber, + IN struct _SET_PARTITION_INFORMATION_EX* PartitionInfo + ); + +STDCALL +NTSTATUS +IoWritePartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX* DriveLayfout + ); + +STDCALL +NTSTATUS +IoReadPartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX** DriveLayout + ); + +STDCALL +NTSTATUS +IoCreateDisk( + IN PDEVICE_OBJECT DeviceObject, + IN struct _CREATE_DISK* Disk + ); + +STDCALL +NTSTATUS +NTAPI +IoGetDeviceInterfaces( + IN CONST GUID *InterfaceClassGuid, + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN ULONG Flags, + OUT PWSTR *SymbolicLinkList + ); + +STDCALL +NTSTATUS +NTAPI +IoGetDeviceInterfaceAlias( + IN PUNICODE_STRING SymbolicLinkName, + IN CONST GUID *AliasInterfaceClassGuid, + OUT PUNICODE_STRING AliasSymbolicLinkName + ); + +STDCALL +NTSTATUS +IoOpenDeviceInterfaceRegistryKey( + IN PUNICODE_STRING SymbolicLinkName, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE DeviceInterfaceKey + ); + +STDCALL +NTSTATUS +IoReadDiskSignature( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG BytesPerSector, + OUT PDISK_SIGNATURE Signature + ); + +STDCALL +NTSTATUS +IoRegisterPlugPlayNotification( + IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, + IN ULONG EventCategoryFlags, + IN PVOID EventCategoryData OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, + IN PVOID Context, + OUT PVOID *NotificationEntry + ); + +STDCALL +NTSTATUS +IoUnregisterPlugPlayNotification( + IN PVOID NotificationEntry + ); + +STDCALL +NTSTATUS +IoReportDetectedDevice( + IN PDRIVER_OBJECT DriverObject, + IN INTERFACE_TYPE LegacyBusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PCM_RESOURCE_LIST ResourceList, + IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, + IN BOOLEAN ResourceAssigned, + IN OUT PDEVICE_OBJECT *DeviceObject + ); + +STDCALL +NTSTATUS +IoReportResourceForDetection( + IN PDRIVER_OBJECT DriverObject, + IN PCM_RESOURCE_LIST DriverList OPTIONAL, + IN ULONG DriverListSize OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN PCM_RESOURCE_LIST DeviceList OPTIONAL, + IN ULONG DeviceListSize OPTIONAL, + OUT PBOOLEAN ConflictDetected + ); + +STDCALL +NTSTATUS +IoReportTargetDeviceChange( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PVOID NotificationStructure + ); + +STDCALL +NTSTATUS +IoReportTargetDeviceChangeAsynchronous( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PVOID NotificationStructure, + IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback, OPTIONAL + IN PVOID Context OPTIONAL + ); + +STDCALL +VOID +IoRequestDeviceEject( + IN PDEVICE_OBJECT PhysicalDeviceObject + ); + +STDCALL +NTSTATUS +IoVerifyPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN FixErrors + ); + +STDCALL +VOID +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable + ); + +STDCALL +VOID +IoSynchronousInvalidateDeviceRelations( + IN PDEVICE_OBJECT DeviceObject, + IN DEVICE_RELATION_TYPE Type + ); + +STDCALL +NTSTATUS +IoCreateDriver ( + IN PUNICODE_STRING DriverName, OPTIONAL + IN PDRIVER_INITIALIZE InitializationFunction + ); + +STDCALL +NTSTATUS +IoValidateDeviceIoControlAccess( + IN PIRP Irp, + IN ULONG RequiredAccess + ); + +STDCALL +VOID +IoDeleteDriver ( + IN PDRIVER_OBJECT DriverObject + ); + +STDCALL +NTSTATUS +IoGetRequestorSessionId( + IN PIRP Irp, + OUT PULONG pSessionId + ); + +STDCALL +NTSTATUS +IoSetIoCompletion ( + IN PVOID IoCompletion, + IN PVOID KeyContext, + IN PVOID ApcContext, + IN NTSTATUS IoStatus, + IN ULONG_PTR IoStatusInformation, + IN BOOLEAN Quota + ); + +STDCALL +NTSTATUS +IoWMIRegistrationControl( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Action + ); + +STDCALL +NTSTATUS +IoWMIAllocateInstanceIds( + IN GUID *Guid, + IN ULONG InstanceCount, + OUT ULONG *FirstInstanceId + ); + +STDCALL +NTSTATUS +IoWMISuggestInstanceName( + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN PUNICODE_STRING SymbolicLinkName OPTIONAL, + IN BOOLEAN CombineNames, + OUT PUNICODE_STRING SuggestedInstanceName + ); + +STDCALL +NTSTATUS +IoWMIWriteEvent( + IN PVOID WnodeEventItem + ); + +STDCALL +NTSTATUS IoWMIOpenBlock( + IN GUID *DataBlockGuid, + IN ULONG DesiredAccess, + OUT PVOID *DataBlockObject + ); + + +STDCALL +NTSTATUS IoWMIQueryAllData( + IN PVOID DataBlockObject, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +); + + +STDCALL +NTSTATUS +IoWMIQueryAllDataMultiple( + IN PVOID *DataBlockObjectList, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +); + + +STDCALL +NTSTATUS +IoWMIQuerySingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +); + +STDCALL +NTSTATUS +IoWMIQuerySingleInstanceMultiple( + IN PVOID *DataBlockObjectList, + IN PUNICODE_STRING InstanceNames, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer +); + +STDCALL +NTSTATUS +IoWMISetSingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer + ); + +STDCALL +NTSTATUS +IoWMISetSingleItem( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG DataItemId, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer + ); + +STDCALL +NTSTATUS +IoWMIExecuteMethod( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN OUT PULONG OutBufferSize, + IN OUT PUCHAR InOutBuffer + ); + +typedef VOID (*WMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context + ); + +STDCALL +NTSTATUS +IoWMISetNotificationCallback( + IN PVOID Object, + IN WMI_NOTIFICATION_CALLBACK Callback, + IN PVOID Context + ); + +STDCALL +NTSTATUS +IoWMIHandleToInstanceName( + IN PVOID DataBlockObject, + IN HANDLE FileHandle, + OUT PUNICODE_STRING InstanceName + ); + +STDCALL +NTSTATUS +IoWMIDeviceObjectToInstanceName( + IN PVOID DataBlockObject, + IN PDEVICE_OBJECT DeviceObject, + OUT PUNICODE_STRING InstanceName + ); + /* --- --- --- INTERNAL or REACTOS ONLY --- --- --- */ diff --git a/reactos/include/ddk/iotypes.h b/reactos/include/ddk/iotypes.h index 59062c83d79..f72280db401 100644 --- a/reactos/include/ddk/iotypes.h +++ b/reactos/include/ddk/iotypes.h @@ -1,4 +1,4 @@ -/* $Id: iotypes.h,v 1.62 2004/01/05 14:28:19 weiden Exp $ +/* $Id: iotypes.h,v 1.63 2004/06/23 21:43:19 ion Exp $ * */ @@ -1089,6 +1089,135 @@ typedef struct _PARTITION_INFORMATION } PARTITION_INFORMATION, *PPARTITION_INFORMATION; #endif +typedef enum _PARTITION_STYLE { + PARTITION_STYLE_MBR, + PARTITION_STYLE_GPT, + PARTITION_STYLE_RAW +} PARTITION_STYLE; + +typedef struct _PARTITION_INFORMATION_GPT { + GUID PartitionType; + GUID PartitionId; + ULONG64 Attributes; + WCHAR Name [36]; +} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; + +typedef struct _PARTITION_INFORMATION_MBR { + UCHAR PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + ULONG HiddenSectors; +} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; + +typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR; +typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT; + +typedef struct _SET_PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + union { + SET_PARTITION_INFORMATION_MBR Mbr; + SET_PARTITION_INFORMATION_GPT Gpt; + }; +} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX; + +typedef struct _CREATE_DISK_GPT { + GUID DiskId; + ULONG MaxPartitionCount; +} CREATE_DISK_GPT, *PCREATE_DISK_GPT; + +typedef struct _CREATE_DISK_MBR { + ULONG Signature; +} CREATE_DISK_MBR, *PCREATE_DISK_MBR; + + +typedef struct _CREATE_DISK { + PARTITION_STYLE PartitionStyle; + union { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + }; +} CREATE_DISK, *PCREATE_DISK; + +typedef struct _DRIVE_LAYOUT_INFORMATION_GPT { + GUID DiskId; + LARGE_INTEGER StartingUsableOffset; + LARGE_INTEGER UsableLength; + ULONG MaxPartitionCount; +} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT; + +typedef struct _DRIVE_LAYOUT_INFORMATION_MBR { + ULONG Signature; +} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR; + +typedef struct _PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + ULONG PartitionNumber; + BOOLEAN RewritePartition; + union { + PARTITION_INFORMATION_MBR Mbr; + PARTITION_INFORMATION_GPT Gpt; + }; +} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX; + +typedef struct _DRIVE_LAYOUT_INFORMATION_EX { + ULONG PartitionStyle; + ULONG PartitionCount; + union { + DRIVE_LAYOUT_INFORMATION_MBR Mbr; + DRIVE_LAYOUT_INFORMATION_GPT Gpt; + }; + PARTITION_INFORMATION_EX PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX; + +typedef struct _BOOTDISK_INFORMATION { + LONGLONG BootPartitionOffset; + LONGLONG SystemPartitionOffset; + ULONG BootDeviceSignature; + ULONG SystemDeviceSignature; +} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION; + + +typedef struct _DISK_SIGNATURE { + ULONG PartitionStyle; + union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + + struct { + GUID DiskId; + } Gpt; + }; +} DISK_SIGNATURE, *PDISK_SIGNATURE; + +typedef struct _REPARSE_DATA_BUFFER { + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + union { + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + }; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; + typedef struct _DRIVER_LAYOUT_INFORMATION { ULONG PartitionCount; @@ -1127,7 +1256,6 @@ typedef struct _IO_MAILSLOT_CREATE_BUFFER LARGE_INTEGER TimeOut; } IO_MAILSLOT_CREATE_BUFFER, *PIO_MAILSLOT_CREATE_BUFFER; - /* error logging */ typedef struct _IO_ERROR_LOG_PACKET From 7f48bb36d77710af98da0d96c93dffaf08d3c198 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:43:45 +0000 Subject: [PATCH 064/356] Added New Io File for stubs svn path=/trunk/; revision=9846 --- reactos/ntoskrnl/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 0ba13084ebc..1d2fc1e5be1 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.126 2004/06/23 21:03:43 ion Exp $ +# $Id: Makefile,v 1.127 2004/06/23 21:43:45 ion Exp $ # # ReactOS Operating System # @@ -222,7 +222,8 @@ OBJECTS_IO = \ io/vpb.o \ io/wdm.o \ io/xhaldisp.o \ - io/xhaldrv.o + io/xhaldrv.o \ + io/wmi.o # Object Manager (Ob) OBJECTS_OB = \ From 5dc4ab6ba966df4e49c8f217ba2870f513617d79 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 21:50:59 +0000 Subject: [PATCH 065/356] Added Ex Stub svn path=/trunk/; revision=9848 --- reactos/ntoskrnl/mm/pool.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index c1c682baea1..e26bcde483d 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -1,4 +1,4 @@ -/* $Id: pool.c,v 1.28 2004/04/10 22:35:25 gdalsnes Exp $ +/* $Id: pool.c,v 1.29 2004/06/23 21:50:59 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -146,7 +146,20 @@ ExAllocatePoolWithQuota (POOL_TYPE PoolType, ULONG NumberOfBytes) return(ExAllocatePoolWithQuotaTag(PoolType, NumberOfBytes, TAG_NONE)); } - +/* + * @unimplemented + */ +PVOID +STDCALL +ExAllocatePoolWithTagPriority( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag, + IN EX_POOL_PRIORITY Priority + ) +{ + UNIMPLEMENTED; +} /* * @unimplemented */ @@ -195,6 +208,20 @@ ExFreePoolWithTag(IN PVOID Block, IN ULONG Tag) ExFreePool(Block); } +/* + * @unimplemented + */ +SIZE_T +STDCALL +ExQueryPoolBlockSize ( + IN PVOID PoolBlock, + OUT PBOOLEAN QuotaCharged + ) +{ + UNIMPLEMENTED; + return FALSE; +} + /* EOF */ From 3d29c6de301716d0d6bc96df84efa2a67d334061 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 22:21:03 +0000 Subject: [PATCH 066/356] Added Ldr Stub Prototypes svn path=/trunk/; revision=9849 --- reactos/include/ddk/ldrfuncs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/include/ddk/ldrfuncs.h b/reactos/include/ddk/ldrfuncs.h index f1988e2d234..e9dafa6a1b0 100644 --- a/reactos/include/ddk/ldrfuncs.h +++ b/reactos/include/ddk/ldrfuncs.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_DDK_LDRFUNCS_H #define __INCLUDE_DDK_LDRFUNCS_H -/* $Id: ldrfuncs.h,v 1.6 2004/06/23 19:48:53 ion Exp $ */ +/* $Id: ldrfuncs.h,v 1.7 2004/06/23 22:21:03 ion Exp $ */ NTSTATUS STDCALL LdrAccessResource(IN PVOID BaseAddress, @@ -14,12 +14,12 @@ LdrFindResource_U(IN PVOID BaseAddress, IN ULONG Level, OUT PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry); -NTSTATUS STDCALL +/*NTSTATUS STDCALL LdrFindResourceDirectory_U( IN PVOID BaseAddress, IN PLDR_RESOURCE_INFO ResourceInfo, IN ULONG Level, OUT PIMAGE_RESOURCE_DIRECTORY *ResourceDirectory); - +*/ NTSTATUS STDCALL LdrEnumResources(IN PVOID BaseAddress, IN PLDR_RESOURCE_INFO ResourceInfo, From c800cdda6e05a389ce829ea345e834a8629510fa Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 22:21:26 +0000 Subject: [PATCH 067/356] Added Ke Stub Prototypes svn path=/trunk/; revision=9850 --- reactos/include/ddk/kefuncs.h | 279 ++++++++++++++++++++++++++++++++-- reactos/include/ddk/ketypes.h | 100 ++++++++++-- 2 files changed, 351 insertions(+), 28 deletions(-) diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index a7aa8ca40bc..bf7ac42dc29 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -1,3 +1,4 @@ + #ifndef __INCLUDE_DDK_KEFUNCS_H #define __INCLUDE_DDK_KEFUNCS_H @@ -257,17 +258,6 @@ KeRaiseIrqlToDpcLevel ( VOID ); -/* - * FUNCTION: Raises a user mode exception - * ARGUMENTS: - * ExceptionCode = Status code of the exception - */ -NTSTATUS -STDCALL -KeRaiseUserException ( - IN NTSTATUS ExceptionCode - ); - LONG STDCALL KeReadStateEvent ( @@ -482,7 +472,11 @@ Ke386IoSetAccessProcess(struct _EPROCESS* Eprocess, BOOL EnableIo); * Value2 = The value of the high dword of the descriptor. */ VOID -KeSetGdtSelector(ULONG Entry, ULONG Value1, ULONG Value2); +KeSetGdtSelector( + ULONG Entry, + ULONG Value1, + ULONG Value2 +); /* * FUNCTION: Releases a set of Global Descriptor Table Selectors @@ -490,8 +484,11 @@ KeSetGdtSelector(ULONG Entry, ULONG Value1, ULONG Value2); * SelArray = * NumOfSelectors = */ -NTSTATUS KeI386ReleaseGdtSelectors(OUT PULONG SelArray, - IN ULONG NumOfSelectors); +NTSTATUS +KeI386ReleaseGdtSelectors( + OUT PULONG SelArray, + IN ULONG NumOfSelectors +); /* * FUNCTION: Allocates a set of Global Descriptor Table Selectors @@ -499,8 +496,11 @@ NTSTATUS KeI386ReleaseGdtSelectors(OUT PULONG SelArray, * SelArray = * NumOfSelectors = */ -NTSTATUS KeI386AllocateGdtSelectors(OUT PULONG SelArray, - IN ULONG NumOfSelectors); +NTSTATUS +KeI386AllocateGdtSelectors( + OUT PULONG SelArray, + IN ULONG NumOfSelectors +); KIRQL @@ -536,4 +536,251 @@ VOID STDCALL KiDeliverApc(ULONG Unknown1, VOID STDCALL KiDispatchInterrupt(VOID); +/* Stubs Start here */ + +STDCALL +VOID +KeReleaseInterruptSpinLock( + IN PKINTERRUPT Interrupt, + IN KIRQL OldIrql + ); + +STDCALL +BOOLEAN +KeAreApcsDisabled( + VOID + ); + +STDCALL +VOID +KeFlushQueuedDpcs( + VOID + ); + +STDCALL +ULONG +KeGetRecommendedSharedDataAlignment( + VOID + ); + +STDCALL +ULONG +KeQueryRuntimeThread( + IN PKTHREAD Thread, + OUT PULONG UserTime + ); + +STDCALL +BOOLEAN +KeSetKernelStackSwapEnable( + IN BOOLEAN Enable + ); + +STDCALL +BOOLEAN +KeDeregisterBugCheckReasonCallback( + IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord + ); + +STDCALL +BOOLEAN +KeRegisterBugCheckReasonCallback( + IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, + IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, + IN KBUGCHECK_CALLBACK_REASON Reason, + IN PUCHAR Component + ); + +STDCALL +VOID +KeTerminateThread( + IN KPRIORITY Increment +); + +STDCALL +VOID +KeIsExecutingDpc( + VOID +); + +STDCALL +VOID +KeSetEventBoostPriority( + IN PKEVENT Event, + IN PKTHREAD *Thread OPTIONAL +); + +STDCALL +PVOID +KeFindConfigurationEntry( + IN PVOID Unknown, + IN ULONG Class, + IN CONFIGURATION_TYPE Type, + IN PULONG RegKey +); + +STDCALL +PVOID +KeFindConfigurationNextEntry( + IN PVOID Unknown, + IN ULONG Class, + IN CONFIGURATION_TYPE Type, + IN PULONG RegKey, + IN PVOID *NextLink +); + +STDCALL +VOID +KeFlushEntireTb( + IN ULONGLONG Flag +); + +STDCALL +VOID +KeRevertToUserAffinityThread( + VOID +); + +STDCALL +VOID +KiCoprocessorError( + VOID +); + +STDCALL +VOID +KiUnexpectedInterrupt( + VOID +); + +STDCALL +VOID +KeSetDmaIoCoherency( + IN ULONG Coherency +); + +STDCALL +VOID +KeSetProfileIrql( + IN KIRQL ProfileIrql +); + +STDCALL +VOID +KeSetSystemAffinityThread( + IN KAFFINITY Affinity +); + +STDCALL +NTSTATUS +KeUserModeCallback( + IN ULONG FunctionID, + IN PVOID InputBuffer, + IN ULONG InputLength, + OUT PVOID *OutputBuffer, + OUT PULONG OutputLength +); + +STDCALL +VOID +KeSetTimeIncrement( + IN ULONG MaxIncrement, + IN ULONG MinIncrement +); + +STDCALL +VOID +KeCapturePersistentThreadState( + IN PVOID CurrentThread, + IN ULONG Setting1, + IN ULONG Setting2, + IN ULONG Setting3, + IN ULONG Setting4, + IN ULONG Setting5, + IN PVOID ThreadState +); + +STDCALL +BOOLEAN +KeRemoveSystemServiceTable( + IN PUCHAR Number +); + +NTSTATUS +KeI386FlatToGdtSelector( + IN ULONG Base, + IN USHORT Length, + IN USHORT Selector +); + +STDCALL +CCHAR +KeSetIdealProcessorThread ( + IN PKTHREAD Thread, + IN CCHAR Processor + ); + +typedef +VOID +(FASTCALL *PTIME_UPDATE_NOTIFY_ROUTINE)( + IN HANDLE ThreadId, + IN KPROCESSOR_MODE Mode + ); + +VOID +FASTCALL +KeSetTimeUpdateNotifyRoutine( + IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine + ); + +STDCALL +PKDEVICE_QUEUE_ENTRY +KeRemoveByKeyDeviceQueueIfBusy ( + IN PKDEVICE_QUEUE DeviceQueue, + IN ULONG SortKey + ); + +STDCALL +KAFFINITY +KeQueryActiveProcessors ( + VOID + ); + +VOID +FASTCALL +KeAcquireInStackQueuedSpinLockAtDpcLevel( + IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle + ); + +VOID +FASTCALL +KeReleaseInStackQueuedSpinLockFromDpcLevel( + IN PKLOCK_QUEUE_HANDLE LockHandle + ); + +STDCALL +KPRIORITY +KeQueryPriorityThread ( + IN PKTHREAD Thread + ); + +STDCALL +KIRQL +KeAcquireInterruptSpinLock( + IN PKINTERRUPT Interrupt + ); + +VOID +__cdecl +KeSaveStateForHibernate( + IN PVOID State +); + +STDCALL +NTSTATUS +KeRaiseUserException( + IN NTSTATUS ExceptionCode +); + #endif /* __INCLUDE_DDK_KEFUNCS_H */ diff --git a/reactos/include/ddk/ketypes.h b/reactos/include/ddk/ketypes.h index aab46e16f5e..3d584aa5167 100644 --- a/reactos/include/ddk/ketypes.h +++ b/reactos/include/ddk/ketypes.h @@ -36,18 +36,7 @@ typedef VOID STDCALL_FUNC struct _DISPATCHER_HEADER; -typedef struct _KWAIT_BLOCK -/* - * PURPOSE: Object describing the wait a thread is currently performing - */ -{ - LIST_ENTRY WaitListEntry; - struct _KTHREAD* Thread; - struct _DISPATCHER_HEADER *Object; - struct _KWAIT_BLOCK* NextWaitBlock; - USHORT WaitKey; - USHORT WaitType; -} KWAIT_BLOCK, *PKWAIT_BLOCK; + #include @@ -163,6 +152,29 @@ typedef struct _KEVENT_PAIR struct _KDPC; +typedef struct _KSPIN_LOCK_QUEUE { + struct _KSPIN_LOCK_QUEUE * volatile Next; + PKSPIN_LOCK volatile Lock; +} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE; + +typedef struct _KLOCK_QUEUE_HANDLE { + KSPIN_LOCK_QUEUE LockQueue; + KIRQL OldIrql; +} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE; + +typedef struct _KWAIT_BLOCK +/* + * PURPOSE: Object describing the wait a thread is currently performing + */ +{ + LIST_ENTRY WaitListEntry; + struct _KTHREAD* Thread; + struct _DISPATCHER_HEADER *Object; + struct _KWAIT_BLOCK* NextWaitBlock; + USHORT WaitKey; + USHORT WaitType; +} KWAIT_BLOCK, *PKWAIT_BLOCK; + /* * PURPOSE: Defines a delayed procedure call routine * NOTE: @@ -229,6 +241,31 @@ typedef struct _WAIT_CONTEXT_BLOCK PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; +typedef enum _KBUGCHECK_CALLBACK_REASON { + KbCallbackInvalid, + KbCallbackReserved1, + KbCallbackSecondaryDumpData, + KbCallbackDumpIo, +} KBUGCHECK_CALLBACK_REASON; + +typedef +VOID +(*PKBUGCHECK_REASON_CALLBACK_ROUTINE) ( + IN KBUGCHECK_CALLBACK_REASON Reason, + IN PVOID Record, // This should be struct _KBUGCHECK_REASON_CALLBACK_RECORD* but minggw doesn't want to allow that... + IN OUT PVOID ReasonSpecificData, + IN ULONG ReasonSpecificDataLength + ); + +typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { + LIST_ENTRY Entry; + PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; + PUCHAR Component; + ULONG_PTR Checksum; + KBUGCHECK_CALLBACK_REASON Reason; + UCHAR State; +} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD; + struct _KINTERRUPT; typedef BOOLEAN STDCALL_FUNC @@ -246,6 +283,45 @@ typedef LONG FLOATL; typedef LONG FIX; /* fixed-point number */ +typedef struct _M128 { + ULONGLONG Low; + LONGLONG High; +} M128, *PM128; + +typedef struct _KEXCEPTION_FRAME { + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5; + ULONG64 InitialStack; + M128 Xmm6; + M128 Xmm7; + M128 Xmm8; + M128 Xmm9; + M128 Xmm10; + M128 Xmm11; + M128 Xmm12; + M128 Xmm13; + M128 Xmm14; + M128 Xmm15; + ULONG64 TrapFrame; + ULONG64 CallbackStack; + ULONG64 OutputBuffer; + ULONG64 OutputLength; + UCHAR ExceptionRecord[64]; + ULONG64 Fill1; + ULONG64 Rbp; + ULONG64 Rbx; + ULONG64 Rdi; + ULONG64 Rsi; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + ULONG64 Return; +} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; + /* copied from W32API */ typedef struct _KFLOATING_SAVE { From 0f47167023286dd5122de00cfec8ecce7f6a9a1c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 22:32:24 +0000 Subject: [PATCH 068/356] Added Ke Stubs svn path=/trunk/; revision=9851 --- reactos/ntoskrnl/ke/apc.c | 12 +++ reactos/ntoskrnl/ke/catch.c | 83 +++++++++++++++++++- reactos/ntoskrnl/ke/device.c | 114 ++++++++++++++++++++++++++++ reactos/ntoskrnl/ke/dpc.c | 40 +++++++++- reactos/ntoskrnl/ke/error.c | 24 ++++++ reactos/ntoskrnl/ke/event.c | 13 ++++ reactos/ntoskrnl/ke/i386/gdt.c | 41 ++++++++++ reactos/ntoskrnl/ke/i386/thread.c | 3 + reactos/ntoskrnl/ke/i386/usercall.c | 32 +++++++- reactos/ntoskrnl/ke/kthread.c | 96 ++++++++++++++++++++++- reactos/ntoskrnl/ke/process.c | 27 ++++++- reactos/ntoskrnl/ke/profile.c | 53 +++++++++++++ reactos/ntoskrnl/ke/spinlock.c | 53 ++++++++++++- reactos/ntoskrnl/ke/timer.c | 70 ++++++++++++++++- 14 files changed, 654 insertions(+), 7 deletions(-) create mode 100644 reactos/ntoskrnl/ke/device.c create mode 100644 reactos/ntoskrnl/ke/profile.c diff --git a/reactos/ntoskrnl/ke/apc.c b/reactos/ntoskrnl/ke/apc.c index e8baa4e9bba..bb798bf1c87 100644 --- a/reactos/ntoskrnl/ke/apc.c +++ b/reactos/ntoskrnl/ke/apc.c @@ -50,6 +50,18 @@ VOID PsTerminateCurrentThread(NTSTATUS ExitStatus); /* FUNCTIONS *****************************************************************/ +/* + * @unimplemented + */ +STDCALL +BOOLEAN +KeAreApcsDisabled( + VOID + ) +{ + UNIMPLEMENTED; +} + VOID KiRundownThread(VOID) /* * FUNCTION: diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index f0c274790f7..d526002d5ee 100644 --- a/reactos/ntoskrnl/ke/catch.c +++ b/reactos/ntoskrnl/ke/catch.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: catch.c,v 1.42 2004/05/07 05:12:10 royce Exp $ +/* $Id: catch.c,v 1.43 2004/06/23 22:31:51 ion Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/catch.c @@ -216,6 +216,46 @@ ExRaiseStatus (IN NTSTATUS Status) } +/* + * @unimplemented + */ +VOID +STDCALL +ExRaiseException ( + PEXCEPTION_RECORD pExcptRec + ) +{ + UNIMPLEMENTED; +} +/* + * @unimplemented + */ +VOID +STDCALL +ExRaiseHardError ( + IN NTSTATUS ErrorStatus, + IN ULONG NumberOfParameters, + IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL, + IN PVOID *Parameters, + IN HARDERROR_RESPONSE_OPTION ResponseOption, + OUT PHARDERROR_RESPONSE Response + ) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +BOOLEAN +STDCALL +ExSystemExceptionFilter() +{ + UNIMPLEMENTED; + return FALSE; +} + NTSTATUS STDCALL NtRaiseException (IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context, @@ -229,6 +269,47 @@ NtRaiseException (IN PEXCEPTION_RECORD ExceptionRecord, return(STATUS_SUCCESS); } +/* + * @unimplemented + */ +STDCALL +BOOLEAN +KeDeregisterBugCheckReasonCallback( + IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +STDCALL +ULONG +KeGetRecommendedSharedDataAlignment( + VOID + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +BOOLEAN +KeRegisterBugCheckReasonCallback( + IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, + IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, + IN KBUGCHECK_CALLBACK_REASON Reason, + IN PUCHAR Component + ) +{ + UNIMPLEMENTED; + return FALSE; +} /* * @implemented diff --git a/reactos/ntoskrnl/ke/device.c b/reactos/ntoskrnl/ke/device.c new file mode 100644 index 00000000000..0241046dfe2 --- /dev/null +++ b/reactos/ntoskrnl/ke/device.c @@ -0,0 +1,114 @@ +/* $Id: device.c,v 1.1 2004/06/23 22:31:51 ion Exp $ + * + * FILE: ntoskrnl/ke/profile.c + * PURPOSE: Kernel Device/Settings Functions + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * UPDATE HISTORY: + * Created 23/06/04 + */ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* + * @unimplemented + */ +STDCALL +PVOID +KeFindConfigurationEntry( + IN PVOID Unknown, + IN ULONG Class, + IN CONFIGURATION_TYPE Type, + IN PULONG RegKey +) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +PVOID +KeFindConfigurationNextEntry( + IN PVOID Unknown, + IN ULONG Class, + IN CONFIGURATION_TYPE Type, + IN PULONG RegKey, + IN PVOID *NextLink +) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeFlushEntireTb( + IN ULONGLONG Flag +) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +VOID +KeSetDmaIoCoherency( + IN ULONG Coherency +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +PKDEVICE_QUEUE_ENTRY +KeRemoveByKeyDeviceQueueIfBusy ( + IN PKDEVICE_QUEUE DeviceQueue, + IN ULONG SortKey + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +KAFFINITY +KeQueryActiveProcessors ( + VOID + ) +{ + UNIMPLEMENTED; + return 0; +} + + +/* + * @unimplemented + */ +VOID +__cdecl +KeSaveStateForHibernate( + IN PVOID State +) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/ke/dpc.c b/reactos/ntoskrnl/ke/dpc.c index bdcbadbf177..df8388d5a63 100644 --- a/reactos/ntoskrnl/ke/dpc.c +++ b/reactos/ntoskrnl/ke/dpc.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dpc.c,v 1.30 2004/01/18 22:42:50 gdalsnes Exp $ +/* $Id: dpc.c,v 1.31 2004/06/23 22:31:51 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -124,6 +124,30 @@ KiDispatchInterrupt(VOID) KeLowerIrql(oldlvl); } +/* + * @unimplemented + */ +STDCALL +VOID +KeFlushQueuedDpcs( + VOID + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeIsExecutingDpc( + VOID +) +{ + UNIMPLEMENTED; +} + /* * @implemented */ @@ -245,4 +269,18 @@ KeInitDpc(VOID) KeInitializeSpinLock(&DpcQueueLock); } +/* + * @unimplemented + * +STDCALL +BOOLEAN +KiIpiServiceRoutine( + IN PKTRAP_FRAME TrapFrame, + IN PKEXCEPTION_FRAME ExceptionFrame +) +{ + UNIMPLEMENTED; + return FALSE; +}*/ + /* EOF */ diff --git a/reactos/ntoskrnl/ke/error.c b/reactos/ntoskrnl/ke/error.c index 8be023b7b4d..d5f473d8ac7 100644 --- a/reactos/ntoskrnl/ke/error.c +++ b/reactos/ntoskrnl/ke/error.c @@ -17,6 +17,30 @@ /* FUNCTIONS ***************************************************************/ +/* + * @unimplemented + */ +STDCALL +VOID +KiCoprocessorError( + VOID +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KiUnexpectedInterrupt( + VOID +) +{ + UNIMPLEMENTED; +} + NTSTATUS STDCALL NtRaiseHardError(IN NTSTATUS Status, ULONG Unknown2, diff --git a/reactos/ntoskrnl/ke/event.c b/reactos/ntoskrnl/ke/event.c index c71303f47b2..52546c6f66c 100644 --- a/reactos/ntoskrnl/ke/event.c +++ b/reactos/ntoskrnl/ke/event.c @@ -136,4 +136,17 @@ NTSTATUS STDCALL KePulseEvent (PKEVENT Event, return ((NTSTATUS)ret); } +/* + * @unimplemented + */ +STDCALL +VOID +KeSetEventBoostPriority( + IN PKEVENT Event, + IN PKTHREAD *Thread OPTIONAL +) +{ + UNIMPLEMENTED; +} + /* EOF */ diff --git a/reactos/ntoskrnl/ke/i386/gdt.c b/reactos/ntoskrnl/ke/i386/gdt.c index 413e9134fba..83d3e3d2374 100644 --- a/reactos/ntoskrnl/ke/i386/gdt.c +++ b/reactos/ntoskrnl/ke/i386/gdt.c @@ -165,6 +165,47 @@ l4: #endif } + +/* + * @unimplemented + */ +NTSTATUS +KeI386FlatToGdtSelector( + IN ULONG Base, + IN USHORT Length, + IN USHORT Selector +) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +NTSTATUS +KeI386ReleaseGdtSelectors( + OUT PULONG SelArray, + IN ULONG NumOfSelectors +) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +NTSTATUS +KeI386AllocateGdtSelectors( + OUT PULONG SelArray, + IN ULONG NumOfSelectors +) +{ + UNIMPLEMENTED; + return 0; +} + VOID KeSetBaseGdtSelector(ULONG Entry, PVOID Base) diff --git a/reactos/ntoskrnl/ke/i386/thread.c b/reactos/ntoskrnl/ke/i386/thread.c index 03f0d2c774e..edf1b6b0838 100644 --- a/reactos/ntoskrnl/ke/i386/thread.c +++ b/reactos/ntoskrnl/ke/i386/thread.c @@ -195,4 +195,7 @@ Ke386InitThread(PKTHREAD Thread, return(STATUS_SUCCESS); } + + + /* EOF */ diff --git a/reactos/ntoskrnl/ke/i386/usercall.c b/reactos/ntoskrnl/ke/i386/usercall.c index 0d628760200..63bc42bd47a 100644 --- a/reactos/ntoskrnl/ke/i386/usercall.c +++ b/reactos/ntoskrnl/ke/i386/usercall.c @@ -1,4 +1,4 @@ -/* $Id: usercall.c,v 1.25 2003/07/11 01:23:15 royce Exp $ +/* $Id: usercall.c,v 1.26 2004/06/23 22:32:24 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -124,4 +124,34 @@ KeAddSystemServiceTable ( return TRUE; } +/* + * @unimplemented + */ +STDCALL +BOOLEAN +KeRemoveSystemServiceTable( + IN PUCHAR Number +) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +STDCALL +NTSTATUS +KeUserModeCallback( + IN ULONG FunctionID, + IN PVOID InputBuffer, + IN ULONG InputLength, + OUT PVOID *OutputBuffer, + OUT PULONG OutputLength +) +{ + UNIMPLEMENTED; + return 0; +} + /* EOF */ diff --git a/reactos/ntoskrnl/ke/kthread.c b/reactos/ntoskrnl/ke/kthread.c index f28a4dd76cc..01c13e9ffbd 100644 --- a/reactos/ntoskrnl/ke/kthread.c +++ b/reactos/ntoskrnl/ke/kthread.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: kthread.c,v 1.46 2003/12/31 05:33:03 jfilby Exp $ +/* $Id: kthread.c,v 1.47 2004/06/23 22:31:51 ion Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Microkernel thread support @@ -38,6 +38,24 @@ /* FUNCTIONS *****************************************************************/ +/* + * @unimplemented + */ +STDCALL +VOID +KeCapturePersistentThreadState( + IN PVOID CurrentThread, + IN ULONG Setting1, + IN ULONG Setting2, + IN ULONG Setting3, + IN ULONG Setting4, + IN ULONG Setting5, + IN PVOID ThreadState +) +{ + UNIMPLEMENTED; +} + VOID KeFreeStackPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, PHYSICAL_ADDRESS PhysAddr, SWAPENTRY SwapEntry, BOOLEAN Dirty) @@ -49,6 +67,19 @@ KeFreeStackPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, } } +/* + * @unimplemented + */ +STDCALL +KPRIORITY +KeQueryPriorityThread ( + IN PKTHREAD Thread + ) +{ + UNIMPLEMENTED; + return 0; +} + NTSTATUS KeReleaseThread(PETHREAD Thread) /* @@ -76,6 +107,19 @@ KeReleaseThread(PETHREAD Thread) return(STATUS_SUCCESS); } +/* + * @unimplemented + */ +STDCALL +BOOLEAN +KeSetKernelStackSwapEnable( + IN BOOLEAN Enable + ) +{ + UNIMPLEMENTED; + return FALSE; +} + VOID KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First) /* @@ -272,3 +316,53 @@ KeRescheduleThread() { PsDispatchThread(THREAD_STATE_READY); } + +/* + * @unimplemented + */ +STDCALL +VOID +KeRevertToUserAffinityThread( + VOID +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +CCHAR +KeSetIdealProcessorThread ( + IN PKTHREAD Thread, + IN CCHAR Processor + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeSetSystemAffinityThread( + IN KAFFINITY Affinity +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeTerminateThread( + IN KPRIORITY Increment +) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/ke/process.c b/reactos/ntoskrnl/ke/process.c index eaa110ee5b0..2c73b114f9a 100644 --- a/reactos/ntoskrnl/ke/process.c +++ b/reactos/ntoskrnl/ke/process.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: process.c,v 1.19 2004/03/09 21:49:53 dwelch Exp $ +/* $Id: process.c,v 1.20 2004/06/23 22:31:51 ion Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/process.c @@ -117,4 +117,29 @@ KeDetachProcess (VOID) KeLowerIrql(oldlvl); } +/* + * @unimplemented + */ +STDCALL +VOID +KeStackAttachProcess ( + IN PKPROCESS Process, + OUT PRKAPC_STATE ApcState + ) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeUnstackDetachProcess ( + IN PRKAPC_STATE ApcState + ) +{ + UNIMPLEMENTED; +} + /* EOF */ diff --git a/reactos/ntoskrnl/ke/profile.c b/reactos/ntoskrnl/ke/profile.c new file mode 100644 index 00000000000..15b72ffb0a0 --- /dev/null +++ b/reactos/ntoskrnl/ke/profile.c @@ -0,0 +1,53 @@ +/* $Id: profile.c,v 1.1 2004/06/23 22:31:51 ion Exp $ + * + * FILE: ntoskrnl/ke/profile.c + * PURPOSE: Kernel Profiling + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * UPDATE HISTORY: + * Created 23/06/04 + */ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* + * @unimplemented + */ +STDCALL +VOID +KeProfileInterrupt( + PKTRAP_FRAME TrapFrame +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeProfileInterruptWithSource( + IN PKTRAP_FRAME TrapFrame, + IN KPROFILE_SOURCE Source +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeSetProfileIrql( + IN KIRQL ProfileIrql +) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/ke/spinlock.c b/reactos/ntoskrnl/ke/spinlock.c index 3fef79b096c..b954fbbd750 100644 --- a/reactos/ntoskrnl/ke/spinlock.c +++ b/reactos/ntoskrnl/ke/spinlock.c @@ -1,4 +1,4 @@ -/* $Id: spinlock.c,v 1.20 2004/01/18 22:41:53 gdalsnes Exp $ +/* $Id: spinlock.c,v 1.21 2004/06/23 22:31:51 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,6 +55,19 @@ KeSynchronizeExecution (PKINTERRUPT Interrupt, return(ret); } +/* + * @unimplemented + */ +STDCALL +KIRQL +KeAcquireInterruptSpinLock( + IN PKINTERRUPT Interrupt + ) +{ + UNIMPLEMENTED; + return 0; +} + /* * @implemented */ @@ -98,6 +111,21 @@ KeAcquireSpinLockAtDpcLevel (PKSPIN_LOCK SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock); } + +/* + * @unimplemented + */ +VOID +FASTCALL +KeAcquireInStackQueuedSpinLockAtDpcLevel( + IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle + ) +{ + UNIMPLEMENTED; +} + + #undef KefReleaseSpinLockFromDpcLevel /* @@ -127,6 +155,17 @@ KeReleaseSpinLockFromDpcLevel (PKSPIN_LOCK SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock); } +/* + * @unimplemented + */ +VOID +FASTCALL +KeReleaseInStackQueuedSpinLockFromDpcLevel( + IN PKLOCK_QUEUE_HANDLE LockHandle + ) +{ + UNIMPLEMENTED; +} /* * @implemented @@ -157,6 +196,18 @@ KiAcquireSpinLock(PKSPIN_LOCK SpinLock) } } +/* + * @unimplemented + */ +STDCALL +VOID +KeReleaseInterruptSpinLock( + IN PKINTERRUPT Interrupt, + IN KIRQL OldIrql + ) +{ + UNIMPLEMENTED; +} /* * @implemented diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index a2a0947a441..bfb7ad2334a 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -1,4 +1,4 @@ -/* $Id: timer.c,v 1.73 2004/06/13 10:35:52 navaraf Exp $ +/* $Id: timer.c,v 1.74 2004/06/23 22:31:51 ion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -475,6 +475,33 @@ KeQueryTickCount(PLARGE_INTEGER TickCount) TickCount->QuadPart = KeTickCount; } +/* + * @unimplemented + */ +STDCALL +ULONG +KeQueryRuntimeThread( + IN PKTHREAD Thread, + OUT PULONG UserTime + ) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeSetTimeIncrement( + IN ULONG MaxIncrement, + IN ULONG MinIncrement +) +{ + UNIMPLEMENTED; +} + /* * We enter this function at IRQL DISPATCH_LEVEL, and with the * TimerListLock held. @@ -718,3 +745,44 @@ KiUpdateProcessThreadTime(VOID) KiReleaseSpinLock(&TimeLock); } + +/* + * @unimplemented + */ +VOID +FASTCALL +KeSetTimeUpdateNotifyRoutine( + IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine + ) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +STDCALL +VOID +KeUpdateRunTime( + IN PKTRAP_FRAME TrapFrame +) +{ + UNIMPLEMENTED; +} + +/* + * @unimplemented + */ +STDCALL +VOID +KeUpdateSystemTime( + IN PKTRAP_FRAME TrapFrame, + IN ULONG Increment +) +{ + UNIMPLEMENTED; +} + +/*EOF*/ + From 5bcda093f3e76431a1b687d72f72945bd01092e9 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Jun 2004 22:32:45 +0000 Subject: [PATCH 069/356] Added new files for Ke Stubs svn path=/trunk/; revision=9852 --- reactos/ntoskrnl/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 1d2fc1e5be1..1e89359f57f 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.127 2004/06/23 21:43:45 ion Exp $ +# $Id: Makefile,v 1.128 2004/06/23 22:32:45 ion Exp $ # # ReactOS Operating System # @@ -130,6 +130,7 @@ OBJECTS_KE = \ ke/catch.o \ ke/critical.o \ ke/dpc.o \ + ke/device.o \ ke/error.o \ ke/event.o \ ke/kqueue.o \ @@ -137,6 +138,7 @@ OBJECTS_KE = \ ke/main.o \ ke/mutex.o \ ke/process.o \ + ke/profile.o \ ke/queue.o \ ke/sem.o \ ke/spinlock.o \ From a3e366fdf99237d4b6829440231d07b5ad7e860f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 24 Jun 2004 07:19:57 +0000 Subject: [PATCH 070/356] Mirror PRKAPC_STATE found in ntoskrnl/include/internal/ps.h svn path=/trunk/; revision=9853 --- reactos/w32api/include/ddk/ntifs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/w32api/include/ddk/ntifs.h b/reactos/w32api/include/ddk/ntifs.h index 0621d83c693..a7697095f09 100644 --- a/reactos/w32api/include/ddk/ntifs.h +++ b/reactos/w32api/include/ddk/ntifs.h @@ -550,7 +550,7 @@ typedef struct _KAPC_STATE { BOOLEAN KernelApcInProgress; BOOLEAN KernelApcPending; BOOLEAN UserApcPending; -} KAPC_STATE, *PKAPC_STATE; +} KAPC_STATE, *PKAPC_STATE, *__restrict PRKAPC_STATE; typedef struct _KGDTENTRY { USHORT LimitLow; From 3a3a3cc0aa6de0b63e56f048fa3c4825f5d31771 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 24 Jun 2004 08:54:03 +0000 Subject: [PATCH 071/356] Fix line breaks. svn path=/trunk/; revision=9854 --- reactos/include/ntos/bootvid.h | 151 ++++++++++++++++----------------- 1 file changed, 75 insertions(+), 76 deletions(-) diff --git a/reactos/include/ntos/bootvid.h b/reactos/include/ntos/bootvid.h index 7a5a1ec0af4..b7c7b729744 100755 --- a/reactos/include/ntos/bootvid.h +++ b/reactos/include/ntos/bootvid.h @@ -1,76 +1,75 @@ -#ifndef __INCLUDE_NTOS_BOOTVID_H -#define __INCLUDE_NTOS_BOOTVID_H - -VOID -STDCALL -InbvAcquireDisplayOwnership(VOID); - -BOOLEAN -STDCALL -InbvCheckDisplayOwnership(VOID); - -BOOLEAN -STDCALL -InbvDisplayString(IN PCHAR String); - -VOID -STDCALL -InbvEnableBootDriver(IN BOOLEAN Enable); - -BOOLEAN -STDCALL -InbvEnableDisplayString(IN BOOLEAN Enable); - -VOID -STDCALL -InbvInstallDisplayStringFilter(IN PVOID Unknown); - -BOOLEAN -STDCALL -InbvIsBootDriverInstalled(VOID); - -VOID -STDCALL -InbvNotifyDisplayOwnershipLost(IN PVOID Callback); - -BOOLEAN -STDCALL -InbvResetDisplay(VOID); - -VOID -STDCALL -InbvSetScrollRegion(IN ULONG Left, - IN ULONG Top, - IN ULONG Width, - IN ULONG Height); - -VOID -STDCALL -InbvSetTextColor(IN ULONG Color); - -VOID -STDCALL -InbvSolidColorFill(IN ULONG Left, - IN ULONG Top, - IN ULONG Width, - IN ULONG Height, - IN ULONG Color); - - -VOID -STDCALL -VidCleanUp(VOID); - -BOOLEAN -STDCALL -VidInitialize(VOID); - -BOOLEAN -STDCALL -VidResetDisplay(VOID); - -BOOLEAN -STDCALL -VidIsBootDriverInstalled(VOID); - -#endif /* __INCLUDE_NTOS_BOOTVID_H */ +#ifndef __INCLUDE_NTOS_BOOTVID_H +#define __INCLUDE_NTOS_BOOTVID_H + +VOID +STDCALL +InbvAcquireDisplayOwnership(VOID); + +BOOLEAN +STDCALL +InbvCheckDisplayOwnership(VOID); + +BOOLEAN +STDCALL +InbvDisplayString(IN PCHAR String); + +VOID +STDCALL +InbvEnableBootDriver(IN BOOLEAN Enable); + +BOOLEAN +STDCALL +InbvEnableDisplayString(IN BOOLEAN Enable); + +VOID +STDCALL +InbvInstallDisplayStringFilter(IN PVOID Unknown); + +BOOLEAN +STDCALL +InbvIsBootDriverInstalled(VOID); + +VOID +STDCALL +InbvNotifyDisplayOwnershipLost(IN PVOID Callback); + +BOOLEAN +STDCALL +InbvResetDisplay(VOID); + +VOID +STDCALL +InbvSetScrollRegion(IN ULONG Left, + IN ULONG Top, + IN ULONG Width, + IN ULONG Height); + +VOID +STDCALL +InbvSetTextColor(IN ULONG Color); + +VOID +STDCALL +InbvSolidColorFill(IN ULONG Left, + IN ULONG Top, + IN ULONG Width, + IN ULONG Height, + IN ULONG Color); + +VOID +STDCALL +VidCleanUp(VOID); + +BOOLEAN +STDCALL +VidInitialize(VOID); + +BOOLEAN +STDCALL +VidResetDisplay(VOID); + +BOOLEAN +STDCALL +VidIsBootDriverInstalled(VOID); + +#endif /* __INCLUDE_NTOS_BOOTVID_H */ From a36e6dca3b76bb7352b62b01dd05a9d5c43f9bee Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 24 Jun 2004 08:54:41 +0000 Subject: [PATCH 072/356] Cosmetic fixes. svn path=/trunk/; revision=9855 --- reactos/w32api/include/ddk/ntddscsi.h | 86 +++++++++++++-------------- reactos/w32api/include/ddk/ntddtape.h | 14 ++--- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/reactos/w32api/include/ddk/ntddscsi.h b/reactos/w32api/include/ddk/ntddscsi.h index 11629cbaa59..ec1a582bfbc 100644 --- a/reactos/w32api/include/ddk/ntddscsi.h +++ b/reactos/w32api/include/ddk/ntddscsi.h @@ -98,53 +98,53 @@ typedef struct _SCSI_PASS_THROUGH_DIRECT { UCHAR Cdb[16]; } SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; -typedef struct _SRB_IO_CONTROL { - ULONG HeaderLength; - UCHAR Signature[8]; - ULONG Timeout; - ULONG ControlCode; - ULONG ReturnCode; - ULONG Length; -} SRB_IO_CONTROL, *PSRB_IO_CONTROL; +typedef struct _SRB_IO_CONTROL { + ULONG HeaderLength; + UCHAR Signature[8]; + ULONG Timeout; + ULONG ControlCode; + ULONG ReturnCode; + ULONG Length; +} SRB_IO_CONTROL, *PSRB_IO_CONTROL; typedef struct _SCSI_ADDRESS { - ULONG Length; - UCHAR PortNumber; - UCHAR PathId; - UCHAR TargetId; - UCHAR Lun; + ULONG Length; + UCHAR PortNumber; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; } SCSI_ADDRESS, *PSCSI_ADDRESS; typedef struct _SCSI_BUS_DATA { - UCHAR NumberOfLogicalUnits; - UCHAR InitiatorBusId; - ULONG InquiryDataOffset; + UCHAR NumberOfLogicalUnits; + UCHAR InitiatorBusId; + ULONG InquiryDataOffset; }SCSI_BUS_DATA, *PSCSI_BUS_DATA; typedef struct _SCSI_ADAPTER_BUS_INFO { - UCHAR NumberOfBuses; - SCSI_BUS_DATA BusData[1]; + UCHAR NumberOfBuses; + SCSI_BUS_DATA BusData[1]; } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO; typedef struct _IO_SCSI_CAPABILITIES { - ULONG Length; - ULONG MaximumTransferLength; - ULONG MaximumPhysicalPages; - ULONG SupportedAsynchronousEvents; - ULONG AlignmentMask; - BOOLEAN TaggedQueuing; - BOOLEAN AdapterScansDown; - BOOLEAN AdapterUsesPio; + ULONG Length; + ULONG MaximumTransferLength; + ULONG MaximumPhysicalPages; + ULONG SupportedAsynchronousEvents; + ULONG AlignmentMask; + BOOLEAN TaggedQueuing; + BOOLEAN AdapterScansDown; + BOOLEAN AdapterUsesPio; } IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES; typedef struct _SCSI_INQUIRY_DATA { - UCHAR PathId; - UCHAR TargetId; - UCHAR Lun; - BOOLEAN DeviceClaimed; - ULONG InquiryDataLength; - ULONG NextInquiryDataOffset; - UCHAR InquiryData[1]; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + BOOLEAN DeviceClaimed; + ULONG InquiryDataLength; + ULONG NextInquiryDataOffset; + UCHAR InquiryData[1]; } SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA; #define SCSI_IOCTL_DATA_OUT 0 @@ -152,16 +152,16 @@ typedef struct _SCSI_INQUIRY_DATA { #define SCSI_IOCTL_DATA_UNSPECIFIED 2 typedef struct _DUMP_POINTERS { - PADAPTER_OBJECT AdapterObject; - PVOID MappedRegisterBase; - PVOID DumpData; - PVOID CommonBufferVa; - LARGE_INTEGER CommonBufferPa; - ULONG CommonBufferSize; - BOOLEAN AllocateCommonBuffers; - BOOLEAN UseDiskDump; - UCHAR Spare1[2]; - PVOID DeviceObject; + PADAPTER_OBJECT AdapterObject; + PVOID MappedRegisterBase; + PVOID DumpData; + PVOID CommonBufferVa; + LARGE_INTEGER CommonBufferPa; + ULONG CommonBufferSize; + BOOLEAN AllocateCommonBuffers; + BOOLEAN UseDiskDump; + UCHAR Spare1[2]; + PVOID DeviceObject; } DUMP_POINTERS, *PDUMP_POINTERS; #ifdef __cplusplus diff --git a/reactos/w32api/include/ddk/ntddtape.h b/reactos/w32api/include/ddk/ntddtape.h index 1b3b0499098..61a50df2607 100644 --- a/reactos/w32api/include/ddk/ntddtape.h +++ b/reactos/w32api/include/ddk/ntddtape.h @@ -46,7 +46,7 @@ extern "C" { #define IOCTL_TAPE_GET_DRIVE_PARAMS CTL_CODE(IOCTL_TAPE_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_TAPE_GET_MEDIA_PARAMS CTL_CODE(IOCTL_TAPE_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_TAPE_GET_POSITION CTL_CODE(IOCTL_TAPE_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) -#define IOCTL_TAPE_GET_STATUS CTL_CODE(IOCTL_TAPE_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS ) +#define IOCTL_TAPE_GET_STATUS CTL_CODE(IOCTL_TAPE_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_TAPE_PREPARE CTL_CODE(IOCTL_TAPE_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_TAPE_SET_DRIVE_PARAMS CTL_CODE(IOCTL_TAPE_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) @@ -56,19 +56,19 @@ extern "C" { typedef enum _TAPE_DRIVE_PROBLEM_TYPE { - TapeDriveProblemNone, + TapeDriveProblemNone, TapeDriveReadWriteWarning, - TapeDriveReadWriteError, + TapeDriveReadWriteError, TapeDriveReadWarning, TapeDriveWriteWarning, TapeDriveReadError, - TapeDriveWriteError, + TapeDriveWriteError, TapeDriveHardwareError, - TapeDriveUnsupportedMedia, + TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError, - TapeDriveTimetoClean, + TapeDriveTimetoClean, TapeDriveCleanDriveNow, - TapeDriveMediaLifeExpired, + TapeDriveMediaLifeExpired, TapeDriveSnappedTape } TAPE_DRIVE_PROBLEM_TYPE; From 87cc4ce95f662d3ed873fcae21518876014ede8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 24 Jun 2004 09:17:33 +0000 Subject: [PATCH 073/356] Create temp directory svn path=/trunk/; revision=9856 --- reactos/lib/syssetup/install.c | 61 +++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/reactos/lib/syssetup/install.c b/reactos/lib/syssetup/install.c index fd382d30ef1..048373e2e4f 100644 --- a/reactos/lib/syssetup/install.c +++ b/reactos/lib/syssetup/install.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: install.c,v 1.12 2004/04/19 10:54:23 ekohl Exp $ +/* $Id: install.c,v 1.13 2004/06/24 09:17:33 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -192,6 +192,62 @@ RestartDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return FALSE; } +static VOID +CreateTempDir(LPCWSTR VarName) +{ + WCHAR szTempDir[MAX_PATH]; + WCHAR szBuffer[MAX_PATH]; + DWORD dwLength; + HKEY hKey; + + if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", + 0, + KEY_ALL_ACCESS, + &hKey)) + { + DebugPrint("Error: %lu\n", GetLastError()); + return; + } + + /* Get temp dir */ + dwLength = MAX_PATH * sizeof(WCHAR); + if (RegQueryValueExW (hKey, + VarName, + NULL, + NULL, + (LPBYTE)szBuffer, + &dwLength)) + { + DebugPrint("Error: %lu\n", GetLastError()); + RegCloseKey (hKey); + return; + } + + /* Expand it */ + if (!ExpandEnvironmentStringsW (szBuffer, + szTempDir, + MAX_PATH)) + { + DebugPrint("Error: %lu\n", GetLastError()); + RegCloseKey (hKey); + return; + } + + /* Create profiles directory */ + if (!CreateDirectoryW (szTempDir, NULL)) + { + if (GetLastError () != ERROR_ALREADY_EXISTS) + { + DebugPrint("Error: %lu\n", GetLastError()); + RegCloseKey (hKey); + return; + } + } + + RegCloseKey (hKey); +} + DWORD STDCALL InstallReactOS (HINSTANCE hInstance) { @@ -284,6 +340,9 @@ InstallReactOS (HINSTANCE hInstance) RtlFreeSid (AdminSid); RtlFreeSid (DomainSid); + CreateTempDir(L"TEMP"); + CreateTempDir(L"TMP"); + #if 1 InstallWizard (); #endif From 008c89dfcef7a032f9dc5a955f752f817452575c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 24 Jun 2004 09:19:52 +0000 Subject: [PATCH 074/356] Remove duplicate "All Users" path component svn path=/trunk/; revision=9857 --- reactos/bootdata/hivesft.inf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index d186b82b6cc..45877bbccb1 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -12,12 +12,12 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00020 HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Desktop",0x00020000,"%ALLUSERSPROFILE%\Desktop" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common AppData",0x00020000,"%ALLUSERSPROFILE%\Application Data" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Programs",0x00020000,"%ALLUSERSPROFILE%\Start Menu\Programs" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Documents",0x00020000,"%ALLUSERSPROFILE%\All Users\Documents" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Desktop",0x00020000,"%ALLUSERSPROFILE%\All Users\Desktop" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Start Menu",0x00020000,"%ALLUSERSPROFILE%\All Users\Start Menu" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonPictures",0x00020000,"%ALLUSERSPROFILE%\All Users\Documents\My Pictures" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonMusic",0x00020000,"%ALLUSERSPROFILE%\All Users\Documents\My Music" -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonVideo",0x00020000,"%ALLUSERSPROFILE%\All Users\Documents\My Videos" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Documents",0x00020000,"%ALLUSERSPROFILE%\Documents" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Desktop",0x00020000,"%ALLUSERSPROFILE%\Desktop" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Start Menu",0x00020000,"%ALLUSERSPROFILE%\Start Menu" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonPictures",0x00020000,"%ALLUSERSPROFILE%\Documents\My Pictures" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonMusic",0x00020000,"%ALLUSERSPROFILE%\Documents\My Music" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","CommonVideo",0x00020000,"%ALLUSERSPROFILE%\Documents\My Videos" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Favorites",0x00020000,"%ALLUSERSPROFILE%\Favorites" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Startup",0x00020000,"%ALLUSERSPROFILE%\Start Menu\Programs\Startup" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Administrative Tools",0x00020000,"%ALLUSERSPROFILE%\Start Menu\Programs\Administrative Tools" From 3977da5dc6c154521575e33eda65a8c4a8345fdb Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 24 Jun 2004 09:44:06 +0000 Subject: [PATCH 075/356] 1.fixed return type for NtSystemParametersInfo() 2. added missing definitions (NT5.1+) for SystemParametersInfo() to w32api svn path=/trunk/; revision=9858 --- reactos/include/win32k/ntuser.h | 2 +- reactos/subsys/win32k/ntuser/misc.c | 10 ++-------- reactos/w32api/include/winuser.h | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 7b81cad034c..dff98382f37 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1538,7 +1538,7 @@ STDCALL NtUserSwitchDesktop( HDESK hDesktop); -DWORD +BOOL STDCALL NtUserSystemParametersInfo( UINT uiAction, diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 7bf91eb4b1d..a0b1f75dea9 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.79 2004/06/20 00:45:36 navaraf Exp $ +/* $Id: misc.c,v 1.80 2004/06/24 09:44:06 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,12 +17,6 @@ /* registered Logon process */ PW32PROCESS LogonProcess = NULL; -/* FIXME - not yet defined in w32api :( */ -#define SPI_GETFOCUSBORDERWIDTH (8206) -#define SPI_SETFOCUSBORDERWIDTH (8207) -#define SPI_GETFOCUSBORDERHEIGHT (8208) -#define SPI_SETFOCUSBORDERHEIGHT (8209) - void W32kRegisterPrimitiveMessageQueue() { extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue; if( !pmPrimitiveMessageQueue ) { @@ -819,7 +813,7 @@ IntSystemParametersInfo( /* * @implemented */ -DWORD +BOOL STDCALL NtUserSystemParametersInfo( UINT uiAction, diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 51ef91b698a..bb7c528ad53 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -1249,6 +1249,25 @@ extern "C" { #define SPI_SETSELECTIONFADE 0x1015 #define SPI_SETTOOLTIPANIMATION 0x1017 #define SPI_SETTOOLTIPFADE 0x1019 +#if (WINVER >= 0x0501) +#define FE_FONTSMOOTHINGORIENTATIONBGR 0 +#define FE_FONTSMOOTHINGORIENTATIONRGB 1 +#define FE_FONTSMOOTHINGSTANDARD 1 +#define FE_FONTSMOOTHINGCLEARTYPE 2 +#define FE_FONTSMOOTHINGDOCKING 32768 +#define SPI_GETMOUSECLICKLOCKTIME 8200 +#define SPI_SETMOUSECLICKLOCKTIME 8201 +#define SPI_GETFONTSMOOTHINGTYPE 8202 +#define SPI_SETFONTSMOOTHINGTYPE 8203 +#define SPI_GETFONTSMOOTHINGCONTRAST 8204 +#define SPI_SETFONTSMOOTHINGCONTRAST 8205 +#define SPI_GETFOCUSBORDERWIDTH 8206 +#define SPI_SETFOCUSBORDERWIDTH 8207 +#define SPI_GETFOCUSBORDERHEIGHT 8208 +#define SPI_SETFOCUSBORDERHEIGHT 8209 +#define SPI_GETFONTSMOOTHINGORIENTATION 8210 +#define SPI_SETFONTSMOOTHINGORIENTATION 8211 +#endif #endif #define SPIF_UPDATEINIFILE 1 From 9f03850ba77c77457613e257dbd8488756b26caf Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 24 Jun 2004 11:02:56 +0000 Subject: [PATCH 076/356] fixed redefinition of some constants for SystemParametersInfo() svn path=/trunk/; revision=9859 --- reactos/lib/user32/windows/draw.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reactos/lib/user32/windows/draw.c b/reactos/lib/user32/windows/draw.c index bfd06096ead..1981bc1a5c6 100644 --- a/reactos/lib/user32/windows/draw.c +++ b/reactos/lib/user32/windows/draw.c @@ -40,11 +40,6 @@ #include #include -/* FIXME - not yet defined in w32api :( */ -#define SPI_GETFOCUSBORDERWIDTH (8206) -#define SPI_SETFOCUSBORDERWIDTH (8207) -#define SPI_GETFOCUSBORDERHEIGHT (8208) -#define SPI_SETFOCUSBORDERHEIGHT (8209) #define COLOR_MENUHILIGHT (29) #define COLOR_MENUBAR (30) From 41871db16ccbba03ec84c9ecdf79f867592f766f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 24 Jun 2004 14:48:33 +0000 Subject: [PATCH 077/356] Create user specific temp directory. svn path=/trunk/; revision=9860 --- reactos/lib/userenv/setup.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/userenv/setup.c b/reactos/lib/userenv/setup.c index 835a8945124..753afd1c02f 100644 --- a/reactos/lib/userenv/setup.c +++ b/reactos/lib/userenv/setup.c @@ -1,4 +1,4 @@ -/* $Id: setup.c,v 1.4 2004/03/13 20:49:07 ekohl Exp $ +/* $Id: setup.c,v 1.5 2004/06/24 14:48:33 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -36,7 +36,9 @@ DefaultUserDirectories[] = {FALSE, L"Start Menu"}, {FALSE, L"Start Menu\\Programs"}, {FALSE, L"Start Menu\\Programs\\Startup"}, - + {TRUE, L"Local Settings"}, + {TRUE, L"Local Settings\\Application Data"}, + {FALSE, L"Local Settings\\Temp"}, {FALSE, NULL} }; From 4e65adddb3b3ea7909c0a0f51080cf88e2c62142 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 24 Jun 2004 14:49:26 +0000 Subject: [PATCH 078/356] Set user specific TEMP and TMP environment variables. svn path=/trunk/; revision=9861 --- reactos/bootdata/hivedef.inf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/bootdata/hivedef.inf b/reactos/bootdata/hivedef.inf index 15fcec6375b..e75c736219b 100644 --- a/reactos/bootdata/hivedef.inf +++ b/reactos/bootdata/hivedef.inf @@ -11,6 +11,8 @@ HKCU,"Control Panel\International",,0x00000012 HKCU,"Control Panel\International","Locale",0x00000000,"0409" HKCU,"Environment",,0x00000012 +HKCU,"Environment","TEMP",0x00020000,"%USERPROFILE%\Local Settings\Temp" +HKCU,"Environment","TMP",0x00020000,"%USERPROFILE%\Local Settings\Temp" HKCU,"SOFTWARE",,0x00000012 HKCU,"SOFTWARE\Microsoft",,0x00000012 From 730275c8004825c922883eb16556f8ad3d690605 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Thu, 24 Jun 2004 19:30:21 +0000 Subject: [PATCH 079/356] Moved common SEH code to Rtl svn path=/trunk/; revision=9862 --- reactos/lib/rtl/exception.c | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 reactos/lib/rtl/exception.c diff --git a/reactos/lib/rtl/exception.c b/reactos/lib/rtl/exception.c new file mode 100644 index 00000000000..cffc56a92e7 --- /dev/null +++ b/reactos/lib/rtl/exception.c @@ -0,0 +1,68 @@ +/* $Id: exception.c,v 1.1 2004/06/24 19:30:21 hyperion Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: User-mode exception support + * FILE: lib/ntdll/rtl/exception.c + * PROGRAMERS: David Welch + * Skywing + * KJK::Hyperion + * UPDATES: Skywing, 09/11/2003: Implemented RtlRaiseException and + * KiUserRaiseExceptionDispatcher. + * KJK::Hyperion, 22/06/2004: Moved the common parts here, + * left the user-mode code in ntdll + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS ***************************************************************/ + +/* implemented in except.s */ +VOID +RtlpCaptureContext(PCONTEXT Context); + +/* + * @implemented + */ +VOID STDCALL +RtlRaiseException(PEXCEPTION_RECORD ExceptionRecord) +{ + CONTEXT Context; + NTSTATUS Status; + + RtlpCaptureContext(&Context); + + ExceptionRecord->ExceptionAddress = (PVOID)(*(((PULONG)Context.Ebp)+1)); + Context.ContextFlags = CONTEXT_FULL; + + Status = ZwRaiseException(ExceptionRecord, &Context, TRUE); + RtlRaiseException(ExceptionRecord); + RtlRaiseStatus(Status); /* If we get to this point, something is seriously wrong... */ +} + +/* + * @implemented + */ +VOID STDCALL +RtlRaiseStatus(NTSTATUS Status) +{ + EXCEPTION_RECORD ExceptionRecord; + + DPRINT("RtlRaiseStatus(Status 0x%.08x)\n", Status); + + ExceptionRecord.ExceptionCode = Status; + ExceptionRecord.ExceptionRecord = NULL; + ExceptionRecord.NumberParameters = 0; + ExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + RtlRaiseException (& ExceptionRecord); +} + +/* EOF */ From f477796b79e6fdd3b399b806310752e45dffcdcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 24 Jun 2004 19:43:49 +0000 Subject: [PATCH 080/356] Fix some forgotten EngCreateBitmap() calls svn path=/trunk/; revision=9863 --- reactos/subsys/win32k/eng/misc.c | 4 ++-- reactos/subsys/win32k/eng/mouse.c | 8 ++++---- reactos/subsys/win32k/objects/objconv.c | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/eng/misc.c b/reactos/subsys/win32k/eng/misc.c index 497dad6e487..624d2a3ee69 100644 --- a/reactos/subsys/win32k/eng/misc.c +++ b/reactos/subsys/win32k/eng/misc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: misc.c,v 1.6 2004/05/10 17:07:17 weiden Exp $ */ +/* $Id: misc.c,v 1.7 2004/06/24 19:43:48 gvg Exp $ */ #include BOOL STDCALL @@ -63,7 +63,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, Width = DIB_GetDIBWidthBytes(BitmapSize.cx, BitsPerFormat(DestObj->iBitmapFormat)); EnterLeave->OutputBitmap = EngCreateBitmap(BitmapSize, Width, DestObj->iBitmapFormat, - BMF_NOZEROINIT, NULL); + BMF_TOPDOWN | BMF_NOZEROINIT, NULL); *OutputObj = (SURFOBJ *) AccessUserObject((ULONG) EnterLeave->OutputBitmap); EnterLeave->DestRect.left = 0; diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 070329475ba..f4cb162aa09 100644 --- a/reactos/subsys/win32k/eng/mouse.c +++ b/reactos/subsys/win32k/eng/mouse.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: mouse.c,v 1.72 2004/06/20 12:34:17 navaraf Exp $ +/* $Id: mouse.c,v 1.73 2004/06/24 19:43:48 gvg Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -554,7 +554,7 @@ EngSetPointerShape( memcpy(Bits, psoColor->pvBits, psoColor->cjBits); ppdev->PointerColorSurface = (HSURF)EngCreateBitmap(Size, - psoColor->lDelta, psoColor->iBitmapFormat, 0, Bits); + psoColor->lDelta, psoColor->iBitmapFormat, BMF_TOPDOWN, Bits); } else { @@ -571,7 +571,7 @@ EngSetPointerShape( memcpy(Bits, psoMask->pvBits, psoMask->cjBits); ppdev->PointerMaskSurface = (HSURF)EngCreateBitmap(Size, - psoMask->lDelta, psoMask->iBitmapFormat, 0, Bits); + psoMask->lDelta, psoMask->iBitmapFormat, BMF_TOPDOWN, Bits); } /* @@ -626,7 +626,7 @@ EngSetPointerShape( } ppdev->PointerSaveSurface = (HSURF)EngCreateBitmap( - Size, lDelta, pso->iBitmapFormat, BMF_NOZEROINIT, NULL); + Size, lDelta, pso->iBitmapFormat, BMF_TOPDOWN | BMF_NOZEROINIT, NULL); } IntShowMousePointer(ppdev, pso); diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c index 0ffea950ff9..442d7bfc1ca 100644 --- a/reactos/subsys/win32k/objects/objconv.c +++ b/reactos/subsys/win32k/objects/objconv.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: objconv.c,v 1.19 2004/06/23 07:31:22 gvg Exp $ */ +/* $Id: objconv.c,v 1.20 2004/06/24 19:43:49 gvg Exp $ */ #include HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) @@ -31,7 +31,8 @@ HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) { BitmapHandle = EngCreateBitmap(Size, BitmapObj->dib->dsBm.bmWidthBytes, BitmapFormat(BitmapObj->dib->dsBm.bmBitsPixel, BI_RGB), - BMF_TOPDOWN, BitmapObj->dib->dsBm.bmBits); + BitmapObj->dib->dsBmih.biHeight < 0 ? BMF_TOPDOWN : 0, + BitmapObj->dib->dsBm.bmBits); } else { From 27080109867cd4a51b0c9af4218aaf970b489d4d Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 24 Jun 2004 21:03:56 +0000 Subject: [PATCH 081/356] Added Ke Stub Prototypes svn path=/trunk/; revision=9864 --- reactos/ntoskrnl/include/internal/ps.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index 78247d95e6a..97b93dc8f5d 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: ps.h,v 1.59 2004/06/23 21:02:16 ion Exp $ +/* $Id: ps.h,v 1.60 2004/06/24 21:03:56 ion Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Process manager definitions @@ -510,13 +510,13 @@ STDCALL VOID KeStackAttachProcess ( IN PKPROCESS Process, - OUT PRKAPC_STATE ApcState + OUT PKAPC_STATE ApcState ); STDCALL VOID KeUnstackDetachProcess ( - IN PRKAPC_STATE ApcState + IN PKAPC_STATE ApcState ); VOID STDCALL PiDeleteProcess(PVOID ObjectBody); From 7fa558788216d79fd9f5148f1f7af5fd0f47e7b2 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Fri, 25 Jun 2004 01:41:20 +0000 Subject: [PATCH 082/356] Committed in the hope CVS will shut the hell up and let me branch. Still part of the SEH work svn path=/trunk/; revision=9865 --- reactos/lib/rtl/i386/except.s | 291 +++++++++++++++++++++ reactos/lib/rtl/i386/exception.c | 417 +++++++++++++++++++++++++++++++ 2 files changed, 708 insertions(+) create mode 100644 reactos/lib/rtl/i386/except.s create mode 100644 reactos/lib/rtl/i386/exception.c diff --git a/reactos/lib/rtl/i386/except.s b/reactos/lib/rtl/i386/except.s new file mode 100644 index 00000000000..bd0a78f235a --- /dev/null +++ b/reactos/lib/rtl/i386/except.s @@ -0,0 +1,291 @@ +/* $Id: except.s,v 1.1 2004/06/25 01:41:19 hyperion Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: User-mode exception support for IA-32 + * FILE: lib/ntdll/rtl/i386/except.s + * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + * NOTES: This file is shared with ntoskrnl/rtl/i386/except.s. + * Please keep them in sync. + */ + +#define EXCEPTION_UNWINDING 0x02 + +#define EREC_FLAGS 0x04 + +#define ExceptionContinueExecution 0 +#define ExceptionContinueSearch 1 +#define ExceptionNestedException 2 +#define ExceptionCollidedUnwind 3 + +.globl _RtlpExecuteHandlerForException +.globl _RtlpExecuteHandlerForUnwind + +#define CONTEXT_FLAGS 0x00 +#define CONTEXT_SEGGS 0x8C +#define CONTEXT_SEGFS 0x90 +#define CONTEXT_SEGES 0x94 +#define CONTEXT_SEGDS 0x98 +#define CONTEXT_EDI 0x9C +#define CONTEXT_ESI 0xA0 +#define CONTEXT_EBX 0xA4 +#define CONTEXT_EDX 0xA8 +#define CONTEXT_ECX 0xAC +#define CONTEXT_EAX 0xB0 +#define CONTEXT_EBP 0xB4 +#define CONTEXT_EIP 0xB8 +#define CONTEXT_SEGCS 0xBC +#define CONTEXT_EFLAGS 0xC0 +#define CONTEXT_ESP 0xC4 +#define CONTEXT_SEGSS 0xC8 + + +#define RCC_CONTEXT 0x08 + +// EAX = value to print +_do_debug: + pushal + pushl %eax + call _AsmDebug@4 + popal + ret + +#ifndef __NTOSKRNL__ + +// +// VOID +// RtlpCaptureContext(PCONTEXT pContext); +// +// Parameters: +// [ESP+08h] - PCONTEXT_X86 pContext +// Registers: +// None +// Returns: +// Nothing +// Notes: +// Grabs the current CPU context. +.globl _RtlpCaptureContext +_RtlpCaptureContext: + pushl %ebp + movl %esp, %ebp + movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure + + cld + pushf + pop %eax + movl %eax, CONTEXT_EFLAGS(%edx) + xorl %eax, %eax + movl %eax, CONTEXT_EAX(%edx) + movl %eax, CONTEXT_EBX(%edx) + movl %eax, CONTEXT_ECX(%edx) + movl %eax, CONTEXT_EDX(%edx) + movl %eax, CONTEXT_ESI(%edx) + movl %eax, CONTEXT_EDI(%edx) + movl %cs, %eax + movl %eax, CONTEXT_SEGCS(%edx) + movl %ds, %eax + movl %eax, CONTEXT_SEGDS(%edx) + movl %es, %eax + movl %eax, CONTEXT_SEGES(%edx) + movl %fs, %eax + movl %eax, CONTEXT_SEGFS(%edx) + movl %gs, %eax + movl %eax, CONTEXT_SEGGS(%edx) + movl %ss, %eax + movl %eax, CONTEXT_SEGSS(%edx) + + // + // STACK LAYOUT: - (ESP to put in context structure) + // - RETURN ADDRESS OF CALLER OF CALLER + // - EBP OF CALLER OF CALLER + // ... + // - RETURN ADDRESS OF CALLER + // - EBP OF CALLER + // ... + // + + // Get return address of the caller of the caller of this function + movl %ebp, %ebx + //movl 4(%ebx), %eax // EAX = return address of caller + movl (%ebx), %ebx // EBX = EBP of caller + + movl 4(%ebx), %eax // EAX = return address of caller of caller + movl (%ebx), %ebx // EBX = EBP of caller of caller + + movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller + movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller + addl $8, %ebx + movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 + + movl %ebp, %esp + popl %ebp + ret + +#endif /* !__NTOSKRNL__ */ + +#define REH_ERECORD 0x08 +#define REH_RFRAME 0x0C +#define REH_CONTEXT 0x10 +#define REH_DCONTEXT 0x14 +#define REH_EROUTINE 0x18 + +// Parameters: +// None +// Registers: +// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord +// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame +// [EBP+10h] - PVOID Context +// [EBP+14h] - PVOID DispatcherContext +// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine +// EDX - Address of protecting exception handler +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Setup the protecting exception handler and call the exception +// handler in the right context. +_RtlpExecuteHandler: + pushl %ebp + movl %esp, %ebp + pushl REH_RFRAME(%ebp) + + pushl %edx + pushl %fs:0x0 + movl %esp, %fs:0x0 + + // Prepare to call the exception handler + pushl REH_DCONTEXT(%ebp) + pushl REH_CONTEXT(%ebp) + pushl REH_RFRAME(%ebp) + pushl REH_ERECORD(%ebp) + + // Now call the exception handler + movl REH_EROUTINE(%ebp), %eax + call *%eax + + cmpl $-1, %fs:0x0 + jne .reh_stack_looks_ok + + // This should not happen + pushl 0 + pushl 0 + pushl 0 + pushl 0 + call _RtlAssert@16 + +.reh_loop: + jmp .reh_loop + +.reh_stack_looks_ok: + movl %fs:0x0, %esp + + // Return to the 'front-end' for this function + popl %fs:0x0 + movl %ebp, %esp + popl %ebp + ret + + +#define REP_ERECORD 0x04 +#define REP_RFRAME 0x08 +#define REP_CONTEXT 0x0C +#define REP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting nested exceptions. +_RtlpExceptionProtector: + movl $ExceptionContinueSearch, %eax + movl REP_ERECORD(%esp), %ecx + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jnz .rep_end + + // Unwinding is not taking place, so return ExceptionNestedException + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a nested exception occurred + movl REP_DCONTEXT(%esp), %ecx + movl REP_RFRAME(%esp), %eax + movl %eax, (%ecx) + movl $ExceptionNestedException, %eax + +.rep_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Front-end +_RtlpExecuteHandlerForException: + movl $_RtlpExceptionProtector, %edx + jmp _RtlpExecuteHandler + + +#define RUP_ERECORD 0x04 +#define RUP_RFRAME 0x08 +#define RUP_CONTEXT 0x0C +#define RUP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting collided unwinds. +_RtlpUnwindProtector: + movl $ExceptionContinueSearch, %eax + movl %ecx, RUP_ERECORD(%esp) + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jz .rup_end + + // Unwinding is taking place, so return ExceptionCollidedUnwind + + movl RUP_RFRAME(%esp), %ecx + movl RUP_DCONTEXT(%esp), %edx + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a collision occurred + movl RUP_RFRAME(%ecx), %eax + movl %eax, (%edx) + movl $ExceptionCollidedUnwind, %eax + +.rup_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +_RtlpExecuteHandlerForUnwind: + movl $_RtlpUnwindProtector, %edx + jmp _RtlpExecuteHandler diff --git a/reactos/lib/rtl/i386/exception.c b/reactos/lib/rtl/i386/exception.c new file mode 100644 index 00000000000..ea80bc90a4a --- /dev/null +++ b/reactos/lib/rtl/i386/exception.c @@ -0,0 +1,417 @@ +/* $Id: exception.c,v 1.1 2004/06/25 01:41:20 hyperion Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: User-mode exception support for IA-32 + * FILE: lib/ntdll/rtl/i386/exception.c + * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +//#define NDEBUG +#include + +/* FUNCTIONS ***************************************************************/ + +/* Implemented in except.s */ + +VOID +RtlpCaptureContext(PCONTEXT pContext); + +#define SehpGetStackLimits(StackBase, StackLimit) \ +{ \ + (*(StackBase)) = NtCurrentTeb()->Tib->StackBase; \ + (*(StackLimit)) = NtCurrentTeb()->Tib->StackLimit; \ +} + +#define SehpGetExceptionList() \ + (PEXCEPTION_REGISTRATION)(NtCurrentTeb()->Tib.ExceptionList) + +#define SehpSetExceptionList(NewExceptionList) \ + NtCurrentTeb()->Tib.ExceptionList = (PVOID)(NewExceptionList) + +VOID STDCALL +AsmDebug(ULONG Value) +{ + DbgPrint("Value 0x%.08x\n", Value); +} + + +/* Declare a few prototypes for the functions in except.s */ + +EXCEPTION_DISPOSITION +RtlpExecuteHandlerForException( + PEXCEPTION_RECORD ExceptionRecord, + PEXCEPTION_REGISTRATION RegistrationFrame, + PCONTEXT Context, + PVOID DispatcherContext, + PEXCEPTION_HANDLER ExceptionHandler); + +EXCEPTION_DISPOSITION +RtlpExecuteHandlerForUnwind( + PEXCEPTION_RECORD ExceptionRecord, + PEXCEPTION_REGISTRATION RegistrationFrame, + PCONTEXT Context, + PVOID DispatcherContext, + PEXCEPTION_HANDLER ExceptionHandler); + + +#ifndef NDEBUG + +VOID RtlpDumpExceptionRegistrations(VOID) +{ + PEXCEPTION_REGISTRATION Current; + + DbgPrint("Dumping exception registrations:\n"); + + Current = SehpGetExceptionList(); + + if ((ULONG_PTR)Current != -1) + { + while ((ULONG_PTR)Current != -1) + { + DbgPrint(" (0x%08X) HANDLER (0x%08X)\n", Current, Current->handler); + Current = Current->prev; + } + DbgPrint(" End-Of-List\n"); + } else { + DbgPrint(" No exception registrations exists.\n"); + } +} + +#endif /* NDEBUG */ + +ULONG +RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context) +{ + PEXCEPTION_REGISTRATION RegistrationFrame; + DWORD DispatcherContext; + DWORD ReturnValue; + + DPRINT("RtlpDispatchException()\n"); + +#ifndef NDEBUG + RtlpDumpExceptionRegistrations(); +#endif /* NDEBUG */ + + RegistrationFrame = SehpGetExceptionList(); + + DPRINT("RegistrationFrame is 0x%X\n", RegistrationFrame); + + while ((ULONG_PTR)RegistrationFrame != -1) + { + EXCEPTION_RECORD ExceptionRecord2; + DWORD Temp = 0; + //PVOID RegistrationFrameEnd = (PVOID)RegistrationFrame + 8; + + // Make sure the registration frame is located within the stack + + DPRINT("Error checking\n"); +#if 0 + if (Teb->Tib.StackBase > RegistrationFrameEnd) + { + DPRINT("Teb->Tib.StackBase (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", + Teb->Tib.StackBase, RegistrationFrameEnd); + ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; + return ExceptionContinueExecution; + } + // FIXME: Stack top, correct? + if (Teb->Tib.StackLimit < RegistrationFrameEnd) + { + DPRINT("Teb->Tib.StackLimit (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", + Teb->Tib.StackLimit, RegistrationFrameEnd); + ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; + return ExceptionContinueExecution; + } + + // Make sure stack is DWORD aligned + if ((ULONG_PTR)RegistrationFrame & 3) + { + DPRINT("RegistrationFrameEnd (0x%.08x) is not DWORD aligned.\n", + RegistrationFrameEnd); + ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; + return ExceptionContinueExecution; + } +#endif + +#if 0 + /* FIXME: */ + if (someFlag) + RtlpLogLastExceptionDisposition( hLog, retValue ); +#endif + + DPRINT("Calling handler at 0x%X\n", RegistrationFrame->handler); + DPRINT("ExceptionRecord 0x%X\n", ExceptionRecord); + DPRINT("RegistrationFrame 0x%X\n", RegistrationFrame); + DPRINT("Context 0x%X\n", Context); + DPRINT("&DispatcherContext 0x%X\n", &DispatcherContext); + + ReturnValue = RtlpExecuteHandlerForException( + ExceptionRecord, + RegistrationFrame, + Context, + &DispatcherContext, + RegistrationFrame->handler); +#ifdef DEBUG + DPRINT("Exception handler said 0x%X\n", ReturnValue); + DPRINT("RegistrationFrame == 0x%.08x\n", RegistrationFrame); + { + PULONG sp = (PULONG)((PVOID)RegistrationFrame - 0x08); + DPRINT("StandardESP == 0x%.08x\n", sp[0]); + DPRINT("Exception Pointers == 0x%.08x\n", sp[1]); + DPRINT("PrevFrame == 0x%.08x\n", sp[2]); + DPRINT("Handler == 0x%.08x\n", sp[3]); + DPRINT("ScopeTable == 0x%.08x\n", sp[4]); + DPRINT("TryLevel == 0x%.08x\n", sp[5]); + DPRINT("EBP == 0x%.08x\n", sp[6]); + } +#endif + if (RegistrationFrame == NULL) + { + ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL; // Turn off flag + } + + if (ReturnValue == ExceptionContinueExecution) + { + DPRINT("ReturnValue == ExceptionContinueExecution\n"); + if (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) + { + DPRINT("(ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) == TRUE\n"); + + ExceptionRecord2.ExceptionRecord = ExceptionRecord; + ExceptionRecord2.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; + ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + ExceptionRecord2.NumberParameters = 0; + RtlRaiseException(&ExceptionRecord2); + } + else + { + /* Copy the (possibly changed) context back to the trap frame and return */ + ZwContinue(Context, FALSE); + return ExceptionContinueExecution; + } + } + else if (ReturnValue == ExceptionContinueSearch) + { + DPRINT("ReturnValue == ExceptionContinueSearch\n"); + + /* Nothing to do here */ + } + else if (ReturnValue == ExceptionNestedException) + { + DPRINT("ReturnValue == ExceptionNestedException\n"); + + ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND; + if (DispatcherContext > Temp) + { + Temp = DispatcherContext; + } + } + else /* if (ReturnValue == ExceptionCollidedUnwind) */ + { + DPRINT("ReturnValue == ExceptionCollidedUnwind or unknown\n"); + + ExceptionRecord2.ExceptionRecord = ExceptionRecord; + ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION; + ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + ExceptionRecord2.NumberParameters = 0; + RtlRaiseException(&ExceptionRecord2); + } + + RegistrationFrame = RegistrationFrame->prev; // Go to previous frame + } + + /* No exception handler will handle this exception */ + + DPRINT("RtlpDispatchException(): Return ExceptionContinueExecution\n"); + + return ExceptionContinueExecution; +} + + +/* + * @implemented + */ +VOID STDCALL +RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, + PVOID ReturnAddress, + PEXCEPTION_RECORD ExceptionRecord, + DWORD EaxValue) +{ + PEXCEPTION_REGISTRATION ERHead; + PEXCEPTION_RECORD pExceptRec; + EXCEPTION_RECORD TempER; + CONTEXT Context; + + DPRINT("RtlUnwind(). RegistrationFrame 0x%X\n", RegistrationFrame); + +#ifndef NDEBUG + RtlpDumpExceptionRegistrations(); +#endif /* NDEBUG */ + + ERHead = SehpGetExceptionList(); + + DPRINT("ERHead is 0x%X\n", ERHead); + + if (ExceptionRecord == NULL) // The normal case + { + DPRINT("ExceptionRecord == NULL (normal)\n"); + + pExceptRec = &TempER; + pExceptRec->ExceptionFlags = 0; + pExceptRec->ExceptionCode = STATUS_UNWIND; + pExceptRec->ExceptionRecord = NULL; + pExceptRec->ExceptionAddress = ReturnAddress; + pExceptRec->ExceptionInformation[0] = 0; + } + else + { + pExceptRec = ExceptionRecord; + } + + if (RegistrationFrame) + pExceptRec->ExceptionFlags |= EXCEPTION_UNWINDING; + else + pExceptRec->ExceptionFlags |= (EXCEPTION_UNWINDING|EXCEPTION_EXIT_UNWIND); + +#ifndef NDEBUG + DPRINT("ExceptionFlags == 0x%x:\n", pExceptRec->ExceptionFlags); + if (pExceptRec->ExceptionFlags & EXCEPTION_UNWINDING) + { + DPRINT(" * EXCEPTION_UNWINDING (0x%x)\n", EXCEPTION_UNWINDING); + } + if (pExceptRec->ExceptionFlags & EXCEPTION_EXIT_UNWIND) + { + DPRINT(" * EXCEPTION_EXIT_UNWIND (0x%x)\n", EXCEPTION_EXIT_UNWIND); + } +#endif /* NDEBUG */ + + Context.ContextFlags = + (CONTEXT_i386 | CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS); + + RtlpCaptureContext(&Context); + + DPRINT("Context.Eip = 0x%.08x\n", Context.Eip); + DPRINT("Context.Ebp = 0x%.08x\n", Context.Ebp); + DPRINT("Context.Esp = 0x%.08x\n", Context.Esp); + + Context.Esp += 0x10; + Context.Eax = EaxValue; + + // Begin traversing the list of EXCEPTION_REGISTRATION + while ((ULONG_PTR)ERHead != -1) + { + EXCEPTION_RECORD er2; + + DPRINT("ERHead 0x%X\n", ERHead); + + if (ERHead == RegistrationFrame) + { + DPRINT("Continueing execution\n"); + ZwContinue(&Context, FALSE); + return; + } + else + { + // If there's an exception frame, but it's lower on the stack + // than the head of the exception list, something's wrong! + if (RegistrationFrame && (RegistrationFrame <= ERHead)) + { + DPRINT("The exception frame is bad\n"); + + // Generate an exception to bail out + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + + RtlRaiseException(&er2); + } + } + +#if 0 + Stack = ERHead + sizeof(EXCEPTION_REGISTRATION); + if ( (Teb->Tib.StackBase <= (PVOID)ERHead ) // Make sure that ERHead + && (Teb->Tib.->StackLimit >= (PVOID)Stack ) // is in range, and a multiple + && (0 == ((ULONG_PTR)ERHead & 3)) ) // of 4 (i.e., sane) +#else + if (1) +#endif + { + PEXCEPTION_REGISTRATION NewERHead; + PEXCEPTION_REGISTRATION pCurrExceptReg; + EXCEPTION_DISPOSITION ReturnValue; + + DPRINT("Executing handler at 0x%X for unwind\n", ERHead->handler); + + ReturnValue = RtlpExecuteHandlerForUnwind( + pExceptRec, + ERHead, + &Context, + &NewERHead, + ERHead->handler); + + DPRINT("Handler at 0x%X returned 0x%X\n", ERHead->handler, ReturnValue); + + if (ReturnValue != ExceptionContinueSearch) + { + if (ReturnValue != ExceptionCollidedUnwind) + { + DPRINT("Bad return value\n"); + + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_INVALID_DISPOSITION; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + + RtlRaiseException(&er2); + } + else + { + ERHead = NewERHead; + } + } + + pCurrExceptReg = ERHead; + ERHead = ERHead->prev; + + DPRINT("New ERHead is 0x%X\n", ERHead); + + DPRINT("Setting exception registration at 0x%X as current\n", + RegistrationFrame->prev); + + // Unlink the exception handler + SehpSetExceptionList(RegistrationFrame->prev); + } + else // The stack looks goofy! Raise an exception to bail out + { + DPRINT("Bad stack\n"); + + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_BAD_STACK; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + + RtlRaiseException(&er2); + } + } + + // If we get here, we reached the end of the EXCEPTION_REGISTRATION list. + // This shouldn't happen normally. + + DPRINT("Ran out of exception registrations. RegistrationFrame is (0x%X)\n", + RegistrationFrame); + + if ((ULONG_PTR)RegistrationFrame == -1) + ZwContinue(&Context, FALSE); + else + NtRaiseException(pExceptRec, &Context, 0); +} + +/* EOF */ From 07420e3dd3eb4905f3faef49b262fe21f24c08a2 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Fri, 25 Jun 2004 03:38:51 +0000 Subject: [PATCH 083/356] Moved common SEH routines to Rtl, removed very wrong RtlUnwind implementation from ntoskrnl svn path=/trunk/; revision=9868 --- reactos/lib/ntdll/rtl/i386/except.s | 291 ---------------- reactos/lib/ntdll/rtl/i386/exception.c | 446 ------------------------- reactos/ntoskrnl/rtl/i386/except.s | 291 ---------------- 3 files changed, 1028 deletions(-) delete mode 100755 reactos/lib/ntdll/rtl/i386/except.s delete mode 100755 reactos/lib/ntdll/rtl/i386/exception.c delete mode 100755 reactos/ntoskrnl/rtl/i386/except.s diff --git a/reactos/lib/ntdll/rtl/i386/except.s b/reactos/lib/ntdll/rtl/i386/except.s deleted file mode 100755 index c37bf5ffd30..00000000000 --- a/reactos/lib/ntdll/rtl/i386/except.s +++ /dev/null @@ -1,291 +0,0 @@ -/* $Id: except.s,v 1.3 2003/05/07 18:45:56 ekohl Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: User-mode exception support for IA-32 - * FILE: lib/ntdll/rtl/i386/except.s - * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - * NOTES: This file is shared with ntoskrnl/rtl/i386/except.s. - * Please keep them in sync. - */ - -#define EXCEPTION_UNWINDING 0x02 - -#define EREC_FLAGS 0x04 - -#define ExceptionContinueExecution 0 -#define ExceptionContinueSearch 1 -#define ExceptionNestedException 2 -#define ExceptionCollidedUnwind 3 - -.globl _RtlpExecuteHandlerForException -.globl _RtlpExecuteHandlerForUnwind - -#define CONTEXT_FLAGS 0x00 -#define CONTEXT_SEGGS 0x8C -#define CONTEXT_SEGFS 0x90 -#define CONTEXT_SEGES 0x94 -#define CONTEXT_SEGDS 0x98 -#define CONTEXT_EDI 0x9C -#define CONTEXT_ESI 0xA0 -#define CONTEXT_EBX 0xA4 -#define CONTEXT_EDX 0xA8 -#define CONTEXT_ECX 0xAC -#define CONTEXT_EAX 0xB0 -#define CONTEXT_EBP 0xB4 -#define CONTEXT_EIP 0xB8 -#define CONTEXT_SEGCS 0xBC -#define CONTEXT_EFLAGS 0xC0 -#define CONTEXT_ESP 0xC4 -#define CONTEXT_SEGSS 0xC8 - - -#define RCC_CONTEXT 0x08 - -// EAX = value to print -_do_debug: - pushal - pushl %eax - call _AsmDebug@4 - popal - ret - -#ifndef __NTOSKRNL__ - -// -// VOID -// RtlpCaptureContext(PCONTEXT pContext); -// -// Parameters: -// [ESP+08h] - PCONTEXT_X86 pContext -// Registers: -// None -// Returns: -// Nothing -// Notes: -// Grabs the current CPU context. -.globl _RtlpCaptureContext -_RtlpCaptureContext: - pushl %ebp - movl %esp, %ebp - movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure - - cld - pushf - pop %eax - movl %eax, CONTEXT_EFLAGS(%edx) - xorl %eax, %eax - movl %eax, CONTEXT_EAX(%edx) - movl %eax, CONTEXT_EBX(%edx) - movl %eax, CONTEXT_ECX(%edx) - movl %eax, CONTEXT_EDX(%edx) - movl %eax, CONTEXT_ESI(%edx) - movl %eax, CONTEXT_EDI(%edx) - movl %cs, %eax - movl %eax, CONTEXT_SEGCS(%edx) - movl %ds, %eax - movl %eax, CONTEXT_SEGDS(%edx) - movl %es, %eax - movl %eax, CONTEXT_SEGES(%edx) - movl %fs, %eax - movl %eax, CONTEXT_SEGFS(%edx) - movl %gs, %eax - movl %eax, CONTEXT_SEGGS(%edx) - movl %ss, %eax - movl %eax, CONTEXT_SEGSS(%edx) - - // - // STACK LAYOUT: - (ESP to put in context structure) - // - RETURN ADDRESS OF CALLER OF CALLER - // - EBP OF CALLER OF CALLER - // ... - // - RETURN ADDRESS OF CALLER - // - EBP OF CALLER - // ... - // - - // Get return address of the caller of the caller of this function - movl %ebp, %ebx - //movl 4(%ebx), %eax // EAX = return address of caller - movl (%ebx), %ebx // EBX = EBP of caller - - movl 4(%ebx), %eax // EAX = return address of caller of caller - movl (%ebx), %ebx // EBX = EBP of caller of caller - - movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller - movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller - addl $8, %ebx - movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 - - movl %ebp, %esp - popl %ebp - ret - -#endif /* !__NTOSKRNL__ */ - -#define REH_ERECORD 0x08 -#define REH_RFRAME 0x0C -#define REH_CONTEXT 0x10 -#define REH_DCONTEXT 0x14 -#define REH_EROUTINE 0x18 - -// Parameters: -// None -// Registers: -// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord -// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame -// [EBP+10h] - PVOID Context -// [EBP+14h] - PVOID DispatcherContext -// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine -// EDX - Address of protecting exception handler -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// Setup the protecting exception handler and call the exception -// handler in the right context. -_RtlpExecuteHandler: - pushl %ebp - movl %esp, %ebp - pushl REH_RFRAME(%ebp) - - pushl %edx - pushl %fs:0x0 - movl %esp, %fs:0x0 - - // Prepare to call the exception handler - pushl REH_DCONTEXT(%ebp) - pushl REH_CONTEXT(%ebp) - pushl REH_RFRAME(%ebp) - pushl REH_ERECORD(%ebp) - - // Now call the exception handler - movl REH_EROUTINE(%ebp), %eax - call *%eax - - cmpl $-1, %fs:0x0 - jne .reh_stack_looks_ok - - // This should not happen - pushl 0 - pushl 0 - pushl 0 - pushl 0 - call _RtlAssert@16 - -.reh_loop: - jmp .reh_loop - -.reh_stack_looks_ok: - movl %fs:0x0, %esp - - // Return to the 'front-end' for this function - popl %fs:0x0 - movl %ebp, %esp - popl %ebp - ret - - -#define REP_ERECORD 0x04 -#define REP_RFRAME 0x08 -#define REP_CONTEXT 0x0C -#define REP_DCONTEXT 0x10 - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// This exception handler protects the exception handling -// mechanism by detecting nested exceptions. -_RtlpExceptionProtector: - movl $ExceptionContinueSearch, %eax - movl REP_ERECORD(%esp), %ecx - testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) - jnz .rep_end - - // Unwinding is not taking place, so return ExceptionNestedException - - // Set DispatcherContext field to the exception registration for the - // exception handler that executed when a nested exception occurred - movl REP_DCONTEXT(%esp), %ecx - movl REP_RFRAME(%esp), %eax - movl %eax, (%ecx) - movl $ExceptionNestedException, %eax - -.rep_end: - ret - - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// Front-end -_RtlpExecuteHandlerForException: - movl $_RtlpExceptionProtector, %edx - jmp _RtlpExecuteHandler - - -#define RUP_ERECORD 0x04 -#define RUP_RFRAME 0x08 -#define RUP_CONTEXT 0x0C -#define RUP_DCONTEXT 0x10 - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// This exception handler protects the exception handling -// mechanism by detecting collided unwinds. -_RtlpUnwindProtector: - movl $ExceptionContinueSearch, %eax - movl %ecx, RUP_ERECORD(%esp) - testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) - jz .rup_end - - // Unwinding is taking place, so return ExceptionCollidedUnwind - - movl RUP_RFRAME(%esp), %ecx - movl RUP_DCONTEXT(%esp), %edx - - // Set DispatcherContext field to the exception registration for the - // exception handler that executed when a collision occurred - movl RUP_RFRAME(%ecx), %eax - movl %eax, (%edx) - movl $ExceptionCollidedUnwind, %eax - -.rup_end: - ret - - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -_RtlpExecuteHandlerForUnwind: - movl $_RtlpUnwindProtector, %edx - jmp _RtlpExecuteHandler diff --git a/reactos/lib/ntdll/rtl/i386/exception.c b/reactos/lib/ntdll/rtl/i386/exception.c deleted file mode 100755 index f929f849b4e..00000000000 --- a/reactos/lib/ntdll/rtl/i386/exception.c +++ /dev/null @@ -1,446 +0,0 @@ -/* $Id: exception.c,v 1.7 2004/04/09 20:03:13 navaraf Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: User-mode exception support for IA-32 - * FILE: lib/ntdll/rtl/i386/exception.c - * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - */ - -/* INCLUDES *****************************************************************/ - -#include -#include -#include - -#define NDEBUG -#include - -/* FUNCTIONS ***************************************************************/ - -/* Implemented in except.s */ - -VOID -RtlpCaptureContext(PCONTEXT pContext); - -/* Macros that will help streamline the SEH implementations for - kernel mode and user mode */ - -#define SehpGetStackLimits(StackBase, StackLimit) \ -{ \ - (*(StackBase)) = NtCurrentTeb()->Tib->StackBase; \ - (*(StackLimit)) = NtCurrentTeb()->Tib->StackLimit; \ -} - -#define SehpGetExceptionList() \ - (PEXCEPTION_REGISTRATION)(NtCurrentTeb()->Tib.ExceptionList) - -#define SehpSetExceptionList(NewExceptionList) \ - NtCurrentTeb()->Tib.ExceptionList = (PVOID)(NewExceptionList) - -#define SehpCaptureContext(Context) \ -{ \ - RtlpCaptureContext(Context); \ -} - -#define SehpContinue(Context, TestAlert) \ - NtContinue(Context, TestAlert) - -/*** Code below this line is shared with ntoskrnl/rtl/i386/exception.c - please keep in sync ***/ - -VOID STDCALL -AsmDebug(ULONG Value) -{ - DbgPrint("Value 0x%.08x\n", Value); -} - - -/* Declare a few prototypes for the functions in except.s */ - -EXCEPTION_DISPOSITION -RtlpExecuteHandlerForException( - PEXCEPTION_RECORD ExceptionRecord, - PEXCEPTION_REGISTRATION RegistrationFrame, - PCONTEXT Context, - PVOID DispatcherContext, - PEXCEPTION_HANDLER ExceptionHandler); - -EXCEPTION_DISPOSITION -RtlpExecuteHandlerForUnwind( - PEXCEPTION_RECORD ExceptionRecord, - PEXCEPTION_REGISTRATION RegistrationFrame, - PCONTEXT Context, - PVOID DispatcherContext, - PEXCEPTION_HANDLER ExceptionHandler); - - -#ifndef NDEBUG - -VOID RtlpDumpExceptionRegistrations(VOID) -{ - PEXCEPTION_REGISTRATION Current; - - DbgPrint("Dumping exception registrations:\n"); - - Current = SehpGetExceptionList(); - - if ((ULONG_PTR)Current != -1) - { - while ((ULONG_PTR)Current != -1) - { - DbgPrint(" (0x%08X) HANDLER (0x%08X)\n", Current, Current->handler); - Current = Current->prev; - } - DbgPrint(" End-Of-List\n"); - } else { - DbgPrint(" No exception registrations exists.\n"); - } -} - -#endif /* NDEBUG */ - -ULONG -RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context) -{ - PEXCEPTION_REGISTRATION RegistrationFrame; - DWORD DispatcherContext; - DWORD ReturnValue; - - DPRINT("RtlpDispatchException()\n"); - -#ifndef NDEBUG - RtlpDumpExceptionRegistrations(); -#endif /* NDEBUG */ - - RegistrationFrame = SehpGetExceptionList(); - - DPRINT("RegistrationFrame is 0x%X\n", RegistrationFrame); - - while ((ULONG_PTR)RegistrationFrame != -1) - { - EXCEPTION_RECORD ExceptionRecord2; - DWORD Temp = 0; - //PVOID RegistrationFrameEnd = (PVOID)RegistrationFrame + 8; - - // Make sure the registration frame is located within the stack - - DPRINT("Error checking\n"); -#if 0 - if (Teb->Tib.StackBase > RegistrationFrameEnd) - { - DPRINT("Teb->Tib.StackBase (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", - Teb->Tib.StackBase, RegistrationFrameEnd); - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return ExceptionContinueExecution; - } - // FIXME: Stack top, correct? - if (Teb->Tib.StackLimit < RegistrationFrameEnd) - { - DPRINT("Teb->Tib.StackLimit (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", - Teb->Tib.StackLimit, RegistrationFrameEnd); - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return ExceptionContinueExecution; - } - - // Make sure stack is DWORD aligned - if ((ULONG_PTR)RegistrationFrame & 3) - { - DPRINT("RegistrationFrameEnd (0x%.08x) is not DWORD aligned.\n", - RegistrationFrameEnd); - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return ExceptionContinueExecution; - } -#endif - -#if 0 - /* FIXME: */ - if (someFlag) - RtlpLogLastExceptionDisposition( hLog, retValue ); -#endif - - DPRINT("Calling handler at 0x%X\n", RegistrationFrame->handler); - DPRINT("ExceptionRecord 0x%X\n", ExceptionRecord); - DPRINT("RegistrationFrame 0x%X\n", RegistrationFrame); - DPRINT("Context 0x%X\n", Context); - DPRINT("&DispatcherContext 0x%X\n", &DispatcherContext); - - ReturnValue = RtlpExecuteHandlerForException( - ExceptionRecord, - RegistrationFrame, - Context, - &DispatcherContext, - RegistrationFrame->handler); -#ifdef DEBUG - DPRINT("Exception handler said 0x%X\n", ReturnValue); - DPRINT("RegistrationFrame == 0x%.08x\n", RegistrationFrame); - { - PULONG sp = (PULONG)((PVOID)RegistrationFrame - 0x08); - DPRINT("StandardESP == 0x%.08x\n", sp[0]); - DPRINT("Exception Pointers == 0x%.08x\n", sp[1]); - DPRINT("PrevFrame == 0x%.08x\n", sp[2]); - DPRINT("Handler == 0x%.08x\n", sp[3]); - DPRINT("ScopeTable == 0x%.08x\n", sp[4]); - DPRINT("TryLevel == 0x%.08x\n", sp[5]); - DPRINT("EBP == 0x%.08x\n", sp[6]); - } -#endif - if (RegistrationFrame == NULL) - { - ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL; // Turn off flag - } - - if (ReturnValue == ExceptionContinueExecution) - { - DPRINT("ReturnValue == ExceptionContinueExecution\n"); - if (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) - { - DPRINT("(ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) == TRUE\n"); - - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - RtlRaiseException(&ExceptionRecord2); - } - else - { - /* Copy the (possibly changed) context back to the trap frame and return */ - SehpContinue(Context, FALSE); - return ExceptionContinueExecution; - } - } - else if (ReturnValue == ExceptionContinueSearch) - { - DPRINT("ReturnValue == ExceptionContinueSearch\n"); - - /* Nothing to do here */ - } - else if (ReturnValue == ExceptionNestedException) - { - DPRINT("ReturnValue == ExceptionNestedException\n"); - - ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND; - if (DispatcherContext > Temp) - { - Temp = DispatcherContext; - } - } - else /* if (ReturnValue == ExceptionCollidedUnwind) */ - { - DPRINT("ReturnValue == ExceptionCollidedUnwind or unknown\n"); - - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - RtlRaiseException(&ExceptionRecord2); - } - - RegistrationFrame = RegistrationFrame->prev; // Go to previous frame - } - - /* No exception handler will handle this exception */ - - DPRINT("RtlpDispatchException(): Return ExceptionContinueExecution\n"); - - return ExceptionContinueExecution; -} - -/* - * @implemented - */ -VOID STDCALL -RtlRaiseStatus(NTSTATUS Status) -{ - EXCEPTION_RECORD ExceptionRecord; - - DPRINT("RtlRaiseStatus(Status 0x%.08x)\n", Status); - - ExceptionRecord.ExceptionCode = Status; - ExceptionRecord.ExceptionRecord = NULL; - ExceptionRecord.NumberParameters = 0; - ExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - RtlRaiseException (& ExceptionRecord); -} - -/* - * @implemented - */ -VOID STDCALL -RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, - PVOID ReturnAddress, - PEXCEPTION_RECORD ExceptionRecord, - DWORD EaxValue) -{ - PEXCEPTION_REGISTRATION ERHead; - PEXCEPTION_RECORD pExceptRec; - EXCEPTION_RECORD TempER; - CONTEXT Context; - - DPRINT("RtlUnwind(). RegistrationFrame 0x%X\n", RegistrationFrame); - -#ifndef NDEBUG - RtlpDumpExceptionRegistrations(); -#endif /* NDEBUG */ - - ERHead = SehpGetExceptionList(); - - DPRINT("ERHead is 0x%X\n", ERHead); - - if (ExceptionRecord == NULL) // The normal case - { - DPRINT("ExceptionRecord == NULL (normal)\n"); - - pExceptRec = &TempER; - pExceptRec->ExceptionFlags = 0; - pExceptRec->ExceptionCode = STATUS_UNWIND; - pExceptRec->ExceptionRecord = NULL; - pExceptRec->ExceptionAddress = ReturnAddress; - pExceptRec->ExceptionInformation[0] = 0; - } - else - { - pExceptRec = ExceptionRecord; - } - - if (RegistrationFrame) - pExceptRec->ExceptionFlags |= EXCEPTION_UNWINDING; - else - pExceptRec->ExceptionFlags |= (EXCEPTION_UNWINDING|EXCEPTION_EXIT_UNWIND); - -#ifndef NDEBUG - DPRINT("ExceptionFlags == 0x%x:\n", pExceptRec->ExceptionFlags); - if (pExceptRec->ExceptionFlags & EXCEPTION_UNWINDING) - { - DPRINT(" * EXCEPTION_UNWINDING (0x%x)\n", EXCEPTION_UNWINDING); - } - if (pExceptRec->ExceptionFlags & EXCEPTION_EXIT_UNWIND) - { - DPRINT(" * EXCEPTION_EXIT_UNWIND (0x%x)\n", EXCEPTION_EXIT_UNWIND); - } -#endif /* NDEBUG */ - - Context.ContextFlags = - (CONTEXT_i386 | CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS); - - SehpCaptureContext(&Context); - - DPRINT("Context.Eip = 0x%.08x\n", Context.Eip); - DPRINT("Context.Ebp = 0x%.08x\n", Context.Ebp); - DPRINT("Context.Esp = 0x%.08x\n", Context.Esp); - - Context.Esp += 0x10; - Context.Eax = EaxValue; - - // Begin traversing the list of EXCEPTION_REGISTRATION - while ((ULONG_PTR)ERHead != -1) - { - EXCEPTION_RECORD er2; - - DPRINT("ERHead 0x%X\n", ERHead); - - if (ERHead == RegistrationFrame) - { - DPRINT("Continueing execution\n"); - SehpContinue(&Context, FALSE); - return; - } - else - { - // If there's an exception frame, but it's lower on the stack - // than the head of the exception list, something's wrong! - if (RegistrationFrame && (RegistrationFrame <= ERHead)) - { - DPRINT("The exception frame is bad\n"); - - // Generate an exception to bail out - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - - RtlRaiseException(&er2); - } - } - -#if 0 - Stack = ERHead + sizeof(EXCEPTION_REGISTRATION); - if ( (Teb->Tib.StackBase <= (PVOID)ERHead ) // Make sure that ERHead - && (Teb->Tib.->StackLimit >= (PVOID)Stack ) // is in range, and a multiple - && (0 == ((ULONG_PTR)ERHead & 3)) ) // of 4 (i.e., sane) - { -#else - if (1) { -#endif - PEXCEPTION_REGISTRATION NewERHead; - PEXCEPTION_REGISTRATION pCurrExceptReg; - EXCEPTION_DISPOSITION ReturnValue; - - DPRINT("Executing handler at 0x%X for unwind\n", ERHead->handler); - - ReturnValue = RtlpExecuteHandlerForUnwind( - pExceptRec, - ERHead, - &Context, - &NewERHead, - ERHead->handler); - - DPRINT("Handler at 0x%X returned 0x%X\n", ERHead->handler, ReturnValue); - - if (ReturnValue != ExceptionContinueSearch) - { - if (ReturnValue != ExceptionCollidedUnwind) - { - DPRINT("Bad return value\n"); - - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_INVALID_DISPOSITION; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - - RtlRaiseException(&er2); - } - else - { - ERHead = NewERHead; - } - } - - pCurrExceptReg = ERHead; - ERHead = ERHead->prev; - - DPRINT("New ERHead is 0x%X\n", ERHead); - - DPRINT("Setting exception registration at 0x%X as current\n", - RegistrationFrame->prev); - - // Unlink the exception handler - SehpSetExceptionList(RegistrationFrame->prev); - } - else // The stack looks goofy! Raise an exception to bail out - { - DPRINT("Bad stack\n"); - - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_BAD_STACK; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - - RtlRaiseException(&er2); - } - } - - // If we get here, we reached the end of the EXCEPTION_REGISTRATION list. - // This shouldn't happen normally. - - DPRINT("Ran out of exception registrations. RegistrationFrame is (0x%X)\n", - RegistrationFrame); - - if ((ULONG_PTR)RegistrationFrame == -1) - SehpContinue(&Context, FALSE); - else - NtRaiseException(pExceptRec, &Context, 0); -} - -/* EOF */ diff --git a/reactos/ntoskrnl/rtl/i386/except.s b/reactos/ntoskrnl/rtl/i386/except.s deleted file mode 100755 index e5532888420..00000000000 --- a/reactos/ntoskrnl/rtl/i386/except.s +++ /dev/null @@ -1,291 +0,0 @@ -/* $Id: except.s,v 1.2 2002/10/26 07:32:08 chorns Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Kernel-mode exception support for IA-32 - * FILE: ntoskrnl/rtl/i386/except.s - * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - * NOTES: This file is shared with lib/ntdll/rtl/i386/except.s. - * Please keep them in sync. - */ - -#define EXCEPTION_UNWINDING 0x02 - -#define EREC_FLAGS 0x04 - -#define ExceptionContinueExecution 0 -#define ExceptionContinueSearch 1 -#define ExceptionNestedException 2 -#define ExceptionCollidedUnwind 3 - -.globl _RtlpExecuteHandlerForException -.globl _RtlpExecuteHandlerForUnwind - -#define CONTEXT_FLAGS 0x00 -#define CONTEXT_SEGGS 0x8C -#define CONTEXT_SEGFS 0x90 -#define CONTEXT_SEGES 0x94 -#define CONTEXT_SEGDS 0x98 -#define CONTEXT_EDI 0x9C -#define CONTEXT_ESI 0xA0 -#define CONTEXT_EBX 0xA4 -#define CONTEXT_EDX 0xA8 -#define CONTEXT_ECX 0xAC -#define CONTEXT_EAX 0xB0 -#define CONTEXT_EBP 0xB4 -#define CONTEXT_EIP 0xB8 -#define CONTEXT_SEGCS 0xBC -#define CONTEXT_EFLAGS 0xC0 -#define CONTEXT_ESP 0xC4 -#define CONTEXT_SEGSS 0xC8 - - -#define RCC_CONTEXT 0x08 - -// EAX = value to print -_do_debug: - pushal - pushl %eax - call _AsmDebug@4 - popal - ret - -#ifndef __NTOSKRNL__ - -// -// VOID -// RtlpCaptureContext(PCONTEXT pContext); -// -// Parameters: -// [ESP+08h] - PCONTEXT_X86 pContext -// Registers: -// None -// Returns: -// Nothing -// Notes: -// Grabs the current CPU context. -.globl _RtlpCaptureContext -_RtlpCaptureContext: - pushl %ebp - movl %esp, %ebp - movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure - - cld - pushf - pop %eax - movl %eax, CONTEXT_EFLAGS(%edx) - xorl %eax, %eax - movl %eax, CONTEXT_EAX(%edx) - movl %eax, CONTEXT_EBX(%edx) - movl %eax, CONTEXT_ECX(%edx) - movl %eax, CONTEXT_EDX(%edx) - movl %eax, CONTEXT_ESI(%edx) - movl %eax, CONTEXT_EDI(%edx) - movl %cs, %eax - movl %eax, CONTEXT_SEGCS(%edx) - movl %ds, %eax - movl %eax, CONTEXT_SEGDS(%edx) - movl %es, %eax - movl %eax, CONTEXT_SEGES(%edx) - movl %fs, %eax - movl %eax, CONTEXT_SEGFS(%edx) - movl %gs, %eax - movl %eax, CONTEXT_SEGGS(%edx) - movl %ss, %eax - movl %eax, CONTEXT_SEGSS(%edx) - - // - // STACK LAYOUT: - (ESP to put in context structure) - // - RETURN ADDRESS OF CALLER OF CALLER - // - EBP OF CALLER OF CALLER - // ... - // - RETURN ADDRESS OF CALLER - // - EBP OF CALLER - // ... - // - - // Get return address of the caller of the caller of this function - movl %ebp, %ebx - //movl 4(%ebx), %eax // EAX = return address of caller - movl (%ebx), %ebx // EBX = EBP of caller - - movl 4(%ebx), %eax // EAX = return address of caller of caller - movl (%ebx), %ebx // EBX = EBP of caller of caller - - movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller - movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller - addl $8, %ebx - movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 - - movl %ebp, %esp - popl %ebp - ret - -#endif /* !__NTOSKRNL__ */ - -#define REH_ERECORD 0x08 -#define REH_RFRAME 0x0C -#define REH_CONTEXT 0x10 -#define REH_DCONTEXT 0x14 -#define REH_EROUTINE 0x18 - -// Parameters: -// None -// Registers: -// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord -// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame -// [EBP+10h] - PVOID Context -// [EBP+14h] - PVOID DispatcherContext -// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine -// EDX - Address of protecting exception handler -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// Setup the protecting exception handler and call the exception -// handler in the right context. -_RtlpExecuteHandler: - pushl %ebp - movl %esp, %ebp - pushl REH_RFRAME(%ebp) - - pushl %edx - pushl %fs:0x0 - movl %esp, %fs:0x0 - - // Prepare to call the exception handler - pushl REH_DCONTEXT(%ebp) - pushl REH_CONTEXT(%ebp) - pushl REH_RFRAME(%ebp) - pushl REH_ERECORD(%ebp) - - // Now call the exception handler - movl REH_EROUTINE(%ebp), %eax - call *%eax - - cmpl $-1, %fs:0x0 - jne .reh_stack_looks_ok - - // This should not happen - pushl 0 - pushl 0 - pushl 0 - pushl 0 - call _RtlAssert@16 - -.reh_loop: - jmp .reh_loop - -.reh_stack_looks_ok: - movl %fs:0x0, %esp - - // Return to the 'front-end' for this function - popl %fs:0x0 - movl %ebp, %esp - popl %ebp - ret - - -#define REP_ERECORD 0x04 -#define REP_RFRAME 0x08 -#define REP_CONTEXT 0x0C -#define REP_DCONTEXT 0x10 - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// This exception handler protects the exception handling -// mechanism by detecting nested exceptions. -_RtlpExceptionProtector: - movl $ExceptionContinueSearch, %eax - movl REP_ERECORD(%esp), %ecx - testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) - jnz .rep_end - - // Unwinding is not taking place, so return ExceptionNestedException - - // Set DispatcherContext field to the exception registration for the - // exception handler that executed when a nested exception occurred - movl REP_DCONTEXT(%esp), %ecx - movl REP_RFRAME(%esp), %eax - movl %eax, (%ecx) - movl $ExceptionNestedException, %eax - -.rep_end: - ret - - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// Front-end -_RtlpExecuteHandlerForException: - movl $_RtlpExceptionProtector, %edx - jmp _RtlpExecuteHandler - - -#define RUP_ERECORD 0x04 -#define RUP_RFRAME 0x08 -#define RUP_CONTEXT 0x0C -#define RUP_DCONTEXT 0x10 - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// This exception handler protects the exception handling -// mechanism by detecting collided unwinds. -_RtlpUnwindProtector: - movl $ExceptionContinueSearch, %eax - movl %ecx, RUP_ERECORD(%esp) - testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) - jz .rup_end - - // Unwinding is taking place, so return ExceptionCollidedUnwind - - movl RUP_RFRAME(%esp), %ecx - movl RUP_DCONTEXT(%esp), %edx - - // Set DispatcherContext field to the exception registration for the - // exception handler that executed when a collision occurred - movl RUP_RFRAME(%ecx), %eax - movl %eax, (%edx) - movl $ExceptionCollidedUnwind, %eax - -.rup_end: - ret - - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -_RtlpExecuteHandlerForUnwind: - movl $_RtlpUnwindProtector, %edx - jmp _RtlpExecuteHandler From 4531d961414d87b306650b5419cd90f0ee660b08 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 25 Jun 2004 11:42:00 +0000 Subject: [PATCH 084/356] Expand user-specific environment variables. svn path=/trunk/; revision=9870 --- reactos/lib/userenv/environment.c | 79 ++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/reactos/lib/userenv/environment.c b/reactos/lib/userenv/environment.c index c65962b6e71..08c369552d6 100644 --- a/reactos/lib/userenv/environment.c +++ b/reactos/lib/userenv/environment.c @@ -1,4 +1,4 @@ -/* $Id: environment.c,v 1.3 2004/05/01 11:55:01 ekohl Exp $ +/* $Id: environment.c,v 1.4 2004/06/25 11:42:00 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -18,20 +18,63 @@ static BOOL SetUserEnvironmentVariable (LPVOID *Environment, LPWSTR lpName, - LPWSTR lpValue) + LPWSTR lpValue, + BOOL bExpand) { UNICODE_STRING Name; - UNICODE_STRING Value; + UNICODE_STRING SrcValue; + UNICODE_STRING DstValue; + ULONG Length; NTSTATUS Status; + if (bExpand) + { + RtlInitUnicodeString(&SrcValue, + lpValue); + + Length = 2 * MAX_PATH * sizeof(WCHAR); + + DstValue.Length = 0; + DstValue.MaximumLength = Length; + DstValue.Buffer = LocalAlloc (LPTR, + Length); + if (DstValue.Buffer == NULL) + { + DPRINT1("LocalAlloc() failed\n"); + return FALSE; + } + + Status = RtlExpandEnvironmentStrings_U((PWSTR)*Environment, + &SrcValue, + &DstValue, + &Length); + if (!NT_SUCCESS(Status)) + { + DPRINT1 ("RtlExpandEnvironmentStrings_U() failed (Status %lx)\n", Status); + DPRINT1 ("Length %lu\n", Length); + return FALSE; + } + } + else + { + RtlInitUnicodeString(&DstValue, + lpValue); + } + RtlInitUnicodeString (&Name, lpName); - RtlInitUnicodeString (&Value, - lpValue); + + DPRINT("Value: %wZ\n", &DstValue); Status = RtlSetEnvironmentVariable ((PWSTR*)Environment, &Name, - &Value); + &DstValue); + + if (bExpand) + { + LocalFree(DstValue.Buffer); + } + if (!NT_SUCCESS(Status)) { DPRINT1 ("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); @@ -214,7 +257,8 @@ SetUserEnvironment (LPVOID *lpEnvironment, /* Set environment variable */ SetUserEnvironmentVariable (lpEnvironment, lpValueName, - lpValueData); + lpValueData, + (dwType == REG_EXPAND_SZ)); } } @@ -254,9 +298,10 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, if (GetComputerNameW (Buffer, &Length)) { - SetUserEnvironmentVariable (lpEnvironment, - L"COMPUTERNAME", - Buffer); + SetUserEnvironmentVariable(lpEnvironment, + L"COMPUTERNAME", + Buffer, + FALSE); } if (hToken == NULL) @@ -275,9 +320,10 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, if (GetAllUsersProfileDirectoryW (Buffer, &Length)) { - SetUserEnvironmentVariable (lpEnvironment, - L"ALLUSERSPROFILE", - Buffer); + SetUserEnvironmentVariable(lpEnvironment, + L"ALLUSERSPROFILE", + Buffer, + FALSE); } /* Set 'USERPROFILE' variable */ @@ -286,9 +332,10 @@ CreateEnvironmentBlock (LPVOID *lpEnvironment, Buffer, &Length)) { - SetUserEnvironmentVariable (lpEnvironment, - L"USERPROFILE", - Buffer); + SetUserEnvironmentVariable(lpEnvironment, + L"USERPROFILE", + Buffer, + FALSE); } /* FIXME: Set 'USERDOMAIN' variable */ From 2dea23413207738884070b23a5c9419ed8025316 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 25 Jun 2004 16:39:41 +0000 Subject: [PATCH 085/356] re-added files that hyperion accidently deleted from HEAD svn path=/trunk/; revision=9871 --- reactos/lib/ntdll/rtl/i386/except.s | 291 ++++++++++++++++ reactos/lib/ntdll/rtl/i386/exception.c | 446 +++++++++++++++++++++++++ reactos/ntoskrnl/rtl/i386/except.s | 291 ++++++++++++++++ 3 files changed, 1028 insertions(+) create mode 100755 reactos/lib/ntdll/rtl/i386/except.s create mode 100755 reactos/lib/ntdll/rtl/i386/exception.c create mode 100755 reactos/ntoskrnl/rtl/i386/except.s diff --git a/reactos/lib/ntdll/rtl/i386/except.s b/reactos/lib/ntdll/rtl/i386/except.s new file mode 100755 index 00000000000..15fdeddd982 --- /dev/null +++ b/reactos/lib/ntdll/rtl/i386/except.s @@ -0,0 +1,291 @@ +/* $Id: except.s,v 1.5 2004/06/25 16:39:41 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: User-mode exception support for IA-32 + * FILE: lib/ntdll/rtl/i386/except.s + * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + * NOTES: This file is shared with ntoskrnl/rtl/i386/except.s. + * Please keep them in sync. + */ + +#define EXCEPTION_UNWINDING 0x02 + +#define EREC_FLAGS 0x04 + +#define ExceptionContinueExecution 0 +#define ExceptionContinueSearch 1 +#define ExceptionNestedException 2 +#define ExceptionCollidedUnwind 3 + +.globl _RtlpExecuteHandlerForException +.globl _RtlpExecuteHandlerForUnwind + +#define CONTEXT_FLAGS 0x00 +#define CONTEXT_SEGGS 0x8C +#define CONTEXT_SEGFS 0x90 +#define CONTEXT_SEGES 0x94 +#define CONTEXT_SEGDS 0x98 +#define CONTEXT_EDI 0x9C +#define CONTEXT_ESI 0xA0 +#define CONTEXT_EBX 0xA4 +#define CONTEXT_EDX 0xA8 +#define CONTEXT_ECX 0xAC +#define CONTEXT_EAX 0xB0 +#define CONTEXT_EBP 0xB4 +#define CONTEXT_EIP 0xB8 +#define CONTEXT_SEGCS 0xBC +#define CONTEXT_EFLAGS 0xC0 +#define CONTEXT_ESP 0xC4 +#define CONTEXT_SEGSS 0xC8 + + +#define RCC_CONTEXT 0x08 + +// EAX = value to print +_do_debug: + pushal + pushl %eax + call _AsmDebug@4 + popal + ret + +#ifndef __NTOSKRNL__ + +// +// VOID +// RtlpCaptureContext(PCONTEXT pContext); +// +// Parameters: +// [ESP+08h] - PCONTEXT_X86 pContext +// Registers: +// None +// Returns: +// Nothing +// Notes: +// Grabs the current CPU context. +.globl _RtlpCaptureContext +_RtlpCaptureContext: + pushl %ebp + movl %esp, %ebp + movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure + + cld + pushf + pop %eax + movl %eax, CONTEXT_EFLAGS(%edx) + xorl %eax, %eax + movl %eax, CONTEXT_EAX(%edx) + movl %eax, CONTEXT_EBX(%edx) + movl %eax, CONTEXT_ECX(%edx) + movl %eax, CONTEXT_EDX(%edx) + movl %eax, CONTEXT_ESI(%edx) + movl %eax, CONTEXT_EDI(%edx) + movl %cs, %eax + movl %eax, CONTEXT_SEGCS(%edx) + movl %ds, %eax + movl %eax, CONTEXT_SEGDS(%edx) + movl %es, %eax + movl %eax, CONTEXT_SEGES(%edx) + movl %fs, %eax + movl %eax, CONTEXT_SEGFS(%edx) + movl %gs, %eax + movl %eax, CONTEXT_SEGGS(%edx) + movl %ss, %eax + movl %eax, CONTEXT_SEGSS(%edx) + + // + // STACK LAYOUT: - (ESP to put in context structure) + // - RETURN ADDRESS OF CALLER OF CALLER + // - EBP OF CALLER OF CALLER + // ... + // - RETURN ADDRESS OF CALLER + // - EBP OF CALLER + // ... + // + + // Get return address of the caller of the caller of this function + movl %ebp, %ebx + //movl 4(%ebx), %eax // EAX = return address of caller + movl (%ebx), %ebx // EBX = EBP of caller + + movl 4(%ebx), %eax // EAX = return address of caller of caller + movl (%ebx), %ebx // EBX = EBP of caller of caller + + movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller + movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller + addl $8, %ebx + movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 + + movl %ebp, %esp + popl %ebp + ret + +#endif /* !__NTOSKRNL__ */ + +#define REH_ERECORD 0x08 +#define REH_RFRAME 0x0C +#define REH_CONTEXT 0x10 +#define REH_DCONTEXT 0x14 +#define REH_EROUTINE 0x18 + +// Parameters: +// None +// Registers: +// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord +// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame +// [EBP+10h] - PVOID Context +// [EBP+14h] - PVOID DispatcherContext +// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine +// EDX - Address of protecting exception handler +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Setup the protecting exception handler and call the exception +// handler in the right context. +_RtlpExecuteHandler: + pushl %ebp + movl %esp, %ebp + pushl REH_RFRAME(%ebp) + + pushl %edx + pushl %fs:0x0 + movl %esp, %fs:0x0 + + // Prepare to call the exception handler + pushl REH_DCONTEXT(%ebp) + pushl REH_CONTEXT(%ebp) + pushl REH_RFRAME(%ebp) + pushl REH_ERECORD(%ebp) + + // Now call the exception handler + movl REH_EROUTINE(%ebp), %eax + call *%eax + + cmpl $-1, %fs:0x0 + jne .reh_stack_looks_ok + + // This should not happen + pushl 0 + pushl 0 + pushl 0 + pushl 0 + call _RtlAssert@16 + +.reh_loop: + jmp .reh_loop + +.reh_stack_looks_ok: + movl %fs:0x0, %esp + + // Return to the 'front-end' for this function + popl %fs:0x0 + movl %ebp, %esp + popl %ebp + ret + + +#define REP_ERECORD 0x04 +#define REP_RFRAME 0x08 +#define REP_CONTEXT 0x0C +#define REP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting nested exceptions. +_RtlpExceptionProtector: + movl $ExceptionContinueSearch, %eax + movl REP_ERECORD(%esp), %ecx + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jnz .rep_end + + // Unwinding is not taking place, so return ExceptionNestedException + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a nested exception occurred + movl REP_DCONTEXT(%esp), %ecx + movl REP_RFRAME(%esp), %eax + movl %eax, (%ecx) + movl $ExceptionNestedException, %eax + +.rep_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Front-end +_RtlpExecuteHandlerForException: + movl $_RtlpExceptionProtector, %edx + jmp _RtlpExecuteHandler + + +#define RUP_ERECORD 0x04 +#define RUP_RFRAME 0x08 +#define RUP_CONTEXT 0x0C +#define RUP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting collided unwinds. +_RtlpUnwindProtector: + movl $ExceptionContinueSearch, %eax + movl %ecx, RUP_ERECORD(%esp) + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jz .rup_end + + // Unwinding is taking place, so return ExceptionCollidedUnwind + + movl RUP_RFRAME(%esp), %ecx + movl RUP_DCONTEXT(%esp), %edx + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a collision occurred + movl RUP_RFRAME(%ecx), %eax + movl %eax, (%edx) + movl $ExceptionCollidedUnwind, %eax + +.rup_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +_RtlpExecuteHandlerForUnwind: + movl $_RtlpUnwindProtector, %edx + jmp _RtlpExecuteHandler diff --git a/reactos/lib/ntdll/rtl/i386/exception.c b/reactos/lib/ntdll/rtl/i386/exception.c new file mode 100755 index 00000000000..2623dabf7ff --- /dev/null +++ b/reactos/lib/ntdll/rtl/i386/exception.c @@ -0,0 +1,446 @@ +/* $Id: exception.c,v 1.9 2004/06/25 16:39:41 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: User-mode exception support for IA-32 + * FILE: lib/ntdll/rtl/i386/exception.c + * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS ***************************************************************/ + +/* Implemented in except.s */ + +VOID +RtlpCaptureContext(PCONTEXT pContext); + +/* Macros that will help streamline the SEH implementations for + kernel mode and user mode */ + +#define SehpGetStackLimits(StackBase, StackLimit) \ +{ \ + (*(StackBase)) = NtCurrentTeb()->Tib->StackBase; \ + (*(StackLimit)) = NtCurrentTeb()->Tib->StackLimit; \ +} + +#define SehpGetExceptionList() \ + (PEXCEPTION_REGISTRATION)(NtCurrentTeb()->Tib.ExceptionList) + +#define SehpSetExceptionList(NewExceptionList) \ + NtCurrentTeb()->Tib.ExceptionList = (PVOID)(NewExceptionList) + +#define SehpCaptureContext(Context) \ +{ \ + RtlpCaptureContext(Context); \ +} + +#define SehpContinue(Context, TestAlert) \ + NtContinue(Context, TestAlert) + +/*** Code below this line is shared with ntoskrnl/rtl/i386/exception.c - please keep in sync ***/ + +VOID STDCALL +AsmDebug(ULONG Value) +{ + DbgPrint("Value 0x%.08x\n", Value); +} + + +/* Declare a few prototypes for the functions in except.s */ + +EXCEPTION_DISPOSITION +RtlpExecuteHandlerForException( + PEXCEPTION_RECORD ExceptionRecord, + PEXCEPTION_REGISTRATION RegistrationFrame, + PCONTEXT Context, + PVOID DispatcherContext, + PEXCEPTION_HANDLER ExceptionHandler); + +EXCEPTION_DISPOSITION +RtlpExecuteHandlerForUnwind( + PEXCEPTION_RECORD ExceptionRecord, + PEXCEPTION_REGISTRATION RegistrationFrame, + PCONTEXT Context, + PVOID DispatcherContext, + PEXCEPTION_HANDLER ExceptionHandler); + + +#ifndef NDEBUG + +VOID RtlpDumpExceptionRegistrations(VOID) +{ + PEXCEPTION_REGISTRATION Current; + + DbgPrint("Dumping exception registrations:\n"); + + Current = SehpGetExceptionList(); + + if ((ULONG_PTR)Current != -1) + { + while ((ULONG_PTR)Current != -1) + { + DbgPrint(" (0x%08X) HANDLER (0x%08X)\n", Current, Current->handler); + Current = Current->prev; + } + DbgPrint(" End-Of-List\n"); + } else { + DbgPrint(" No exception registrations exists.\n"); + } +} + +#endif /* NDEBUG */ + +ULONG +RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context) +{ + PEXCEPTION_REGISTRATION RegistrationFrame; + DWORD DispatcherContext; + DWORD ReturnValue; + + DPRINT("RtlpDispatchException()\n"); + +#ifndef NDEBUG + RtlpDumpExceptionRegistrations(); +#endif /* NDEBUG */ + + RegistrationFrame = SehpGetExceptionList(); + + DPRINT("RegistrationFrame is 0x%X\n", RegistrationFrame); + + while ((ULONG_PTR)RegistrationFrame != -1) + { + EXCEPTION_RECORD ExceptionRecord2; + DWORD Temp = 0; + //PVOID RegistrationFrameEnd = (PVOID)RegistrationFrame + 8; + + // Make sure the registration frame is located within the stack + + DPRINT("Error checking\n"); +#if 0 + if (Teb->Tib.StackBase > RegistrationFrameEnd) + { + DPRINT("Teb->Tib.StackBase (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", + Teb->Tib.StackBase, RegistrationFrameEnd); + ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; + return ExceptionContinueExecution; + } + // FIXME: Stack top, correct? + if (Teb->Tib.StackLimit < RegistrationFrameEnd) + { + DPRINT("Teb->Tib.StackLimit (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", + Teb->Tib.StackLimit, RegistrationFrameEnd); + ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; + return ExceptionContinueExecution; + } + + // Make sure stack is DWORD aligned + if ((ULONG_PTR)RegistrationFrame & 3) + { + DPRINT("RegistrationFrameEnd (0x%.08x) is not DWORD aligned.\n", + RegistrationFrameEnd); + ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; + return ExceptionContinueExecution; + } +#endif + +#if 0 + /* FIXME: */ + if (someFlag) + RtlpLogLastExceptionDisposition( hLog, retValue ); +#endif + + DPRINT("Calling handler at 0x%X\n", RegistrationFrame->handler); + DPRINT("ExceptionRecord 0x%X\n", ExceptionRecord); + DPRINT("RegistrationFrame 0x%X\n", RegistrationFrame); + DPRINT("Context 0x%X\n", Context); + DPRINT("&DispatcherContext 0x%X\n", &DispatcherContext); + + ReturnValue = RtlpExecuteHandlerForException( + ExceptionRecord, + RegistrationFrame, + Context, + &DispatcherContext, + RegistrationFrame->handler); +#ifdef DEBUG + DPRINT("Exception handler said 0x%X\n", ReturnValue); + DPRINT("RegistrationFrame == 0x%.08x\n", RegistrationFrame); + { + PULONG sp = (PULONG)((PVOID)RegistrationFrame - 0x08); + DPRINT("StandardESP == 0x%.08x\n", sp[0]); + DPRINT("Exception Pointers == 0x%.08x\n", sp[1]); + DPRINT("PrevFrame == 0x%.08x\n", sp[2]); + DPRINT("Handler == 0x%.08x\n", sp[3]); + DPRINT("ScopeTable == 0x%.08x\n", sp[4]); + DPRINT("TryLevel == 0x%.08x\n", sp[5]); + DPRINT("EBP == 0x%.08x\n", sp[6]); + } +#endif + if (RegistrationFrame == NULL) + { + ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL; // Turn off flag + } + + if (ReturnValue == ExceptionContinueExecution) + { + DPRINT("ReturnValue == ExceptionContinueExecution\n"); + if (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) + { + DPRINT("(ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) == TRUE\n"); + + ExceptionRecord2.ExceptionRecord = ExceptionRecord; + ExceptionRecord2.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; + ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + ExceptionRecord2.NumberParameters = 0; + RtlRaiseException(&ExceptionRecord2); + } + else + { + /* Copy the (possibly changed) context back to the trap frame and return */ + SehpContinue(Context, FALSE); + return ExceptionContinueExecution; + } + } + else if (ReturnValue == ExceptionContinueSearch) + { + DPRINT("ReturnValue == ExceptionContinueSearch\n"); + + /* Nothing to do here */ + } + else if (ReturnValue == ExceptionNestedException) + { + DPRINT("ReturnValue == ExceptionNestedException\n"); + + ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND; + if (DispatcherContext > Temp) + { + Temp = DispatcherContext; + } + } + else /* if (ReturnValue == ExceptionCollidedUnwind) */ + { + DPRINT("ReturnValue == ExceptionCollidedUnwind or unknown\n"); + + ExceptionRecord2.ExceptionRecord = ExceptionRecord; + ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION; + ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + ExceptionRecord2.NumberParameters = 0; + RtlRaiseException(&ExceptionRecord2); + } + + RegistrationFrame = RegistrationFrame->prev; // Go to previous frame + } + + /* No exception handler will handle this exception */ + + DPRINT("RtlpDispatchException(): Return ExceptionContinueExecution\n"); + + return ExceptionContinueExecution; +} + +/* + * @implemented + */ +VOID STDCALL +RtlRaiseStatus(NTSTATUS Status) +{ + EXCEPTION_RECORD ExceptionRecord; + + DPRINT("RtlRaiseStatus(Status 0x%.08x)\n", Status); + + ExceptionRecord.ExceptionCode = Status; + ExceptionRecord.ExceptionRecord = NULL; + ExceptionRecord.NumberParameters = 0; + ExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + RtlRaiseException (& ExceptionRecord); +} + +/* + * @implemented + */ +VOID STDCALL +RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, + PVOID ReturnAddress, + PEXCEPTION_RECORD ExceptionRecord, + DWORD EaxValue) +{ + PEXCEPTION_REGISTRATION ERHead; + PEXCEPTION_RECORD pExceptRec; + EXCEPTION_RECORD TempER; + CONTEXT Context; + + DPRINT("RtlUnwind(). RegistrationFrame 0x%X\n", RegistrationFrame); + +#ifndef NDEBUG + RtlpDumpExceptionRegistrations(); +#endif /* NDEBUG */ + + ERHead = SehpGetExceptionList(); + + DPRINT("ERHead is 0x%X\n", ERHead); + + if (ExceptionRecord == NULL) // The normal case + { + DPRINT("ExceptionRecord == NULL (normal)\n"); + + pExceptRec = &TempER; + pExceptRec->ExceptionFlags = 0; + pExceptRec->ExceptionCode = STATUS_UNWIND; + pExceptRec->ExceptionRecord = NULL; + pExceptRec->ExceptionAddress = ReturnAddress; + pExceptRec->ExceptionInformation[0] = 0; + } + else + { + pExceptRec = ExceptionRecord; + } + + if (RegistrationFrame) + pExceptRec->ExceptionFlags |= EXCEPTION_UNWINDING; + else + pExceptRec->ExceptionFlags |= (EXCEPTION_UNWINDING|EXCEPTION_EXIT_UNWIND); + +#ifndef NDEBUG + DPRINT("ExceptionFlags == 0x%x:\n", pExceptRec->ExceptionFlags); + if (pExceptRec->ExceptionFlags & EXCEPTION_UNWINDING) + { + DPRINT(" * EXCEPTION_UNWINDING (0x%x)\n", EXCEPTION_UNWINDING); + } + if (pExceptRec->ExceptionFlags & EXCEPTION_EXIT_UNWIND) + { + DPRINT(" * EXCEPTION_EXIT_UNWIND (0x%x)\n", EXCEPTION_EXIT_UNWIND); + } +#endif /* NDEBUG */ + + Context.ContextFlags = + (CONTEXT_i386 | CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS); + + SehpCaptureContext(&Context); + + DPRINT("Context.Eip = 0x%.08x\n", Context.Eip); + DPRINT("Context.Ebp = 0x%.08x\n", Context.Ebp); + DPRINT("Context.Esp = 0x%.08x\n", Context.Esp); + + Context.Esp += 0x10; + Context.Eax = EaxValue; + + // Begin traversing the list of EXCEPTION_REGISTRATION + while ((ULONG_PTR)ERHead != -1) + { + EXCEPTION_RECORD er2; + + DPRINT("ERHead 0x%X\n", ERHead); + + if (ERHead == RegistrationFrame) + { + DPRINT("Continueing execution\n"); + SehpContinue(&Context, FALSE); + return; + } + else + { + // If there's an exception frame, but it's lower on the stack + // than the head of the exception list, something's wrong! + if (RegistrationFrame && (RegistrationFrame <= ERHead)) + { + DPRINT("The exception frame is bad\n"); + + // Generate an exception to bail out + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + + RtlRaiseException(&er2); + } + } + +#if 0 + Stack = ERHead + sizeof(EXCEPTION_REGISTRATION); + if ( (Teb->Tib.StackBase <= (PVOID)ERHead ) // Make sure that ERHead + && (Teb->Tib.->StackLimit >= (PVOID)Stack ) // is in range, and a multiple + && (0 == ((ULONG_PTR)ERHead & 3)) ) // of 4 (i.e., sane) + { +#else + if (1) { +#endif + PEXCEPTION_REGISTRATION NewERHead; + PEXCEPTION_REGISTRATION pCurrExceptReg; + EXCEPTION_DISPOSITION ReturnValue; + + DPRINT("Executing handler at 0x%X for unwind\n", ERHead->handler); + + ReturnValue = RtlpExecuteHandlerForUnwind( + pExceptRec, + ERHead, + &Context, + &NewERHead, + ERHead->handler); + + DPRINT("Handler at 0x%X returned 0x%X\n", ERHead->handler, ReturnValue); + + if (ReturnValue != ExceptionContinueSearch) + { + if (ReturnValue != ExceptionCollidedUnwind) + { + DPRINT("Bad return value\n"); + + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_INVALID_DISPOSITION; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + + RtlRaiseException(&er2); + } + else + { + ERHead = NewERHead; + } + } + + pCurrExceptReg = ERHead; + ERHead = ERHead->prev; + + DPRINT("New ERHead is 0x%X\n", ERHead); + + DPRINT("Setting exception registration at 0x%X as current\n", + RegistrationFrame->prev); + + // Unlink the exception handler + SehpSetExceptionList(RegistrationFrame->prev); + } + else // The stack looks goofy! Raise an exception to bail out + { + DPRINT("Bad stack\n"); + + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_BAD_STACK; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + + RtlRaiseException(&er2); + } + } + + // If we get here, we reached the end of the EXCEPTION_REGISTRATION list. + // This shouldn't happen normally. + + DPRINT("Ran out of exception registrations. RegistrationFrame is (0x%X)\n", + RegistrationFrame); + + if ((ULONG_PTR)RegistrationFrame == -1) + SehpContinue(&Context, FALSE); + else + NtRaiseException(pExceptRec, &Context, 0); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/rtl/i386/except.s b/reactos/ntoskrnl/rtl/i386/except.s new file mode 100755 index 00000000000..156da64b626 --- /dev/null +++ b/reactos/ntoskrnl/rtl/i386/except.s @@ -0,0 +1,291 @@ +/* $Id: except.s,v 1.4 2004/06/25 16:39:41 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Kernel-mode exception support for IA-32 + * FILE: ntoskrnl/rtl/i386/except.s + * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + * NOTES: This file is shared with lib/ntdll/rtl/i386/except.s. + * Please keep them in sync. + */ + +#define EXCEPTION_UNWINDING 0x02 + +#define EREC_FLAGS 0x04 + +#define ExceptionContinueExecution 0 +#define ExceptionContinueSearch 1 +#define ExceptionNestedException 2 +#define ExceptionCollidedUnwind 3 + +.globl _RtlpExecuteHandlerForException +.globl _RtlpExecuteHandlerForUnwind + +#define CONTEXT_FLAGS 0x00 +#define CONTEXT_SEGGS 0x8C +#define CONTEXT_SEGFS 0x90 +#define CONTEXT_SEGES 0x94 +#define CONTEXT_SEGDS 0x98 +#define CONTEXT_EDI 0x9C +#define CONTEXT_ESI 0xA0 +#define CONTEXT_EBX 0xA4 +#define CONTEXT_EDX 0xA8 +#define CONTEXT_ECX 0xAC +#define CONTEXT_EAX 0xB0 +#define CONTEXT_EBP 0xB4 +#define CONTEXT_EIP 0xB8 +#define CONTEXT_SEGCS 0xBC +#define CONTEXT_EFLAGS 0xC0 +#define CONTEXT_ESP 0xC4 +#define CONTEXT_SEGSS 0xC8 + + +#define RCC_CONTEXT 0x08 + +// EAX = value to print +_do_debug: + pushal + pushl %eax + call _AsmDebug@4 + popal + ret + +#ifndef __NTOSKRNL__ + +// +// VOID +// RtlpCaptureContext(PCONTEXT pContext); +// +// Parameters: +// [ESP+08h] - PCONTEXT_X86 pContext +// Registers: +// None +// Returns: +// Nothing +// Notes: +// Grabs the current CPU context. +.globl _RtlpCaptureContext +_RtlpCaptureContext: + pushl %ebp + movl %esp, %ebp + movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure + + cld + pushf + pop %eax + movl %eax, CONTEXT_EFLAGS(%edx) + xorl %eax, %eax + movl %eax, CONTEXT_EAX(%edx) + movl %eax, CONTEXT_EBX(%edx) + movl %eax, CONTEXT_ECX(%edx) + movl %eax, CONTEXT_EDX(%edx) + movl %eax, CONTEXT_ESI(%edx) + movl %eax, CONTEXT_EDI(%edx) + movl %cs, %eax + movl %eax, CONTEXT_SEGCS(%edx) + movl %ds, %eax + movl %eax, CONTEXT_SEGDS(%edx) + movl %es, %eax + movl %eax, CONTEXT_SEGES(%edx) + movl %fs, %eax + movl %eax, CONTEXT_SEGFS(%edx) + movl %gs, %eax + movl %eax, CONTEXT_SEGGS(%edx) + movl %ss, %eax + movl %eax, CONTEXT_SEGSS(%edx) + + // + // STACK LAYOUT: - (ESP to put in context structure) + // - RETURN ADDRESS OF CALLER OF CALLER + // - EBP OF CALLER OF CALLER + // ... + // - RETURN ADDRESS OF CALLER + // - EBP OF CALLER + // ... + // + + // Get return address of the caller of the caller of this function + movl %ebp, %ebx + //movl 4(%ebx), %eax // EAX = return address of caller + movl (%ebx), %ebx // EBX = EBP of caller + + movl 4(%ebx), %eax // EAX = return address of caller of caller + movl (%ebx), %ebx // EBX = EBP of caller of caller + + movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller + movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller + addl $8, %ebx + movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 + + movl %ebp, %esp + popl %ebp + ret + +#endif /* !__NTOSKRNL__ */ + +#define REH_ERECORD 0x08 +#define REH_RFRAME 0x0C +#define REH_CONTEXT 0x10 +#define REH_DCONTEXT 0x14 +#define REH_EROUTINE 0x18 + +// Parameters: +// None +// Registers: +// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord +// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame +// [EBP+10h] - PVOID Context +// [EBP+14h] - PVOID DispatcherContext +// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine +// EDX - Address of protecting exception handler +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Setup the protecting exception handler and call the exception +// handler in the right context. +_RtlpExecuteHandler: + pushl %ebp + movl %esp, %ebp + pushl REH_RFRAME(%ebp) + + pushl %edx + pushl %fs:0x0 + movl %esp, %fs:0x0 + + // Prepare to call the exception handler + pushl REH_DCONTEXT(%ebp) + pushl REH_CONTEXT(%ebp) + pushl REH_RFRAME(%ebp) + pushl REH_ERECORD(%ebp) + + // Now call the exception handler + movl REH_EROUTINE(%ebp), %eax + call *%eax + + cmpl $-1, %fs:0x0 + jne .reh_stack_looks_ok + + // This should not happen + pushl 0 + pushl 0 + pushl 0 + pushl 0 + call _RtlAssert@16 + +.reh_loop: + jmp .reh_loop + +.reh_stack_looks_ok: + movl %fs:0x0, %esp + + // Return to the 'front-end' for this function + popl %fs:0x0 + movl %ebp, %esp + popl %ebp + ret + + +#define REP_ERECORD 0x04 +#define REP_RFRAME 0x08 +#define REP_CONTEXT 0x0C +#define REP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting nested exceptions. +_RtlpExceptionProtector: + movl $ExceptionContinueSearch, %eax + movl REP_ERECORD(%esp), %ecx + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jnz .rep_end + + // Unwinding is not taking place, so return ExceptionNestedException + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a nested exception occurred + movl REP_DCONTEXT(%esp), %ecx + movl REP_RFRAME(%esp), %eax + movl %eax, (%ecx) + movl $ExceptionNestedException, %eax + +.rep_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Front-end +_RtlpExecuteHandlerForException: + movl $_RtlpExceptionProtector, %edx + jmp _RtlpExecuteHandler + + +#define RUP_ERECORD 0x04 +#define RUP_RFRAME 0x08 +#define RUP_CONTEXT 0x0C +#define RUP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting collided unwinds. +_RtlpUnwindProtector: + movl $ExceptionContinueSearch, %eax + movl %ecx, RUP_ERECORD(%esp) + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jz .rup_end + + // Unwinding is taking place, so return ExceptionCollidedUnwind + + movl RUP_RFRAME(%esp), %ecx + movl RUP_DCONTEXT(%esp), %edx + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a collision occurred + movl RUP_RFRAME(%ecx), %eax + movl %eax, (%edx) + movl $ExceptionCollidedUnwind, %eax + +.rup_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +_RtlpExecuteHandlerForUnwind: + movl $_RtlpUnwindProtector, %edx + jmp _RtlpExecuteHandler From acf32a29887a1c1655ab079be86878157698166e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 25 Jun 2004 18:50:48 +0000 Subject: [PATCH 086/356] Fix crash in loader relocation code. svn path=/trunk/; revision=9872 --- reactos/lib/ntdll/ldr/utils.c | 121 +++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 54 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 88ec8c81f89..2ad6c65bc61 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.90 2004/06/20 10:36:17 gvg Exp $ +/* $Id: utils.c,v 1.91 2004/06/25 18:50:48 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -717,7 +717,10 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL, NTSTATUS Status; PLDR_MODULE Module; - TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n", Name, SearchPath ? " from " : "", SearchPath ? SearchPath : L""); + TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n", + Name, + SearchPath ? " from " : "", + SearchPath ? SearchPath : L""); if (Name == NULL) { @@ -1217,18 +1220,19 @@ LdrGetExportByName(PVOID BaseAddress, * NOTE * */ -static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, - PVOID ImageBase) +static NTSTATUS +LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, + PVOID ImageBase) { - USHORT NumberOfEntries; - PUSHORT pValue16; - ULONG RelocationRVA; - ULONG Delta32; - ULONG Offset; - PULONG pValue32; + USHORT NumberOfEntries; + PUSHORT pValue16; + ULONG RelocationRVA; + LONG Delta32; + ULONG Offset; + PULONG pValue32; PRELOCATION_DIRECTORY RelocationDir; - PRELOCATION_ENTRY RelocationBlock; - int i; + PRELOCATION_ENTRY RelocationBlock; + int i; PIMAGE_DATA_DIRECTORY RelocationDDir; ULONG OldProtect; PVOID ProtectBase; @@ -1239,6 +1243,8 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, NTSTATUS Status; PIMAGE_SECTION_HEADER Sections; ULONG MaxExtend; + ULONG RelocationBlockOffset; + ULONG RelocationSectionSize; if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) { @@ -1248,6 +1254,7 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, Sections = (PIMAGE_SECTION_HEADER)((PVOID)NTHeaders + sizeof(IMAGE_NT_HEADERS)); MaxExtend = 0; + RelocationSectionSize = 0; for (i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++) { if (!(Sections[i].Characteristics & IMAGE_SECTION_NOLOAD)) @@ -1257,6 +1264,12 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, (ULONG)(Sections[i].VirtualAddress + Sections[i].Misc.VirtualSize); MaxExtend = max(MaxExtend, Extend); } + + if (!memcmp(Sections[i].Name,".reloc", 6)) + { + RelocationSectionSize = Sections[i].Misc.VirtualSize; + DPRINT("Relocation section size: %lx\n", RelocationSectionSize); + } } RelocationDDir = @@ -1268,7 +1281,8 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, RelocationDir = (PRELOCATION_DIRECTORY)((PCHAR)ImageBase + RelocationRVA); - while (RelocationDir->SizeOfBlock) + RelocationBlockOffset = 0; + while (RelocationBlockOffset < RelocationSectionSize) { if (RelocationDir->VirtualAddress > MaxExtend) { @@ -1319,7 +1333,6 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, return(Status); } } - for (i = 0; i < NumberOfEntries; i++) { Offset = (RelocationBlock[i].TypeOffset & 0xfff); @@ -1352,7 +1365,7 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, case TYPE_RELOC_HIGHADJ: /* FIXME: do the highadjust fixup */ DPRINT("TYPE_RELOC_HIGHADJ fixup not implemented, sorry\n"); - return(STATUS_UNSUCCESSFUL); + return STATUS_UNSUCCESSFUL; default: DPRINT("unexpected fixup type\n"); @@ -1388,8 +1401,10 @@ static NTSTATUS LdrPerformRelocations (PIMAGE_NT_HEADERS NTHeaders, RelocationRVA += RelocationDir->SizeOfBlock; RelocationDir = (PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA); + RelocationBlockOffset += RelocationDir->SizeOfBlock; } } + return STATUS_SUCCESS; } @@ -1427,10 +1442,9 @@ LdrpGetOrLoadModule(PWCHAR SerachPath, } static NTSTATUS -LdrpProcessImportDirectoryEntry( - PLDR_MODULE Module, - PLDR_MODULE ImportedModule, - PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory) +LdrpProcessImportDirectoryEntry(PLDR_MODULE Module, + PLDR_MODULE ImportedModule, + PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory) { NTSTATUS Status; PVOID* ImportAddressList; @@ -2571,8 +2585,8 @@ LdrpAttachProcess(VOID) NTSTATUS STDCALL LdrShutdownProcess (VOID) { - LdrpDetachProcess(TRUE); - return STATUS_SUCCESS; + LdrpDetachProcess(TRUE); + return STATUS_SUCCESS; } /* @@ -2582,48 +2596,47 @@ LdrShutdownProcess (VOID) NTSTATUS LdrpAttachThread (VOID) { - PLIST_ENTRY ModuleListHead; - PLIST_ENTRY Entry; - PLDR_MODULE Module; - NTSTATUS Status; + PLIST_ENTRY ModuleListHead; + PLIST_ENTRY Entry; + PLDR_MODULE Module; + NTSTATUS Status; - DPRINT("LdrpAttachThread() called for %wZ\n", - &ExeModule->BaseDllName); + DPRINT("LdrpAttachThread() called for %wZ\n", + &ExeModule->BaseDllName); - RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock); + RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock); - Status = LdrpInitializeTlsForThread(); + Status = LdrpInitializeTlsForThread(); - if (NT_SUCCESS(Status)) - { + if (NT_SUCCESS(Status)) + { + ModuleListHead = &NtCurrentPeb()->Ldr->InInitializationOrderModuleList; + Entry = ModuleListHead->Flink; - ModuleListHead = &NtCurrentPeb()->Ldr->InInitializationOrderModuleList; - Entry = ModuleListHead->Flink; + while (Entry != ModuleListHead) + { + Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); + if (Module->Flags & PROCESS_ATTACH_CALLED && + !(Module->Flags & DONT_CALL_FOR_THREAD) && + !(Module->Flags & UNLOAD_IN_PROGRESS)) + { + TRACE_LDR("%wZ - Calling entry point at %x for thread attaching\n", + &Module->BaseDllName, Module->EntryPoint); + LdrpCallDllEntry(Module, DLL_THREAD_ATTACH, NULL); + } + Entry = Entry->Flink; + } - while (Entry != ModuleListHead) - { - Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList); - if (Module->Flags & PROCESS_ATTACH_CALLED && - !(Module->Flags & DONT_CALL_FOR_THREAD) && - !(Module->Flags & UNLOAD_IN_PROGRESS)) - { - TRACE_LDR("%wZ - Calling entry point at %x for thread attaching\n", - &Module->BaseDllName, Module->EntryPoint); - LdrpCallDllEntry(Module, DLL_THREAD_ATTACH, NULL); - } - Entry = Entry->Flink; - } + Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink; + Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList); + LdrpTlsCallback(Module, DLL_THREAD_ATTACH); + } - Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink; - Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList); - LdrpTlsCallback(Module, DLL_THREAD_ATTACH); - } + RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock); - RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock); + DPRINT("LdrpAttachThread() done\n"); - DPRINT("LdrpAttachThread() done\n"); - - return Status; + return Status; } From d5255272ce9df007e16361a686a836be0bd70f1a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 25 Jun 2004 19:05:20 +0000 Subject: [PATCH 087/356] Fix a typo. svn path=/trunk/; revision=9874 --- reactos/lib/ntdll/ldr/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 2ad6c65bc61..1200f1cc98f 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.91 2004/06/25 18:50:48 ekohl Exp $ +/* $Id: utils.c,v 1.92 2004/06/25 19:05:20 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1227,7 +1227,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, USHORT NumberOfEntries; PUSHORT pValue16; ULONG RelocationRVA; - LONG Delta32; + ULONG Delta32; ULONG Offset; PULONG pValue32; PRELOCATION_DIRECTORY RelocationDir; From 75fa578ba601b2300f288d9139ba1085b53acbd6 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Fri, 25 Jun 2004 23:30:22 +0000 Subject: [PATCH 088/356] sndblst fixes based on patch by Sylvain Petreolle. svn path=/trunk/; revision=9875 --- reactos/drivers/dd/sndblst/dma.c | 15 +++++++++++---- reactos/drivers/dd/sndblst/makefile | 2 ++ reactos/drivers/dd/sndblst/portio.c | 5 +++++ reactos/drivers/dd/sndblst/sbdebug.h | 2 +- reactos/drivers/dd/sndblst/sndblst.c | 6 ++++-- reactos/drivers/dd/sndblst/sndblst.h | 6 +++--- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/reactos/drivers/dd/sndblst/dma.c b/reactos/drivers/dd/sndblst/dma.c index cf72c558917..bbeddbbce19 100644 --- a/reactos/drivers/dd/sndblst/dma.c +++ b/reactos/drivers/dd/sndblst/dma.c @@ -73,6 +73,7 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) NTSTATUS Status; PDEVICE_EXTENSION Device = DeviceObject->DeviceExtension; KEVENT DMAEvent; + KIRQL OldIrql; // Buffersize should already be set but it isn't yet ! Device->BufferSize = SB_BUFSIZE; @@ -138,7 +139,9 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) &Device->Buffer, FALSE); // For some reason BufferSize == 0 here?! - DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); +// DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); + DPRINT("Bufsize == %u,", Device->BufferSize); + DPRINT("Buffer == 0x%x\n", Device->Buffer); if (! Device->VirtualBuffer) { @@ -147,14 +150,16 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) return FALSE; } - DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); +// DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); + DPRINT("Bufsize == %u,", Device->BufferSize); + DPRINT("Buffer == 0x%x\n", Device->Buffer); DPRINT("Calling IoAllocateMdl()\n"); Device->Mdl = IoAllocateMdl(Device->VirtualBuffer, Device->BufferSize, FALSE, FALSE, NULL); DPRINT("Bufsize == %u\n", Device->BufferSize); // IS THIS RIGHT: - if (! Device->VirtualBuffer) + if (! Device->Mdl) { DPRINT("IoAllocateMdl() FAILED\n"); // Free the HAL buffer @@ -171,11 +176,13 @@ BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) // part II: KeInitializeEvent(&DMAEvent, SynchronizationEvent, FALSE); // Raise IRQL + KeRaiseIrql(DISPATCH_LEVEL,&OldIrql); IoAllocateAdapterChannel(Device->Adapter, DeviceObject, BYTES_TO_PAGES(Device->BufferSize), SoundProgramDMA, &DMAEvent); - DPRINT("VBuffer == 0x%x Bufsize == %u\n", Device->VirtualBuffer, Device->BufferSize); // Lower IRQL + KeLowerIrql(OldIrql); + DPRINT("VBuffer == 0x%x Bufsize == %u\n", Device->VirtualBuffer, Device->BufferSize); KeWaitForSingleObject(&DMAEvent, Executive, KernelMode, FALSE, NULL); diff --git a/reactos/drivers/dd/sndblst/makefile b/reactos/drivers/dd/sndblst/makefile index 8435e542515..048b520f1b8 100644 --- a/reactos/drivers/dd/sndblst/makefile +++ b/reactos/drivers/dd/sndblst/makefile @@ -2,6 +2,8 @@ PATH_TO_TOP = ../../.. TARGET_BOOTSTRAP = yes +TARGET_CFLAGS = -Wall #-Werror + TARGET_TYPE = driver TARGET_NAME = sndblst diff --git a/reactos/drivers/dd/sndblst/portio.c b/reactos/drivers/dd/sndblst/portio.c index 7e12e414e89..6c918084fcd 100644 --- a/reactos/drivers/dd/sndblst/portio.c +++ b/reactos/drivers/dd/sndblst/portio.c @@ -101,6 +101,11 @@ WORD InitSoundCard(UINT BasePort) DPRINT("DSP v%d.%d\n", DSP_Major, DSP_Minor); + // if audio is disabled, + // version tests return 0xFF everywhere + if (DSP_Major == 0xFF && DSP_Minor == 0xFF) + return FALSE; + DPRINT("Sound card initialized!\n"); return (DSP_Major * 256) + DSP_Minor; diff --git a/reactos/drivers/dd/sndblst/sbdebug.h b/reactos/drivers/dd/sndblst/sbdebug.h index 30e7feec961..3623ae370b6 100644 --- a/reactos/drivers/dd/sndblst/sbdebug.h +++ b/reactos/drivers/dd/sndblst/sbdebug.h @@ -17,7 +17,7 @@ else if (s == STATUS_ACCESS_DENIED) \ DPRINT("NTSTATUS == ACCESS_DENIED\n") \ else \ - DPRINT("NTSTATUS == FAILURE (???)\n"); \ + DPRINT("NTSTATUS == FAILURE (Unknown)\n"); \ } #else #define TEST_STATUS(s) diff --git a/reactos/drivers/dd/sndblst/sndblst.c b/reactos/drivers/dd/sndblst/sndblst.c index 85f043a564c..7cb3990155a 100644 --- a/reactos/drivers/dd/sndblst/sndblst.c +++ b/reactos/drivers/dd/sndblst/sndblst.c @@ -107,10 +107,10 @@ NTSTATUS InitDevice( s = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath, Table, &Parameters, NULL); -*/ if (! NT_SUCCESS(s)) return s; +*/ DPRINT("Port 0x%x IRQ %d DMA %d\n", Parameters->Port, Parameters->IRQ, Parameters->DMA); @@ -124,6 +124,7 @@ NTSTATUS InitDevice( // Set state indication somehow // Failure - what error code do we give?! // return STATUS_???? + return STATUS_UNSUCCESSFUL; } DSP_Major = DSP_Version / 256; @@ -453,7 +454,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject, // DeviceExtension = DeviceObject->DeviceExtension; // DeviceExtension->BeepOn = FALSE; - return(STATUS_SUCCESS); +// return(STATUS_SUCCESS); + return(Status); } /* EOF */ diff --git a/reactos/drivers/dd/sndblst/sndblst.h b/reactos/drivers/dd/sndblst/sndblst.h index 39f26614f77..deee5340abe 100644 --- a/reactos/drivers/dd/sndblst/sndblst.h +++ b/reactos/drivers/dd/sndblst/sndblst.h @@ -46,9 +46,9 @@ #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND #define IOCTL_WAVE_BASE 0x0000 // CORRECT? -//#define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, \ -// METHOD_BUFFERED, FILE_WRITE_ACCESS) - +/* #define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, \ + * METHOD_BUFFERED, FILE_WRITE_ACCESS) + */ // Some constants From 97a29e0c78f290be00a4723d8e96fb9c43f8311e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 25 Jun 2004 23:47:04 +0000 Subject: [PATCH 089/356] fixed binary editing of strings in the ansi version, query and set the value using the unicode version in this case. svn path=/trunk/; revision=9876 --- reactos/subsys/system/regedit/edit.c | 46 ++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index 18a389b9240..ae38df61031 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -633,7 +633,25 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin) } else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY) { - if(valueDataLen > 0) + #ifndef UNICODE + LPWSTR u_valuename; + int len_vname = lstrlen(valueName); + + if(len_vname > 0) + { + if(!(u_valuename = HeapAlloc(GetProcessHeap(), 0, (len_vname + 1) * sizeof(WCHAR)))) + { + error(hwnd, IDS_TOO_BIG_VALUE, len_vname); + goto done; + } + /* convert the ansi value name to an unicode string */ + MultiByteToWideChar(CP_ACP, 0, valueName, -1, u_valuename, len_vname + 1); + valueDataLen *= sizeof(WCHAR); + } + else + u_valuename = L""; + #endif + if(valueDataLen > 0) { if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) { @@ -641,10 +659,21 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin) goto done; } - lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)binValueData, &valueDataLen); + /* force to use the unicode version, so editing strings in binary mode is correct */ + lRet = RegQueryValueExW(hKey, + #ifndef UNICODE + u_valuename, + #else + valueName, + #endif + 0, 0, (LPBYTE)binValueData, &valueDataLen); if (lRet != ERROR_SUCCESS) { HeapFree(GetProcessHeap(), 0, binValueData); + #ifndef UNICODE + if(len_vname > 0) + HeapFree(GetProcessHeap(), 0, u_valuename); + #endif error(hwnd, IDS_BAD_VALUE, valueName); goto done; } @@ -656,12 +685,23 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin) if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK) { - lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)binValueData, valueDataLen); + /* force to use the unicode version, so editing strings in binary mode is correct */ + lRet = RegSetValueExW(hKey, + #ifndef UNICODE + u_valuename, + #else + valueName, + #endif + 0, type, (LPBYTE)binValueData, valueDataLen); if (lRet == ERROR_SUCCESS) result = TRUE; } if(binValueData != NULL) HeapFree(GetProcessHeap(), 0, binValueData); + #ifndef UNICODE + if(len_vname > 0) + HeapFree(GetProcessHeap(), 0, u_valuename); + #endif } else { From 2678ec03871234549f27bcd462dca5485eb91f1e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 26 Jun 2004 08:09:55 +0000 Subject: [PATCH 090/356] fixed little gdi handle leak svn path=/trunk/; revision=9879 --- reactos/subsys/system/regedit/hexedit.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index b52907017a8..718faaa233c 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -506,6 +506,11 @@ HEXEDIT_WM_NCDESTROY(PHEXEDIT_DATA hed) LocalFree(hed->hBuffer); } + if(hed->hFont) + { + DeleteObject(hed->hFont); + } + SetWindowLong(hed->hWndSelf, 0, 0); HeapFree(GetProcessHeap(), 0, hed); From 1336676b5ebb18074267a80fa085206671b7667e Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sat, 26 Jun 2004 10:43:18 +0000 Subject: [PATCH 091/356] simplified chinese explorer resources by Larry Li (not for windres) svn path=/trunk/; revision=9880 --- reactos/subsys/system/explorer/explorer-cn.rc | Bin 0 -> 32924 bytes .../subsys/system/explorer/explorer_intres.rc | 456 +----------------- 2 files changed, 23 insertions(+), 433 deletions(-) create mode 100644 reactos/subsys/system/explorer/explorer-cn.rc diff --git a/reactos/subsys/system/explorer/explorer-cn.rc b/reactos/subsys/system/explorer/explorer-cn.rc new file mode 100644 index 0000000000000000000000000000000000000000..8a0495b15c7c912f4651de47b26b3103929f2a30 GIT binary patch literal 32924 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 WlCP96`o7f#S^Mxitl#=xTmC Date: Sat, 26 Jun 2004 11:23:32 +0000 Subject: [PATCH 092/356] Stop at the real end of the relocation table. svn path=/trunk/; revision=9881 --- reactos/lib/ntdll/ldr/utils.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 1200f1cc98f..e5c86e75217 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.92 2004/06/25 19:05:20 ekohl Exp $ +/* $Id: utils.c,v 1.93 2004/06/26 11:23:32 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1289,6 +1289,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, RelocationRVA += RelocationDir->SizeOfBlock; RelocationDir = (PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA); + RelocationBlockOffset += RelocationDir->SizeOfBlock; continue; } @@ -1333,6 +1334,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, return(Status); } } + for (i = 0; i < NumberOfEntries; i++) { Offset = (RelocationBlock[i].TypeOffset & 0xfff); From e4c1673f8066a7a84294ea6f03c318e096fcd17b Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 26 Jun 2004 12:56:11 +0000 Subject: [PATCH 093/356] - Partial implementation of CompareStringW. Fixes bug #378. svn path=/trunk/; revision=9883 --- reactos/lib/kernel32/misc/stubs.c | 42 ++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index f31bd6ee07e..0c5056691c7 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.78 2004/06/20 23:42:07 gdalsnes Exp $ +/* $Id: stubs.c,v 1.79 2004/06/26 12:56:11 navaraf Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -106,8 +106,44 @@ CompareStringW ( int cchCount2 ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + INT Result; + UNICODE_STRING String1, String2; + + if (!lpString1 || !lpString2) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if (dwCmpFlags & ~(NORM_IGNORECASE | NORM_IGNORENONSPACE | + NORM_IGNORESYMBOLS | SORT_STRINGSORT | NORM_IGNOREKANATYPE | + NORM_IGNOREWIDTH | 0x10000000)) + { + SetLastError(ERROR_INVALID_FLAGS); + return 0; + } + + if (dwCmpFlags & ~NORM_IGNORECASE) + { + DPRINT1("CompareString: Unimplemented flags - 0x%x\n", + dwCmpFlags & ~NORM_IGNORECASE); + } + + if (cchCount1 < 0) cchCount1 = lstrlenW(lpString1); + if (cchCount2 < 0) cchCount2 = lstrlenW(lpString2); + + String1.Length = String1.MaximumLength = cchCount1 * sizeof(WCHAR); + String1.Buffer = (LPWSTR)lpString1; + String2.Length = String2.MaximumLength = cchCount2 * sizeof(WCHAR); + String2.Buffer = (LPWSTR)lpString2; + + Result = RtlCompareUnicodeString( + &String1, &String2, dwCmpFlags & NORM_IGNORECASE); + + if (Result) /* need to translate result */ + return (Result < 0) ? CSTR_LESS_THAN : CSTR_GREATER_THAN; + + return CSTR_EQUAL; } From 399da202962e9864d833495ad22cb7058cb00609 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 26 Jun 2004 14:37:05 +0000 Subject: [PATCH 094/356] - Rewritten relocation code to not make invalid assumptions (".reloc" section name) and to not unprotect second page (not needed really). svn path=/trunk/; revision=9884 --- reactos/lib/ntdll/ldr/utils.c | 235 ++++++++++------------------------ 1 file changed, 68 insertions(+), 167 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index e5c86e75217..c152a119888 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.93 2004/06/26 11:23:32 ekohl Exp $ +/* $Id: utils.c,v 1.94 2004/06/26 14:37:05 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1224,187 +1224,88 @@ static NTSTATUS LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, PVOID ImageBase) { - USHORT NumberOfEntries; - PUSHORT pValue16; - ULONG RelocationRVA; - ULONG Delta32; - ULONG Offset; - PULONG pValue32; - PRELOCATION_DIRECTORY RelocationDir; - PRELOCATION_ENTRY RelocationBlock; - int i; PIMAGE_DATA_DIRECTORY RelocationDDir; - ULONG OldProtect; - PVOID ProtectBase; - ULONG ProtectSize; - ULONG OldProtect2; - PVOID ProtectBase2; - ULONG ProtectSize2; + PIMAGE_BASE_RELOCATION RelocationDir, RelocationEnd; + ULONG Count, ProtectSize, OldProtect, i; + PVOID Page, ProtectPage; + PWORD TypeOffset; + ULONG Delta = (ULONG_PTR)ImageBase - NTHeaders->OptionalHeader.ImageBase; NTSTATUS Status; - PIMAGE_SECTION_HEADER Sections; - ULONG MaxExtend; - ULONG RelocationBlockOffset; - ULONG RelocationSectionSize; if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) { return STATUS_UNSUCCESSFUL; } - Sections = - (PIMAGE_SECTION_HEADER)((PVOID)NTHeaders + sizeof(IMAGE_NT_HEADERS)); - MaxExtend = 0; - RelocationSectionSize = 0; - for (i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++) - { - if (!(Sections[i].Characteristics & IMAGE_SECTION_NOLOAD)) - { - ULONG Extend; - Extend = - (ULONG)(Sections[i].VirtualAddress + Sections[i].Misc.VirtualSize); - MaxExtend = max(MaxExtend, Extend); - } - - if (!memcmp(Sections[i].Name,".reloc", 6)) - { - RelocationSectionSize = Sections[i].Misc.VirtualSize; - DPRINT("Relocation section size: %lx\n", RelocationSectionSize); - } - } - RelocationDDir = &NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; - RelocationRVA = RelocationDDir->VirtualAddress; - if (RelocationRVA) + if (RelocationDDir->VirtualAddress == 0 || RelocationDDir->Size == 0) { - RelocationDir = - (PRELOCATION_DIRECTORY)((PCHAR)ImageBase + RelocationRVA); + return STATUS_SUCCESS; + } + + ProtectSize = PAGE_SIZE; + RelocationDir = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)ImageBase + + RelocationDDir->VirtualAddress); + RelocationEnd = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)ImageBase + + RelocationDDir->VirtualAddress + RelocationDDir->Size); + while (RelocationDir < RelocationEnd && + RelocationDir->SizeOfBlock > 0) + { + Count = (RelocationDir->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / + sizeof(WORD); + Page = ImageBase + RelocationDir->VirtualAddress; + TypeOffset = (PWORD)(RelocationDir + 1); - RelocationBlockOffset = 0; - while (RelocationBlockOffset < RelocationSectionSize) + /* Unprotect the page we're about to relocate. */ + ProtectPage = Page; + Status = NtProtectVirtualMemory(NtCurrentProcess(), + &ProtectPage, + &ProtectSize, + PAGE_READWRITE, + &OldProtect); + if (!NT_SUCCESS(Status)) { - if (RelocationDir->VirtualAddress > MaxExtend) - { - RelocationRVA += RelocationDir->SizeOfBlock; - RelocationDir = - (PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA); - RelocationBlockOffset += RelocationDir->SizeOfBlock; - continue; - } - - Delta32 = (ULONG)(ImageBase - NTHeaders->OptionalHeader.ImageBase); - RelocationBlock = - (PRELOCATION_ENTRY) (RelocationRVA + ImageBase + - sizeof (RELOCATION_DIRECTORY)); - NumberOfEntries = - RelocationDir->SizeOfBlock - sizeof (RELOCATION_DIRECTORY); - NumberOfEntries = NumberOfEntries / sizeof (RELOCATION_ENTRY); - - ProtectBase = ImageBase + RelocationDir->VirtualAddress; - ProtectSize = PAGE_SIZE; - Status = NtProtectVirtualMemory(NtCurrentProcess(), - &ProtectBase, - &ProtectSize, - PAGE_READWRITE, - &OldProtect); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to unprotect relocation target.\n"); - return(Status); - } - - if (RelocationDir->VirtualAddress + PAGE_SIZE < MaxExtend) - { - ProtectBase2 = ImageBase + RelocationDir->VirtualAddress + PAGE_SIZE; - ProtectSize2 = PAGE_SIZE; - Status = NtProtectVirtualMemory(NtCurrentProcess(), - &ProtectBase2, - &ProtectSize2, - PAGE_READWRITE, - &OldProtect2); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to unprotect relocation target (2).\n"); - NtProtectVirtualMemory(NtCurrentProcess(), - &ProtectBase, - &ProtectSize, - OldProtect, - &OldProtect); - return(Status); - } - } - - for (i = 0; i < NumberOfEntries; i++) - { - Offset = (RelocationBlock[i].TypeOffset & 0xfff); - Offset += (ULONG)(RelocationDir->VirtualAddress + ImageBase); - - /* - * What kind of relocations should we perform - * for the current entry? - */ - switch (RelocationBlock[i].TypeOffset >> 12) - { - case TYPE_RELOC_ABSOLUTE: - break; - - case TYPE_RELOC_HIGH: - pValue16 = (PUSHORT)Offset; - *pValue16 += Delta32 >> 16; - break; - - case TYPE_RELOC_LOW: - pValue16 = (PUSHORT)Offset; - *pValue16 += Delta32 & 0xffff; - break; - - case TYPE_RELOC_HIGHLOW: - pValue32 = (PULONG)Offset; - *pValue32 += Delta32; - break; - - case TYPE_RELOC_HIGHADJ: - /* FIXME: do the highadjust fixup */ - DPRINT("TYPE_RELOC_HIGHADJ fixup not implemented, sorry\n"); - return STATUS_UNSUCCESSFUL; - - default: - DPRINT("unexpected fixup type\n"); - return STATUS_UNSUCCESSFUL; - } - } - - Status = NtProtectVirtualMemory(NtCurrentProcess(), - &ProtectBase, - &ProtectSize, - OldProtect, - &OldProtect); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect relocation target.\n"); - return(Status); - } - - if (RelocationDir->VirtualAddress + PAGE_SIZE < MaxExtend) - { - Status = NtProtectVirtualMemory(NtCurrentProcess(), - &ProtectBase2, - &ProtectSize2, - OldProtect2, - &OldProtect2); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect relocation target2.\n"); - return(Status); - } - } - - RelocationRVA += RelocationDir->SizeOfBlock; - RelocationDir = - (PRELOCATION_DIRECTORY) (ImageBase + RelocationRVA); - RelocationBlockOffset += RelocationDir->SizeOfBlock; + DPRINT1("Failed to unprotect relocation target.\n"); + return(Status); } + + /* Patch the page. */ + for (i = 0; i < Count; i++) + { + SHORT Offset = TypeOffset[i] & 0xFFF; + USHORT Type = TypeOffset[i] >> 12; + + switch (Type) + { + case IMAGE_REL_BASED_ABSOLUTE: + break; + case IMAGE_REL_BASED_HIGH: + *(PUSHORT)(Page + Offset) += HIWORD(Delta); + break; + case IMAGE_REL_BASED_LOW: + *(PUSHORT)(Page + Offset) += LOWORD(Delta); + break; + case IMAGE_REL_BASED_HIGHLOW: + *(PULONG)(Page + Offset) += Delta; + break; + case IMAGE_REL_BASED_HIGHADJ: + default: + DPRINT("Unknown/unsupported fixup type %d.\n", type); + return STATUS_UNSUCCESSFUL; + } + } + + /* Restore old page protection. */ + NtProtectVirtualMemory(NtCurrentProcess(), + &ProtectPage, + &ProtectSize, + OldProtect, + &OldProtect); + + RelocationDir = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)RelocationDir + + RelocationDir->SizeOfBlock); } return STATUS_SUCCESS; From 9cea7cc06ce4344a3d0389945e14eb0868ee3577 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 26 Jun 2004 15:11:14 +0000 Subject: [PATCH 095/356] - Readded the code for unportecting second page while relocating. Some applications like OpenOffice actually depend on it. svn path=/trunk/; revision=9885 --- reactos/lib/ntdll/ldr/utils.c | 39 +++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index c152a119888..e68ef93bcaa 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.94 2004/06/26 14:37:05 navaraf Exp $ +/* $Id: utils.c,v 1.95 2004/06/26 15:11:14 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1226,8 +1226,8 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, { PIMAGE_DATA_DIRECTORY RelocationDDir; PIMAGE_BASE_RELOCATION RelocationDir, RelocationEnd; - ULONG Count, ProtectSize, OldProtect, i; - PVOID Page, ProtectPage; + ULONG Count, ProtectSize, OldProtect, OldProtect2, i; + PVOID Page, ProtectPage, ProtectPage2; PWORD TypeOffset; ULONG Delta = (ULONG_PTR)ImageBase - NTHeaders->OptionalHeader.ImageBase; NTSTATUS Status; @@ -1258,7 +1258,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, Page = ImageBase + RelocationDir->VirtualAddress; TypeOffset = (PWORD)(RelocationDir + 1); - /* Unprotect the page we're about to relocate. */ + /* Unprotect the page(s) we're about to relocate. */ ProtectPage = Page; Status = NtProtectVirtualMemory(NtCurrentProcess(), &ProtectPage, @@ -1271,6 +1271,27 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, return(Status); } + if (RelocationDir->VirtualAddress + PAGE_SIZE < + NTHeaders->OptionalHeader.SizeOfImage) + { + ProtectPage2 = ProtectPage + PAGE_SIZE; + Status = NtProtectVirtualMemory(NtCurrentProcess(), + &ProtectPage2, + &ProtectSize, + PAGE_READWRITE, + &OldProtect2); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to unprotect relocation target (2).\n"); + NtProtectVirtualMemory(NtCurrentProcess(), + &ProtectPage, + &ProtectSize, + OldProtect, + &OldProtect); + return(Status); + } + } + /* Patch the page. */ for (i = 0; i < Count; i++) { @@ -1304,6 +1325,16 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, OldProtect, &OldProtect); + if (RelocationDir->VirtualAddress + PAGE_SIZE < + NTHeaders->OptionalHeader.SizeOfImage) + { + NtProtectVirtualMemory(NtCurrentProcess(), + &ProtectPage2, + &ProtectSize, + OldProtect2, + &OldProtect2); + } + RelocationDir = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)RelocationDir + RelocationDir->SizeOfBlock); } From 4ba7ff413b263a3718643ec0e4e139753f7b4751 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 26 Jun 2004 18:22:14 +0000 Subject: [PATCH 096/356] - Set the palette for image list DIBs that has 8 or less bits per pixel. svn path=/trunk/; revision=9888 --- reactos/lib/comctl32/imagelist.c | 57 ++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/reactos/lib/comctl32/imagelist.c b/reactos/lib/comctl32/imagelist.c index 77c795b66fa..8ed4b6d0260 100644 --- a/reactos/lib/comctl32/imagelist.c +++ b/reactos/lib/comctl32/imagelist.c @@ -1112,7 +1112,7 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) /* * Draw the initial image */ - if(fStyle & ILD_MASK) { + if (fStyle & ILD_MASK) { if (himl->hbmMask) { BitBlt(hImageDC, 0, 0, cx, cy, hMaskListDC, lx, ly, SRCCOPY); } else { @@ -2824,23 +2824,52 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT width, UINT if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR) { VOID* bits; - BITMAPINFO bmi; + BITMAPINFO *bmi; TRACE("Creating DIBSection: %d Bits per Pixel\n", himl->uBitsPixel); - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi.bmiHeader.biWidth = width; - bmi.bmiHeader.biHeight = height; - bmi.bmiHeader.biPlanes = 1; - bmi.bmiHeader.biBitCount = himl->uBitsPixel; - bmi.bmiHeader.biCompression = BI_RGB; - bmi.bmiHeader.biSizeImage = 0; - bmi.bmiHeader.biXPelsPerMeter = 0; - bmi.bmiHeader.biYPelsPerMeter = 0; - bmi.bmiHeader.biClrUsed = 0; - bmi.bmiHeader.biClrImportant = 0; + if (himl->uBitsPixel <= ILC_COLOR8) + { + LPPALETTEENTRY pal; + ULONG i, colors; + BYTE temp; - hbmNewBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &bits, 0, 0); + colors = 1 << himl->uBitsPixel; + bmi = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFOHEADER) + + sizeof(PALETTEENTRY) * colors); + + pal = (LPPALETTEENTRY)bmi->bmiColors; + GetPaletteEntries(GetStockObject(DEFAULT_PALETTE), 0, colors, pal); + + /* Swap colors returned by GetPaletteEntries so we can use them for + * CreateDIBSection call. */ + for (i = 0; i < colors; i++) + { + temp = pal[i].peBlue; + bmi->bmiColors[i].rgbRed = pal[i].peRed; + bmi->bmiColors[i].rgbBlue = temp; + } + } + else + { + bmi = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFOHEADER)); + } + + bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi->bmiHeader.biWidth = width; + bmi->bmiHeader.biHeight = height; + bmi->bmiHeader.biPlanes = 1; + bmi->bmiHeader.biBitCount = himl->uBitsPixel; + bmi->bmiHeader.biCompression = BI_RGB; + bmi->bmiHeader.biSizeImage = 0; + bmi->bmiHeader.biXPelsPerMeter = 0; + bmi->bmiHeader.biYPelsPerMeter = 0; + bmi->bmiHeader.biClrUsed = 0; + bmi->bmiHeader.biClrImportant = 0; + + hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, &bits, 0, 0); + + HeapFree(GetProcessHeap(), 0, bmi); } else /*if (ilc == ILC_COLORDDB)*/ { From 2859278f6eb0a8c7dd5df2745af8f5f3ca986caa Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 26 Jun 2004 20:02:31 +0000 Subject: [PATCH 097/356] Whole file ripped from Wine's dlls\\kernel\\lcformat.c, rev 1.7 and is unchanged except that includes are different. I thought about adding @implemented to each exported function, but this might make merging harder svn path=/trunk/; revision=9889 --- reactos/lib/kernel32/misc/lcformat.c | 1947 ++++++++++++++++++++++++++ 1 file changed, 1947 insertions(+) create mode 100644 reactos/lib/kernel32/misc/lcformat.c diff --git a/reactos/lib/kernel32/misc/lcformat.c b/reactos/lib/kernel32/misc/lcformat.c new file mode 100644 index 00000000000..03cad7eb433 --- /dev/null +++ b/reactos/lib/kernel32/misc/lcformat.c @@ -0,0 +1,1947 @@ +/* + * Locale-dependent format handling + * + * Copyright 1995 Martin von Loewis + * Copyright 1998 David Lee Lambert + * Copyright 2000 Julio César Gázquez + * Copyright 2003 Jon Griffiths + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Whole file ripped from Wine's dlls\kernel\lcformat.c, rev 1.7 and is + * unchanged except that includes are different. I thought about adding + * @implemeted to each exported function, but this might make merging harder? + * -Gunnar + */ + +#define WINVER 0x0500 + +#include + +#include "wine/config.h" +#include "wine/port.h" +#include "wine/debug.h" +#include "wine/unicode.h" + + +WINE_DEFAULT_DEBUG_CHANNEL(nls); + +#define DATE_DATEVARSONLY 0x0100 /* only date stuff: yMdg */ +#define TIME_TIMEVARSONLY 0x0200 /* only time stuff: hHmst */ + +/* Since calculating the formatting data for each locale is time-consuming, + * we get the format data for each locale only once and cache it in memory. + * We cache both the system default and user overridden data, after converting + * them into the formats that the functions here expect. Since these functions + * will typically be called with only a small number of the total locales + * installed, the memory overhead is minimal while the speedup is significant. + * + * Our cache takes the form of a singly linked list, whose node is below: + */ +#define NLS_NUM_CACHED_STRINGS 45 + +typedef struct _NLS_FORMAT_NODE +{ + LCID lcid; /* Locale Id */ + DWORD dwFlags; /* 0 or LOCALE_NOUSEROVERRIDE */ + DWORD dwCodePage; /* Default code page (if LOCALE_USE_ANSI_CP not given) */ + NUMBERFMTW fmt; /* Default format for numbers */ + CURRENCYFMTW cyfmt; /* Default format for currencies */ + LPWSTR lppszStrings[NLS_NUM_CACHED_STRINGS]; /* Default formats,day/month names */ + WCHAR szShortAM[2]; /* Short 'AM' marker */ + WCHAR szShortPM[2]; /* Short 'PM' marker */ + struct _NLS_FORMAT_NODE *next; +} NLS_FORMAT_NODE; + +/* Macros to get particular data strings from a format node */ +#define GetNegative(fmt) fmt->lppszStrings[0] +#define GetLongDate(fmt) fmt->lppszStrings[1] +#define GetShortDate(fmt) fmt->lppszStrings[2] +#define GetTime(fmt) fmt->lppszStrings[3] +#define GetAM(fmt) fmt->lppszStrings[42] +#define GetPM(fmt) fmt->lppszStrings[43] +#define GetYearMonth(fmt) fmt->lppszStrings[44] + +#define GetLongDay(fmt,day) fmt->lppszStrings[4 + day] +#define GetShortDay(fmt,day) fmt->lppszStrings[11 + day] +#define GetLongMonth(fmt,mth) fmt->lppszStrings[18 + mth] +#define GetShortMonth(fmt,mth) fmt->lppszStrings[30 + mth] + +/* Write access to the cache is protected by this critical section */ +static CRITICAL_SECTION NLS_FormatsCS; +static CRITICAL_SECTION_DEBUG NLS_FormatsCS_debug = +{ + 0, 0, &NLS_FormatsCS, + { &NLS_FormatsCS_debug.ProcessLocksList, + &NLS_FormatsCS_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": NLS_Formats") } +}; +static CRITICAL_SECTION NLS_FormatsCS = { &NLS_FormatsCS_debug, -1, 0, 0, 0, 0 }; + +/************************************************************************** + * NLS_GetLocaleNumber + * + * Get a numeric locale format value. + */ +static DWORD NLS_GetLocaleNumber(LCID lcid, DWORD dwFlags) +{ + WCHAR szBuff[80]; + DWORD dwVal = 0; + + szBuff[0] = '\0'; + GetLocaleInfoW(lcid, dwFlags, szBuff, sizeof(szBuff) / sizeof(WCHAR)); + + if (szBuff[0] && szBuff[1] == ';' && szBuff[2] != '0') + dwVal = (szBuff[0] - '0') * 10 + (szBuff[2] - '0'); + else + { + const WCHAR* iter = szBuff; + dwVal = 0; + while(*iter >= '0' && *iter <= '9') + dwVal = dwVal * 10 + (*iter++ - '0'); + } + return dwVal; +} + +/************************************************************************** + * NLS_GetLocaleString + * + * Get a string locale format value. + */ +static WCHAR* NLS_GetLocaleString(LCID lcid, DWORD dwFlags) +{ + WCHAR szBuff[80], *str; + DWORD dwLen; + + szBuff[0] = '\0'; + GetLocaleInfoW(lcid, dwFlags, szBuff, sizeof(szBuff) / sizeof(WCHAR)); + dwLen = strlenW(szBuff) + 1; + str = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR)); + if (str) + memcpy(str, szBuff, dwLen * sizeof(WCHAR)); + return str; +} + +#define GET_LOCALE_NUMBER(num, type) num = NLS_GetLocaleNumber(lcid, type|dwFlags); \ + TRACE( #type ": %ld (%08lx)\n", (DWORD)num, (DWORD)num) + +#define GET_LOCALE_STRING(str, type) str = NLS_GetLocaleString(lcid, type|dwFlags); \ + TRACE( #type ": '%s'\n", debugstr_w(str)) + +/************************************************************************** + * NLS_GetFormats + * + * Calculate (and cache) the number formats for a locale. + */ +static const NLS_FORMAT_NODE *NLS_GetFormats(LCID lcid, DWORD dwFlags) +{ + /* GetLocaleInfo() identifiers for cached formatting strings */ + static const USHORT NLS_LocaleIndices[] = { + LOCALE_SNEGATIVESIGN, + LOCALE_SLONGDATE, LOCALE_SSHORTDATE, + LOCALE_STIMEFORMAT, + LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, + LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SDAYNAME7, + LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, + LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6, + LOCALE_SABBREVDAYNAME7, + LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, + LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, + LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9, + LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12, + LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, + LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9, + LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12, + LOCALE_S1159, LOCALE_S2359, + LOCALE_SYEARMONTH + }; + static NLS_FORMAT_NODE *NLS_CachedFormats = NULL; + NLS_FORMAT_NODE *node = NLS_CachedFormats; + + dwFlags &= LOCALE_NOUSEROVERRIDE; + + TRACE("(0x%04lx,0x%08lx)\n", lcid, dwFlags); + + /* See if we have already cached the locales number format */ + while (node && (node->lcid != lcid || node->dwFlags != dwFlags) && node->next) + node = node->next; + + if (!node || node->lcid != lcid || node->dwFlags != dwFlags) + { + NLS_FORMAT_NODE *new_node; + DWORD i; + + TRACE("Creating new cache entry\n"); + + if (!(new_node = HeapAlloc(GetProcessHeap(), 0, sizeof(NLS_FORMAT_NODE)))) + return NULL; + + GET_LOCALE_NUMBER(new_node->dwCodePage, LOCALE_IDEFAULTANSICODEPAGE); + + /* Number Format */ + new_node->lcid = lcid; + new_node->dwFlags = dwFlags; + new_node->next = NULL; + + GET_LOCALE_NUMBER(new_node->fmt.NumDigits, LOCALE_IDIGITS); + GET_LOCALE_NUMBER(new_node->fmt.LeadingZero, LOCALE_ILZERO); + GET_LOCALE_NUMBER(new_node->fmt.NegativeOrder, LOCALE_INEGNUMBER); + + GET_LOCALE_NUMBER(new_node->fmt.Grouping, LOCALE_SGROUPING); + if (new_node->fmt.Grouping > 9 && new_node->fmt.Grouping != 32) + { + WARN("LOCALE_SGROUPING (%d) unhandled, please report!\n", + new_node->fmt.Grouping); + new_node->fmt.Grouping = 0; + } + + GET_LOCALE_STRING(new_node->fmt.lpDecimalSep, LOCALE_SDECIMAL); + GET_LOCALE_STRING(new_node->fmt.lpThousandSep, LOCALE_STHOUSAND); + + /* Currency Format */ + new_node->cyfmt.NumDigits = new_node->fmt.NumDigits; + new_node->cyfmt.LeadingZero = new_node->fmt.LeadingZero; + + GET_LOCALE_NUMBER(new_node->cyfmt.Grouping, LOCALE_SGROUPING); + + if (new_node->cyfmt.Grouping > 9) + { + WARN("LOCALE_SMONGROUPING (%d) unhandled, please report!\n", + new_node->cyfmt.Grouping); + new_node->cyfmt.Grouping = 0; + } + + GET_LOCALE_NUMBER(new_node->cyfmt.NegativeOrder, LOCALE_INEGCURR); + if (new_node->cyfmt.NegativeOrder > 15) + { + WARN("LOCALE_INEGCURR (%d) unhandled, please report!\n", + new_node->cyfmt.NegativeOrder); + new_node->cyfmt.NegativeOrder = 0; + } + GET_LOCALE_NUMBER(new_node->cyfmt.PositiveOrder, LOCALE_ICURRENCY); + if (new_node->cyfmt.PositiveOrder > 3) + { + WARN("LOCALE_IPOSCURR (%d) unhandled,please report!\n", + new_node->cyfmt.PositiveOrder); + new_node->cyfmt.PositiveOrder = 0; + } + GET_LOCALE_STRING(new_node->cyfmt.lpDecimalSep, LOCALE_SMONDECIMALSEP); + GET_LOCALE_STRING(new_node->cyfmt.lpThousandSep, LOCALE_SMONTHOUSANDSEP); + GET_LOCALE_STRING(new_node->cyfmt.lpCurrencySymbol, LOCALE_SCURRENCY); + + /* Date/Time Format info, negative character, etc */ + for (i = 0; i < sizeof(NLS_LocaleIndices)/sizeof(NLS_LocaleIndices[0]); i++) + { + GET_LOCALE_STRING(new_node->lppszStrings[i], NLS_LocaleIndices[i]); + } + new_node->szShortAM[0] = GetAM(new_node)[0]; new_node->szShortAM[1] = '\0'; + new_node->szShortPM[0] = GetPM(new_node)[0]; new_node->szShortPM[1] = '\0'; + + /* Now add the computed format to the cache */ + RtlEnterCriticalSection(&NLS_FormatsCS); + + /* Search again: We may have raced to add the node */ + node = NLS_CachedFormats; + while (node && (node->lcid != lcid || node->dwFlags != dwFlags) && node->next) + node = node->next; + + if (!node) + { + node = NLS_CachedFormats = new_node; /* Empty list */ + new_node = NULL; + } + else if (node->lcid != lcid || node->dwFlags != dwFlags) + { + node->next = new_node; /* Not in the list, add to end */ + node = new_node; + new_node = NULL; + } + + RtlLeaveCriticalSection(&NLS_FormatsCS); + + if (new_node) + { + /* We raced and lost: The node was already added by another thread. + * node points to the currently cached node, so free new_node. + */ + for (i = 0; i < sizeof(NLS_LocaleIndices)/sizeof(NLS_LocaleIndices[0]); i++) + HeapFree(GetProcessHeap(), 0, new_node->lppszStrings[i]); + HeapFree(GetProcessHeap(), 0, new_node->fmt.lpDecimalSep); + HeapFree(GetProcessHeap(), 0, new_node->fmt.lpThousandSep); + HeapFree(GetProcessHeap(), 0, new_node->cyfmt.lpDecimalSep); + HeapFree(GetProcessHeap(), 0, new_node->cyfmt.lpThousandSep); + HeapFree(GetProcessHeap(), 0, new_node->cyfmt.lpCurrencySymbol); + HeapFree(GetProcessHeap(), 0, new_node); + } + } + return node; +} + +/************************************************************************** + * NLS_IsUnicodeOnlyLcid + * + * Determine if a locale is Unicode only, and thus invalid in ASCII calls. + */ +BOOL NLS_IsUnicodeOnlyLcid(LCID lcid) +{ + switch (PRIMARYLANGID(lcid)) + { + case LANG_ARMENIAN: + case LANG_DIVEHI: + case LANG_GEORGIAN: + case LANG_GUJARATI: + case LANG_HINDI: + case LANG_KANNADA: + case LANG_KONKANI: + case LANG_MARATHI: + case LANG_PUNJABI: + case LANG_SANSKRIT: + TRACE("lcid 0x%08lx: langid 0x%4x is Unicode Only\n", lcid, PRIMARYLANGID(lcid)); + return TRUE; + default: + return FALSE; + } +} + +/* + * Formatting of dates, times, numbers and currencies. + */ + +#define IsLiteralMarker(p) (p == '\'') +#define IsDateFmtChar(p) (p == 'd'||p == 'M'||p == 'y'||p == 'g') +#define IsTimeFmtChar(p) (p == 'H'||p == 'h'||p == 'm'||p == 's'||p == 't') + +/* Only the following flags can be given if a date/time format is specified */ +#define DATE_FORMAT_FLAGS (DATE_DATEVARSONLY|LOCALE_NOUSEROVERRIDE) +#define TIME_FORMAT_FLAGS (TIME_TIMEVARSONLY|TIME_FORCE24HOURFORMAT| \ + TIME_NOMINUTESORSECONDS|TIME_NOSECONDS| \ + TIME_NOTIMEMARKER|LOCALE_NOUSEROVERRIDE) + +/****************************************************************************** + * NLS_GetDateTimeFormatW + * + * Performs the formatting for GetDateFormatW/GetTimeFormatW. + * + * FIXME + * DATE_USE_ALT_CALENDAR - Requires GetCalendarInfo to work first. + * DATE_LTRREADING/DATE_RTLREADING - Not yet implemented. + */ +static INT NLS_GetDateTimeFormatW(LCID lcid, DWORD dwFlags, + const SYSTEMTIME* lpTime, LPCWSTR lpFormat, + LPWSTR lpStr, INT cchOut) +{ + const NLS_FORMAT_NODE *node; + SYSTEMTIME st; + INT cchWritten = 0; + INT lastFormatPos = 0; + BOOL bSkipping = FALSE; /* Skipping text around marker? */ + + /* Verify our arguments */ + if ((cchOut && !lpStr) || !(node = NLS_GetFormats(lcid, dwFlags))) + { +NLS_GetDateTimeFormatW_InvalidParameter: + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if (dwFlags & ~(DATE_DATEVARSONLY|TIME_TIMEVARSONLY)) + { + if (lpFormat && + ((dwFlags & DATE_DATEVARSONLY && dwFlags & ~DATE_FORMAT_FLAGS) || + (dwFlags & TIME_TIMEVARSONLY && dwFlags & ~TIME_FORMAT_FLAGS))) + { +NLS_GetDateTimeFormatW_InvalidFlags: + SetLastError(ERROR_INVALID_FLAGS); + return 0; + } + + if (dwFlags & DATE_DATEVARSONLY) + { + if ((dwFlags & (DATE_LTRREADING|DATE_RTLREADING)) == (DATE_LTRREADING|DATE_RTLREADING)) + goto NLS_GetDateTimeFormatW_InvalidFlags; + else if (dwFlags & (DATE_LTRREADING|DATE_RTLREADING)) + FIXME("Unsupported flags: DATE_LTRREADING/DATE_RTLREADING\n"); + + switch (dwFlags & (DATE_SHORTDATE|DATE_LONGDATE|DATE_YEARMONTH)) + { + case 0: + break; + case DATE_SHORTDATE: + case DATE_LONGDATE: + case DATE_YEARMONTH: + if (lpFormat) + goto NLS_GetDateTimeFormatW_InvalidFlags; + break; + default: + goto NLS_GetDateTimeFormatW_InvalidFlags; + } + } + } + + if (!lpFormat) + { + /* Use the appropriate default format */ + if (dwFlags & DATE_DATEVARSONLY) + { + if (dwFlags & DATE_YEARMONTH) + lpFormat = GetYearMonth(node); + else if (dwFlags & DATE_LONGDATE) + lpFormat = GetLongDate(node); + else + lpFormat = GetShortDate(node); + } + else + lpFormat = GetTime(node); + } + + if (!lpTime) + { + GetSystemTime(&st); /* Default to current time */ + lpTime = &st; + } + else + { + if (dwFlags & DATE_DATEVARSONLY) + { + FILETIME ftTmp; + + /* Verify the date and correct the D.O.W. if needed */ + memset(&st, 0, sizeof(st)); + st.wYear = lpTime->wYear; + st.wMonth = lpTime->wMonth; + st.wDay = lpTime->wDay; + + if (st.wDay > 31 || st.wMonth > 12 || !SystemTimeToFileTime(&st, &ftTmp)) + goto NLS_GetDateTimeFormatW_InvalidParameter; + + FileTimeToSystemTime(&ftTmp, &st); + lpTime = &st; + } + + if (dwFlags & TIME_TIMEVARSONLY) + { + /* Verify the time */ + if (lpTime->wHour > 24 || lpTime->wMinute > 59 || lpTime->wSecond > 59) + goto NLS_GetDateTimeFormatW_InvalidParameter; + } + } + + /* Format the output */ + while (*lpFormat) + { + if (IsLiteralMarker(*lpFormat)) + { + /* Start of a literal string */ + lpFormat++; + + /* Loop until the end of the literal marker or end of the string */ + while (*lpFormat) + { + if (IsLiteralMarker(*lpFormat)) + { + lpFormat++; + if (!IsLiteralMarker(*lpFormat)) + break; /* Terminating literal marker */ + } + + if (!cchOut) + cchWritten++; /* Count size only */ + else if (cchWritten >= cchOut) + goto NLS_GetDateTimeFormatW_Overrun; + else if (!bSkipping) + { + lpStr[cchWritten] = *lpFormat; + cchWritten++; + } + lpFormat++; + } + } + else if ((dwFlags & DATE_DATEVARSONLY && IsDateFmtChar(*lpFormat)) || + (dwFlags & TIME_TIMEVARSONLY && IsTimeFmtChar(*lpFormat))) + { + char buffA[32]; + WCHAR buff[32], fmtChar; + LPCWSTR szAdd = NULL; + DWORD dwVal = 0; + int count = 0, dwLen; + + bSkipping = FALSE; + + fmtChar = *lpFormat; + while (*lpFormat == fmtChar) + { + count++; + lpFormat++; + } + buff[0] = '\0'; + + switch(fmtChar) + { + case 'd': + if (count >= 4) + szAdd = GetLongDay(node, (lpTime->wDayOfWeek + 6) % 7); + else if (count == 3) + szAdd = GetShortDay(node, (lpTime->wDayOfWeek + 6) % 7); + else + { + dwVal = lpTime->wDay; + szAdd = buff; + } + break; + + case 'M': + if (count >= 4) + szAdd = GetLongMonth(node, lpTime->wMonth - 1); + else if (count == 3) + szAdd = GetShortMonth(node, lpTime->wMonth - 1); + else + { + dwVal = lpTime->wMonth; + szAdd = buff; + } + break; + + case 'y': + if (count >= 4) + { + count = 4; + dwVal = lpTime->wYear; + } + else + { + count = count > 2 ? 2 : count; + dwVal = lpTime->wYear % 100; + } + szAdd = buff; + break; + + case 'g': + if (count == 2) + { + /* FIXME: Our GetCalendarInfo() does not yet support CAL_SERASTRING. + * When it is fixed, this string should be cached in 'node'. + */ + FIXME("Should be using GetCalendarInfo(CAL_SERASTRING), defaulting to 'AD'\n"); + buff[0] = 'A'; buff[1] = 'D'; buff[2] = '\0'; + } + else + { + buff[0] = 'g'; buff[1] = '\0'; /* Add a literal 'g' */ + } + szAdd = buff; + break; + + case 'h': + if (!(dwFlags & TIME_FORCE24HOURFORMAT)) + { + count = count > 2 ? 2 : count; + dwVal = lpTime->wHour == 0 ? 12 : (lpTime->wHour - 1) % 12 + 1; + szAdd = buff; + break; + } + /* .. fall through if we are forced to output in 24 hour format */ + + case 'H': + count = count > 2 ? 2 : count; + dwVal = lpTime->wHour; + szAdd = buff; + break; + + case 'm': + if (dwFlags & TIME_NOMINUTESORSECONDS) + { + cchWritten = lastFormatPos; /* Skip */ + bSkipping = TRUE; + } + else + { + count = count > 2 ? 2 : count; + dwVal = lpTime->wMinute; + szAdd = buff; + } + break; + + case 's': + if (dwFlags & (TIME_NOSECONDS|TIME_NOMINUTESORSECONDS)) + { + cchWritten = lastFormatPos; /* Skip */ + bSkipping = TRUE; + } + else + { + count = count > 2 ? 2 : count; + dwVal = lpTime->wSecond; + szAdd = buff; + } + break; + + case 't': + if (dwFlags & TIME_NOTIMEMARKER) + { + cchWritten = lastFormatPos; /* Skip */ + bSkipping = TRUE; + } + else + { + if (count == 1) + szAdd = lpTime->wHour < 12 ? node->szShortAM : node->szShortPM; + else + szAdd = lpTime->wHour < 12 ? GetAM(node) : GetPM(node); + } + break; + } + + if (szAdd == buff && buff[0] == '\0') + { + /* We have a numeric value to add */ + sprintf(buffA, "%.*ld", count, dwVal); + MultiByteToWideChar(CP_ACP, 0, buffA, -1, buff, sizeof(buff)/sizeof(WCHAR)); + } + + dwLen = szAdd ? strlenW(szAdd) : 0; + + if (cchOut && dwLen) + { + if (cchWritten + dwLen < cchOut) + memcpy(lpStr + cchWritten, szAdd, dwLen * sizeof(WCHAR)); + else + { + memcpy(lpStr + cchWritten, szAdd, (cchOut - cchWritten) * sizeof(WCHAR)); + goto NLS_GetDateTimeFormatW_Overrun; + } + } + cchWritten += dwLen; + lastFormatPos = cchWritten; /* Save position of last output format text */ + } + else + { + /* Literal character */ + if (!cchOut) + cchWritten++; /* Count size only */ + else if (cchWritten >= cchOut) + goto NLS_GetDateTimeFormatW_Overrun; + else if (!bSkipping || *lpFormat == ' ') + { + lpStr[cchWritten] = *lpFormat; + cchWritten++; + } + lpFormat++; + } + } + + /* Final string terminator and sanity check */ + if (cchOut) + { + if (cchWritten >= cchOut) + goto NLS_GetDateTimeFormatW_Overrun; + else + lpStr[cchWritten] = '\0'; + } + cchWritten++; /* Include terminating NUL */ + + TRACE("returning length=%d, ouput='%s'\n", cchWritten, debugstr_w(lpStr)); + return cchWritten; + +NLS_GetDateTimeFormatW_Overrun: + TRACE("returning 0, (ERROR_INSUFFICIENT_BUFFER)\n"); + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; +} + +/****************************************************************************** + * NLS_GetDateTimeFormatA + * + * ASCII wrapper for GetDateFormatA/GetTimeFormatA. + */ +static INT NLS_GetDateTimeFormatA(LCID lcid, DWORD dwFlags, + const SYSTEMTIME* lpTime, + LPCSTR lpFormat, LPSTR lpStr, INT cchOut) +{ + DWORD cp = CP_ACP; + WCHAR szFormat[128], szOut[128]; + INT iRet; + + TRACE("(0x%04lx,0x%08lx,%p,%s,%p,%d)\n", lcid, dwFlags, lpTime, + debugstr_a(lpFormat), lpStr, cchOut); + + if (NLS_IsUnicodeOnlyLcid(lcid)) + { +GetDateTimeFormatA_InvalidParameter: + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if (!(dwFlags & LOCALE_USE_CP_ACP)) + { + const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags); + if (!node) + goto GetDateTimeFormatA_InvalidParameter; + cp = node->dwCodePage; + } + + if (lpFormat) + MultiByteToWideChar(cp, 0, lpFormat, -1, szFormat, sizeof(szFormat)/sizeof(WCHAR)); + + if (cchOut > (int)(sizeof(szOut)/sizeof(WCHAR))) + cchOut = sizeof(szOut)/sizeof(WCHAR); + + szOut[0] = '\0'; + + iRet = NLS_GetDateTimeFormatW(lcid, dwFlags, lpTime, lpFormat ? szFormat : NULL, + lpStr ? szOut : NULL, cchOut); + + if (lpStr) + { + if (szOut[0]) + WideCharToMultiByte(cp, 0, szOut, -1, lpStr, cchOut, 0, 0); + else if (cchOut && iRet) + *lpStr = '\0'; + } + return iRet; +} + +/****************************************************************************** + * GetDateFormatA [KERNEL32.@] + * + * Format a date for a given locale. + * + * PARAMS + * lcid [I] Locale to format for + * dwFlags [I] LOCALE_ and DATE_ flags from "winnls.h" + * lpTime [I] Date to format + * lpFormat [I] Format string, or NULL to use the system defaults + * lpDateStr [O] Destination for formatted string + * cchOut [I] Size of lpDateStr, or 0 to calculate the resulting size + * + * NOTES + * - If lpFormat is NULL, lpDateStr will be formatted according to the format + * details returned by GetLocaleInfoA() and modified by dwFlags. + * - lpFormat is a string of characters and formatting tokens. Any characters + * in the string are copied verbatim to lpDateStr, with tokens being replaced + * by the date values they represent. + * - The following tokens have special meanings in a date format string: + *| Token Meaning + *| ----- ------- + *| d Single digit day of the month (no leading 0) + *| dd Double digit day of the month + *| ddd Short name for the day of the week + *| dddd Long name for the day of the week + *| M Single digit month of the year (no leading 0) + *| MM Double digit month of the year + *| MMM Short name for the month of the year + *| MMMM Long name for the month of the year + *| y Double digit year number (no leading 0) + *| yy Double digit year number + *| yyyy Four digit year number + *| gg Era string, for example 'AD'. + * - To output any literal character that could be misidentified as a token, + * enclose it in single quotes. + * - The Ascii version of this function fails if lcid is Unicode only. + * + * RETURNS + * Success: The number of character written to lpDateStr, or that would + * have been written, if cchOut is 0. + * Failure: 0. Use GetLastError() to determine the cause. + */ +INT WINAPI GetDateFormatA( LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime, + LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut) +{ + TRACE("(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",lcid, dwFlags, lpTime, + debugstr_a(lpFormat), lpDateStr, cchOut); + + return NLS_GetDateTimeFormatA(lcid, dwFlags | DATE_DATEVARSONLY, lpTime, + lpFormat, lpDateStr, cchOut); +} + + +/****************************************************************************** + * GetDateFormatW [KERNEL32.@] + * + * See GetDateFormatA. + */ +INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime, + LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut) +{ + TRACE("(0x%04lx,0x%08lx,%p,%s,%p,%d)\n", lcid, dwFlags, lpTime, + debugstr_w(lpFormat), lpDateStr, cchOut); + + return NLS_GetDateTimeFormatW(lcid, dwFlags|DATE_DATEVARSONLY, lpTime, + lpFormat, lpDateStr, cchOut); +} + +/****************************************************************************** + * GetTimeFormatA [KERNEL32.@] + * + * Format a time for a given locale. + * + * PARAMS + * lcid [I] Locale to format for + * dwFlags [I] LOCALE_ and TIME_ flags from "winnls.h" + * lpTime [I] Time to format + * lpFormat [I] Formatting overrides + * lpTimeStr [O] Destination for formatted string + * cchOut [I] Size of lpTimeStr, or 0 to calculate the resulting size + * + * NOTES + * - If lpFormat is NULL, lpszValue will be formatted according to the format + * details returned by GetLocaleInfoA() and modified by dwFlags. + * - lpFormat is a string of characters and formatting tokens. Any characters + * in the string are copied verbatim to lpTimeStr, with tokens being replaced + * by the time values they represent. + * - The following tokens have special meanings in a time format string: + *| Token Meaning + *| ----- ------- + *| h Hours with no leading zero (12-hour clock) + *| hh Hours with full two digits (12-hour clock) + *| H Hours with no leading zero (24-hour clock) + *| HH Hours with full two digits (24-hour clock) + *| m Minutes with no leading zero + *| mm Minutes with full two digits + *| s Seconds with no leading zero + *| ss Seconds with full two digits + *| t Short time marker (e.g. "A" or "P") + *| tt Long time marker (e.g. "AM", "PM") + * - To output any literal character that could be misidentified as a token, + * enclose it in single quotes. + * - The Ascii version of this function fails if lcid is Unicode only. + * + * RETURNS + * Success: The number of character written to lpTimeStr, or that would + * have been written, if cchOut is 0. + * Failure: 0. Use GetLastError() to determine the cause. + */ +INT WINAPI GetTimeFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime, + LPCSTR lpFormat, LPSTR lpTimeStr, INT cchOut) +{ + TRACE("(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",lcid, dwFlags, lpTime, + debugstr_a(lpFormat), lpTimeStr, cchOut); + + return NLS_GetDateTimeFormatA(lcid, dwFlags|TIME_TIMEVARSONLY, lpTime, + lpFormat, lpTimeStr, cchOut); +} + +/****************************************************************************** + * GetTimeFormatW [KERNEL32.@] + * + * See GetTimeFormatA. + */ +INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME* lpTime, + LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut) +{ + TRACE("(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",lcid, dwFlags, lpTime, + debugstr_w(lpFormat), lpTimeStr, cchOut); + + return NLS_GetDateTimeFormatW(lcid, dwFlags|TIME_TIMEVARSONLY, lpTime, + lpFormat, lpTimeStr, cchOut); +} + +/************************************************************************** + * GetNumberFormatA (KERNEL32.@) + * + * Format a number string for a given locale. + * + * PARAMS + * lcid [I] Locale to format for + * dwFlags [I] LOCALE_ flags from "winnls.h" + * lpszValue [I] String to format + * lpFormat [I] Formatting overrides + * lpNumberStr [O] Destination for formatted string + * cchOut [I] Size of lpNumberStr, or 0 to calculate the resulting size + * + * NOTES + * - lpszValue can contain only '0' - '9', '-' and '.'. + * - If lpFormat is non-NULL, dwFlags must be 0. In this case lpszValue will + * be formatted according to the format details returned by GetLocaleInfoA(). + * - This function rounds the number string if the number of decimals exceeds the + * locales normal number of decimal places. + * - If cchOut is 0, this function does not write to lpNumberStr. + * - The Ascii version of this function fails if lcid is Unicode only. + * + * RETURNS + * Success: The number of character written to lpNumberStr, or that would + * have been written, if cchOut is 0. + * Failure: 0. Use GetLastError() to determine the cause. + */ +INT WINAPI GetNumberFormatA(LCID lcid, DWORD dwFlags, + LPCSTR lpszValue, const NUMBERFMTA *lpFormat, + LPSTR lpNumberStr, int cchOut) +{ + DWORD cp = CP_ACP; + WCHAR szDec[8], szGrp[8], szIn[128], szOut[128]; + NUMBERFMTW fmt; + const NUMBERFMTW *pfmt = NULL; + INT iRet; + + TRACE("(0x%04lx,0x%08lx,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_a(lpszValue), + lpFormat, lpNumberStr, cchOut); + + if (NLS_IsUnicodeOnlyLcid(lcid)) + { +GetNumberFormatA_InvalidParameter: + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if (!(dwFlags & LOCALE_USE_CP_ACP)) + { + const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags); + if (!node) + goto GetNumberFormatA_InvalidParameter; + cp = node->dwCodePage; + } + + if (lpFormat) + { + memcpy(&fmt, lpFormat, sizeof(fmt)); + pfmt = &fmt; + if (lpFormat->lpDecimalSep) + { + MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, sizeof(szDec)/sizeof(WCHAR)); + fmt.lpDecimalSep = szDec; + } + if (lpFormat->lpThousandSep) + { + MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, sizeof(szGrp)/sizeof(WCHAR)); + fmt.lpThousandSep = szGrp; + } + } + + if (lpszValue) + MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, sizeof(szIn)/sizeof(WCHAR)); + + if (cchOut > (int)(sizeof(szOut)/sizeof(WCHAR))) + cchOut = sizeof(szOut)/sizeof(WCHAR); + + szOut[0] = '\0'; + + iRet = GetNumberFormatW(lcid, dwFlags, lpszValue ? szIn : NULL, pfmt, + lpNumberStr ? szOut : NULL, cchOut); + + if (szOut[0] && lpNumberStr) + WideCharToMultiByte(cp, 0, szOut, -1, lpNumberStr, cchOut, 0, 0); + return iRet; +} + +/* Number parsing state flags */ +#define NF_ISNEGATIVE 0x1 /* '-' found */ +#define NF_ISREAL 0x2 /* '.' found */ +#define NF_DIGITS 0x4 /* '0'-'9' found */ +#define NF_DIGITS_OUT 0x8 /* Digits before the '.' found */ +#define NF_ROUND 0x10 /* Number needs to be rounded */ + +/* Formatting options for Numbers */ +#define NLS_NEG_PARENS 0 /* "(1.1)" */ +#define NLS_NEG_LEFT 1 /* "-1.1" */ +#define NLS_NEG_LEFT_SPACE 2 /* "- 1.1" */ +#define NLS_NEG_RIGHT 3 /* "1.1-" */ +#define NLS_NEG_RIGHT_SPACE 4 /* "1.1 -" */ + +/************************************************************************** + * GetNumberFormatW (KERNEL32.@) + * + * See GetNumberFormatA. + */ +INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags, + LPCWSTR lpszValue, const NUMBERFMTW *lpFormat, + LPWSTR lpNumberStr, int cchOut) +{ + WCHAR szBuff[128], *szOut = szBuff + sizeof(szBuff) / sizeof(WCHAR) - 1; + WCHAR szNegBuff[8]; + const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc; + DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0; + INT iRet; + + TRACE("(0x%04lx,0x%08lx,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue), + lpFormat, lpNumberStr, cchOut); + + if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpNumberStr) || + !IsValidLocale(lcid, 0) || + (lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep))) + { +GetNumberFormatW_Error: + SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER); + return 0; + } + + if (!lpFormat) + { + const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags); + + if (!node) + goto GetNumberFormatW_Error; + lpFormat = &node->fmt; + lpszNegStart = lpszNeg = GetNegative(node); + } + else + { + GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE), + szNegBuff, sizeof(szNegBuff)/sizeof(WCHAR)); + lpszNegStart = lpszNeg = szNegBuff; + } + lpszNeg = lpszNeg + strlenW(lpszNeg) - 1; + + dwFlags &= (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP); + + /* Format the number backwards into a temporary buffer */ + + szSrc = lpszValue; + *szOut-- = '\0'; + + /* Check the number for validity */ + while (*szSrc) + { + if (*szSrc >= '0' && *szSrc <= '9') + { + dwState |= NF_DIGITS; + if (dwState & NF_ISREAL) + dwDecimals++; + } + else if (*szSrc == '-') + { + if (dwState) + goto GetNumberFormatW_Error; /* '-' not first character */ + dwState |= NF_ISNEGATIVE; + } + else if (*szSrc == '.') + { + if (dwState & NF_ISREAL) + goto GetNumberFormatW_Error; /* More than one '.' */ + dwState |= NF_ISREAL; + } + else + goto GetNumberFormatW_Error; /* Invalid char */ + szSrc++; + } + szSrc--; /* Point to last character */ + + if (!(dwState & NF_DIGITS)) + goto GetNumberFormatW_Error; /* No digits */ + + /* Add any trailing negative sign */ + if (dwState & NF_ISNEGATIVE) + { + switch (lpFormat->NegativeOrder) + { + case NLS_NEG_PARENS: + *szOut-- = ')'; + break; + case NLS_NEG_RIGHT: + case NLS_NEG_RIGHT_SPACE: + while (lpszNeg >= lpszNegStart) + *szOut-- = *lpszNeg--; + if (lpFormat->NegativeOrder == NLS_NEG_RIGHT_SPACE) + *szOut-- = ' '; + break; + } + } + + /* Copy all digits up to the decimal point */ + if (!lpFormat->NumDigits) + { + if (dwState & NF_ISREAL) + { + while (*szSrc != '.') /* Don't write any decimals or a separator */ + { + if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND))) + dwState |= NF_ROUND; + else + dwState &= ~NF_ROUND; + szSrc--; + } + szSrc--; + } + } + else + { + LPWSTR lpszDec = lpFormat->lpDecimalSep + strlenW(lpFormat->lpDecimalSep) - 1; + + if (dwDecimals <= lpFormat->NumDigits) + { + dwDecimals = lpFormat->NumDigits - dwDecimals; + while (dwDecimals--) + *szOut-- = '0'; /* Pad to correct number of dp */ + } + else + { + dwDecimals -= lpFormat->NumDigits; + /* Skip excess decimals, and determine if we have to round the number */ + while (dwDecimals--) + { + if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND))) + dwState |= NF_ROUND; + else + dwState &= ~NF_ROUND; + szSrc--; + } + } + + if (dwState & NF_ISREAL) + { + while (*szSrc != '.') + { + if (dwState & NF_ROUND) + { + if (*szSrc == '9') + *szOut-- = '0'; /* continue rounding */ + else + { + dwState &= ~NF_ROUND; + *szOut-- = (*szSrc)+1; + } + szSrc--; + } + else + *szOut-- = *szSrc--; /* Write existing decimals */ + } + szSrc--; /* Skip '.' */ + } + + while (lpszDec >= lpFormat->lpDecimalSep) + *szOut-- = *lpszDec--; /* Write decimal separator */ + } + + dwGroupCount = lpFormat->Grouping == 32 ? 3 : lpFormat->Grouping; + + /* Write the remaining whole number digits, including grouping chars */ + while (szSrc >= lpszValue && *szSrc >= '0' && *szSrc <= '9') + { + if (dwState & NF_ROUND) + { + if (*szSrc == '9') + *szOut-- = '0'; /* continue rounding */ + else + { + dwState &= ~NF_ROUND; + *szOut-- = (*szSrc)+1; + } + szSrc--; + } + else + *szOut-- = *szSrc--; + + dwState |= NF_DIGITS_OUT; + dwCurrentGroupCount++; + if (szSrc >= lpszValue && dwCurrentGroupCount == dwGroupCount && *szSrc != '-') + { + LPWSTR lpszGrp = lpFormat->lpThousandSep + strlenW(lpFormat->lpThousandSep) - 1; + + while (lpszGrp >= lpFormat->lpThousandSep) + *szOut-- = *lpszGrp--; /* Write grouping char */ + + dwCurrentGroupCount = 0; + if (lpFormat->Grouping == 32) + dwGroupCount = 2; /* Indic grouping: 3 then 2 */ + } + } + if (dwState & NF_ROUND) + { + *szOut-- = '1'; /* e.g. .6 > 1.0 */ + } + else if (!(dwState & NF_DIGITS_OUT) && lpFormat->LeadingZero) + *szOut-- = '0'; /* Add leading 0 if we have no digits before the decimal point */ + + /* Add any leading negative sign */ + if (dwState & NF_ISNEGATIVE) + { + switch (lpFormat->NegativeOrder) + { + case NLS_NEG_PARENS: + *szOut-- = '('; + break; + case NLS_NEG_LEFT_SPACE: + *szOut-- = ' '; + /* Fall through */ + case NLS_NEG_LEFT: + while (lpszNeg >= lpszNegStart) + *szOut-- = *lpszNeg--; + break; + } + } + szOut++; + + iRet = strlenW(szOut) + 1; + if (cchOut) + { + if (iRet <= cchOut) + memcpy(lpNumberStr, szOut, iRet * sizeof(WCHAR)); + else + { + memcpy(lpNumberStr, szOut, cchOut * sizeof(WCHAR)); + lpNumberStr[cchOut - 1] = '\0'; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + iRet = 0; + } + } + return iRet; +} + +/************************************************************************** + * GetCurrencyFormatA (KERNEL32.@) + * + * Format a currency string for a given locale. + * + * PARAMS + * lcid [I] Locale to format for + * dwFlags [I] LOCALE_ flags from "winnls.h" + * lpszValue [I] String to format + * lpFormat [I] Formatting overrides + * lpCurrencyStr [O] Destination for formatted string + * cchOut [I] Size of lpCurrencyStr, or 0 to calculate the resulting size + * + * NOTES + * - lpszValue can contain only '0' - '9', '-' and '.'. + * - If lpFormat is non-NULL, dwFlags must be 0. In this case lpszValue will + * be formatted according to the format details returned by GetLocaleInfoA(). + * - This function rounds the currency if the number of decimals exceeds the + * locales number of currency decimal places. + * - If cchOut is 0, this function does not write to lpCurrencyStr. + * - The Ascii version of this function fails if lcid is Unicode only. + * + * RETURNS + * Success: The number of character written to lpNumberStr, or that would + * have been written, if cchOut is 0. + * Failure: 0. Use GetLastError() to determine the cause. + */ +INT WINAPI GetCurrencyFormatA(LCID lcid, DWORD dwFlags, + LPCSTR lpszValue, const CURRENCYFMTA *lpFormat, + LPSTR lpCurrencyStr, int cchOut) +{ + DWORD cp = CP_ACP; + WCHAR szDec[8], szGrp[8], szCy[8], szIn[128], szOut[128]; + CURRENCYFMTW fmt; + const CURRENCYFMTW *pfmt = NULL; + INT iRet; + + TRACE("(0x%04lx,0x%08lx,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_a(lpszValue), + lpFormat, lpCurrencyStr, cchOut); + + if (NLS_IsUnicodeOnlyLcid(lcid)) + { +GetCurrencyFormatA_InvalidParameter: + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + if (!(dwFlags & LOCALE_USE_CP_ACP)) + { + const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags); + if (!node) + goto GetCurrencyFormatA_InvalidParameter; + cp = node->dwCodePage; + } + + if (lpFormat) + { + memcpy(&fmt, lpFormat, sizeof(fmt)); + pfmt = &fmt; + if (lpFormat->lpDecimalSep) + { + MultiByteToWideChar(cp, 0, lpFormat->lpDecimalSep, -1, szDec, sizeof(szDec)/sizeof(WCHAR)); + fmt.lpDecimalSep = szDec; + } + if (lpFormat->lpThousandSep) + { + MultiByteToWideChar(cp, 0, lpFormat->lpThousandSep, -1, szGrp, sizeof(szGrp)/sizeof(WCHAR)); + fmt.lpThousandSep = szGrp; + } + if (lpFormat->lpCurrencySymbol) + { + MultiByteToWideChar(cp, 0, lpFormat->lpCurrencySymbol, -1, szCy, sizeof(szCy)/sizeof(WCHAR)); + fmt.lpCurrencySymbol = szCy; + } + } + + if (lpszValue) + MultiByteToWideChar(cp, 0, lpszValue, -1, szIn, sizeof(szIn)/sizeof(WCHAR)); + + if (cchOut > (int)(sizeof(szOut)/sizeof(WCHAR))) + cchOut = sizeof(szOut)/sizeof(WCHAR); + + szOut[0] = '\0'; + + iRet = GetCurrencyFormatW(lcid, dwFlags, lpszValue ? szIn : NULL, pfmt, + lpCurrencyStr ? szOut : NULL, cchOut); + + if (szOut[0] && lpCurrencyStr) + WideCharToMultiByte(cp, 0, szOut, -1, lpCurrencyStr, cchOut, 0, 0); + return iRet; +} + +/* Formatting states for Currencies. We use flags to avoid code duplication. */ +#define CF_PARENS 0x1 /* Parentheses */ +#define CF_MINUS_LEFT 0x2 /* '-' to the left */ +#define CF_MINUS_RIGHT 0x4 /* '-' to the right */ +#define CF_MINUS_BEFORE 0x8 /* '-' before '$' */ +#define CF_CY_LEFT 0x10 /* '$' to the left */ +#define CF_CY_RIGHT 0x20 /* '$' to the right */ +#define CF_CY_SPACE 0x40 /* ' ' by '$' */ + +/************************************************************************** + * GetCurrencyFormatW (KERNEL32.@) + * + * See GetCurrencyFormatA. + */ +INT WINAPI GetCurrencyFormatW(LCID lcid, DWORD dwFlags, + LPCWSTR lpszValue, const CURRENCYFMTW *lpFormat, + LPWSTR lpCurrencyStr, int cchOut) +{ + static const BYTE NLS_NegCyFormats[16] = + { + CF_PARENS|CF_CY_LEFT, /* ($1.1) */ + CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT, /* -$1.1 */ + CF_MINUS_LEFT|CF_CY_LEFT, /* $-1.1 */ + CF_MINUS_RIGHT|CF_CY_LEFT, /* $1.1- */ + CF_PARENS|CF_CY_RIGHT, /* (1.1$) */ + CF_MINUS_LEFT|CF_CY_RIGHT, /* -1.1$ */ + CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT, /* 1.1-$ */ + CF_MINUS_RIGHT|CF_CY_RIGHT, /* 1.1$- */ + CF_MINUS_LEFT|CF_CY_RIGHT|CF_CY_SPACE, /* -1.1 $ */ + CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT|CF_CY_SPACE, /* -$ 1.1 */ + CF_MINUS_RIGHT|CF_CY_RIGHT|CF_CY_SPACE, /* 1.1 $- */ + CF_MINUS_RIGHT|CF_CY_LEFT|CF_CY_SPACE, /* $ 1.1- */ + CF_MINUS_LEFT|CF_CY_LEFT|CF_CY_SPACE, /* $ -1.1 */ + CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT|CF_CY_SPACE, /* 1.1- $ */ + CF_PARENS|CF_CY_LEFT|CF_CY_SPACE, /* ($ 1.1) */ + CF_PARENS|CF_CY_RIGHT|CF_CY_SPACE, /* (1.1 $) */ + }; + static const BYTE NLS_PosCyFormats[4] = + { + CF_CY_LEFT, /* $1.1 */ + CF_CY_RIGHT, /* 1.1$ */ + CF_CY_LEFT|CF_CY_SPACE, /* $ 1.1 */ + CF_CY_RIGHT|CF_CY_SPACE, /* 1.1 $ */ + }; + WCHAR szBuff[128], *szOut = szBuff + sizeof(szBuff) / sizeof(WCHAR) - 1; + WCHAR szNegBuff[8]; + const WCHAR *lpszNeg = NULL, *lpszNegStart, *szSrc, *lpszCy, *lpszCyStart; + DWORD dwState = 0, dwDecimals = 0, dwGroupCount = 0, dwCurrentGroupCount = 0, dwFmt; + INT iRet; + + TRACE("(0x%04lx,0x%08lx,%s,%p,%p,%d)\n", lcid, dwFlags, debugstr_w(lpszValue), + lpFormat, lpCurrencyStr, cchOut); + + if (!lpszValue || cchOut < 0 || (cchOut > 0 && !lpCurrencyStr) || + !IsValidLocale(lcid, 0) || + (lpFormat && (dwFlags || !lpFormat->lpDecimalSep || !lpFormat->lpThousandSep || + !lpFormat->lpCurrencySymbol || lpFormat->NegativeOrder > 15 || + lpFormat->PositiveOrder > 3))) + { +GetCurrencyFormatW_Error: + SetLastError(lpFormat && dwFlags ? ERROR_INVALID_FLAGS : ERROR_INVALID_PARAMETER); + return 0; + } + + if (!lpFormat) + { + const NLS_FORMAT_NODE *node = NLS_GetFormats(lcid, dwFlags); + + if (!node) + goto GetCurrencyFormatW_Error; + lpFormat = &node->cyfmt; + lpszNegStart = lpszNeg = GetNegative(node); + } + else + { + GetLocaleInfoW(lcid, LOCALE_SNEGATIVESIGN|(dwFlags & LOCALE_NOUSEROVERRIDE), + szNegBuff, sizeof(szNegBuff)/sizeof(WCHAR)); + lpszNegStart = lpszNeg = szNegBuff; + } + dwFlags &= (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP); + + lpszNeg = lpszNeg + strlenW(lpszNeg) - 1; + lpszCyStart = lpFormat->lpCurrencySymbol; + lpszCy = lpszCyStart + strlenW(lpszCyStart) - 1; + + /* Format the currency backwards into a temporary buffer */ + + szSrc = lpszValue; + *szOut-- = '\0'; + + /* Check the number for validity */ + while (*szSrc) + { + if (*szSrc >= '0' && *szSrc <= '9') + { + dwState |= NF_DIGITS; + if (dwState & NF_ISREAL) + dwDecimals++; + } + else if (*szSrc == '-') + { + if (dwState) + goto GetCurrencyFormatW_Error; /* '-' not first character */ + dwState |= NF_ISNEGATIVE; + } + else if (*szSrc == '.') + { + if (dwState & NF_ISREAL) + goto GetCurrencyFormatW_Error; /* More than one '.' */ + dwState |= NF_ISREAL; + } + else + goto GetCurrencyFormatW_Error; /* Invalid char */ + szSrc++; + } + szSrc--; /* Point to last character */ + + if (!(dwState & NF_DIGITS)) + goto GetCurrencyFormatW_Error; /* No digits */ + + if (dwState & NF_ISNEGATIVE) + dwFmt = NLS_NegCyFormats[lpFormat->NegativeOrder]; + else + dwFmt = NLS_PosCyFormats[lpFormat->PositiveOrder]; + + /* Add any trailing negative or currency signs */ + if (dwFmt & CF_PARENS) + *szOut-- = ')'; + + while (dwFmt & (CF_MINUS_RIGHT|CF_CY_RIGHT)) + { + switch (dwFmt & (CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT)) + { + case CF_MINUS_RIGHT: + case CF_MINUS_RIGHT|CF_CY_RIGHT: + while (lpszNeg >= lpszNegStart) + *szOut-- = *lpszNeg--; + dwFmt &= ~CF_MINUS_RIGHT; + break; + + case CF_CY_RIGHT: + case CF_MINUS_BEFORE|CF_CY_RIGHT: + case CF_MINUS_RIGHT|CF_MINUS_BEFORE|CF_CY_RIGHT: + while (lpszCy >= lpszCyStart) + *szOut-- = *lpszCy--; + if (dwFmt & CF_CY_SPACE) + *szOut-- = ' '; + dwFmt &= ~(CF_CY_RIGHT|CF_MINUS_BEFORE); + break; + } + } + + /* Copy all digits up to the decimal point */ + if (!lpFormat->NumDigits) + { + if (dwState & NF_ISREAL) + { + while (*szSrc != '.') /* Don't write any decimals or a separator */ + { + if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND))) + dwState |= NF_ROUND; + else + dwState &= ~NF_ROUND; + szSrc--; + } + szSrc--; + } + } + else + { + LPWSTR lpszDec = lpFormat->lpDecimalSep + strlenW(lpFormat->lpDecimalSep) - 1; + + if (dwDecimals <= lpFormat->NumDigits) + { + dwDecimals = lpFormat->NumDigits - dwDecimals; + while (dwDecimals--) + *szOut-- = '0'; /* Pad to correct number of dp */ + } + else + { + dwDecimals -= lpFormat->NumDigits; + /* Skip excess decimals, and determine if we have to round the number */ + while (dwDecimals--) + { + if (*szSrc >= '5' || (*szSrc == '4' && (dwState & NF_ROUND))) + dwState |= NF_ROUND; + else + dwState &= ~NF_ROUND; + szSrc--; + } + } + + if (dwState & NF_ISREAL) + { + while (*szSrc != '.') + { + if (dwState & NF_ROUND) + { + if (*szSrc == '9') + *szOut-- = '0'; /* continue rounding */ + else + { + dwState &= ~NF_ROUND; + *szOut-- = (*szSrc)+1; + } + szSrc--; + } + else + *szOut-- = *szSrc--; /* Write existing decimals */ + } + szSrc--; /* Skip '.' */ + } + while (lpszDec >= lpFormat->lpDecimalSep) + *szOut-- = *lpszDec--; /* Write decimal separator */ + } + + dwGroupCount = lpFormat->Grouping; + + /* Write the remaining whole number digits, including grouping chars */ + while (szSrc >= lpszValue && *szSrc >= '0' && *szSrc <= '9') + { + if (dwState & NF_ROUND) + { + if (*szSrc == '9') + *szOut-- = '0'; /* continue rounding */ + else + { + dwState &= ~NF_ROUND; + *szOut-- = (*szSrc)+1; + } + szSrc--; + } + else + *szOut-- = *szSrc--; + + dwState |= NF_DIGITS_OUT; + dwCurrentGroupCount++; + if (szSrc >= lpszValue && dwCurrentGroupCount == dwGroupCount) + { + LPWSTR lpszGrp = lpFormat->lpThousandSep + strlenW(lpFormat->lpThousandSep) - 1; + + while (lpszGrp >= lpFormat->lpThousandSep) + *szOut-- = *lpszGrp--; /* Write grouping char */ + + dwCurrentGroupCount = 0; + } + } + if (dwState & NF_ROUND) + *szOut-- = '1'; /* e.g. .6 > 1.0 */ + else if (!(dwState & NF_DIGITS_OUT) && lpFormat->LeadingZero) + *szOut-- = '0'; /* Add leading 0 if we have no digits before the decimal point */ + + /* Add any leading negative or currency sign */ + while (dwFmt & (CF_MINUS_LEFT|CF_CY_LEFT)) + { + switch (dwFmt & (CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT)) + { + case CF_MINUS_LEFT: + case CF_MINUS_LEFT|CF_CY_LEFT: + while (lpszNeg >= lpszNegStart) + *szOut-- = *lpszNeg--; + dwFmt &= ~CF_MINUS_LEFT; + break; + + case CF_CY_LEFT: + case CF_CY_LEFT|CF_MINUS_BEFORE: + case CF_MINUS_LEFT|CF_MINUS_BEFORE|CF_CY_LEFT: + if (dwFmt & CF_CY_SPACE) + *szOut-- = ' '; + while (lpszCy >= lpszCyStart) + *szOut-- = *lpszCy--; + dwFmt &= ~(CF_CY_LEFT|CF_MINUS_BEFORE); + break; + } + } + if (dwFmt & CF_PARENS) + *szOut-- = '('; + szOut++; + + iRet = strlenW(szOut) + 1; + if (cchOut) + { + if (iRet <= cchOut) + memcpy(lpCurrencyStr, szOut, iRet * sizeof(WCHAR)); + else + { + memcpy(lpCurrencyStr, szOut, cchOut * sizeof(WCHAR)); + lpCurrencyStr[cchOut - 1] = '\0'; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + iRet = 0; + } + } + return iRet; +} + +/* FIXME: Everything below here needs to move somewhere else along with the + * other EnumXXX functions, when a method for storing resources for + * alternate calendars is determined. + */ + +/************************************************************************** + * EnumDateFormatsA (KERNEL32.@) + */ +BOOL WINAPI EnumDateFormatsA( DATEFMT_ENUMPROCA lpDateFmtEnumProc, LCID Locale, DWORD dwFlags) +{ + LCID Loc = GetUserDefaultLCID(); + if(!lpDateFmtEnumProc) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + switch( Loc ) + { + + case 0x00000407: /* (Loc,"de_DE") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd.MM.yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d.M.yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d.MM.yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d.M.yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dddd,d. MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d. MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d. MMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x0000040c: /* (Loc,"fr_FR") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd.MM.yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd-MM-yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dddd d MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d MMM yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00000c0c: /* (Loc,"fr_CA") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("yy-MM-dd")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd-MM-yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("yy MM dd")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("d MMMM, yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d MMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00000809: /* (Loc,"en_UK") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d.M.yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dd MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00000c09: /* (Loc,"en_AU") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("d/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dddd,d MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00001009: /* (Loc,"en_CA") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("yy-MM-dd")) return TRUE; + if(!(*lpDateFmtEnumProc)("M/dd/yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("d-MMM-yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("MMMM d, yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00001409: /* (Loc,"en_NZ") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("d/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d.MM.yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dddd, d MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00001809: /* (Loc,"en_IE") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd/MM/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d/M/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d.M.yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dd MMMM yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("d MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00001c09: /* (Loc,"en_ZA") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("yy/MM/dd")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dd MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00002009: /* (Loc,"en_JM") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dddd,MMMM dd,yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("MMMM dd,yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dddd,dd MMMM,yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd MMMM,yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + case 0x00002809: /* (Loc,"en_BZ") */ + case 0x00002c09: /* (Loc,"en_TT") */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("dd/MM/yyyy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dddd,dd MMMM yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + default: /* default to US English "en_US" */ + { + switch(dwFlags) + { + case DATE_SHORTDATE: + if(!(*lpDateFmtEnumProc)("M/d/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("M/d/yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("MM/dd/yy")) return TRUE; + if(!(*lpDateFmtEnumProc)("MM/dd/yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("yy/MM/dd")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd-MMM-yy")) return TRUE; + return TRUE; + case DATE_LONGDATE: + if(!(*lpDateFmtEnumProc)("dddd, MMMM dd, yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("MMMM dd, yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dddd, dd MMMM, yyyy")) return TRUE; + if(!(*lpDateFmtEnumProc)("dd MMMM, yyyy")) return TRUE; + return TRUE; + default: + FIXME("Unknown date format (%ld)\n", dwFlags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + } +} + +/************************************************************************** + * EnumDateFormatsW (KERNEL32.@) + */ +BOOL WINAPI EnumDateFormatsW( DATEFMT_ENUMPROCW lpDateFmtEnumProc, LCID Locale, DWORD dwFlags ) +{ + FIXME("(%p, %ld, %ld): stub\n", lpDateFmtEnumProc, Locale, dwFlags); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/************************************************************************** + * EnumTimeFormatsA (KERNEL32.@) + */ +BOOL WINAPI EnumTimeFormatsA( TIMEFMT_ENUMPROCA lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags ) +{ + LCID Loc = GetUserDefaultLCID(); + if(!lpTimeFmtEnumProc) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + if(dwFlags) + { + FIXME("Unknown time format (%ld)\n", dwFlags); + } + + switch( Loc ) + { + case 0x00000407: /* (Loc,"de_DE") */ + { + if(!(*lpTimeFmtEnumProc)("HH.mm")) return TRUE; + if(!(*lpTimeFmtEnumProc)("HH:mm:ss")) return TRUE; + if(!(*lpTimeFmtEnumProc)("H:mm:ss")) return TRUE; + if(!(*lpTimeFmtEnumProc)("H.mm")) return TRUE; + if(!(*lpTimeFmtEnumProc)("H.mm'Uhr'")) return TRUE; + return TRUE; + } + + case 0x0000040c: /* (Loc,"fr_FR") */ + case 0x00000c0c: /* (Loc,"fr_CA") */ + { + if(!(*lpTimeFmtEnumProc)("H:mm")) return TRUE; + if(!(*lpTimeFmtEnumProc)("HH:mm:ss")) return TRUE; + if(!(*lpTimeFmtEnumProc)("H:mm:ss")) return TRUE; + if(!(*lpTimeFmtEnumProc)("HH.mm")) return TRUE; + if(!(*lpTimeFmtEnumProc)("HH'h'mm")) return TRUE; + return TRUE; + } + + case 0x00000809: /* (Loc,"en_UK") */ + case 0x00000c09: /* (Loc,"en_AU") */ + case 0x00001409: /* (Loc,"en_NZ") */ + case 0x00001809: /* (Loc,"en_IE") */ + { + if(!(*lpTimeFmtEnumProc)("h:mm:ss tt")) return TRUE; + if(!(*lpTimeFmtEnumProc)("HH:mm:ss")) return TRUE; + if(!(*lpTimeFmtEnumProc)("H:mm:ss")) return TRUE; + return TRUE; + } + + case 0x00001c09: /* (Loc,"en_ZA") */ + case 0x00002809: /* (Loc,"en_BZ") */ + case 0x00002c09: /* (Loc,"en_TT") */ + { + if(!(*lpTimeFmtEnumProc)("h:mm:ss tt")) return TRUE; + if(!(*lpTimeFmtEnumProc)("hh:mm:ss tt")) return TRUE; + return TRUE; + } + + default: /* default to US style "en_US" */ + { + if(!(*lpTimeFmtEnumProc)("h:mm:ss tt")) return TRUE; + if(!(*lpTimeFmtEnumProc)("hh:mm:ss tt")) return TRUE; + if(!(*lpTimeFmtEnumProc)("H:mm:ss")) return TRUE; + if(!(*lpTimeFmtEnumProc)("HH:mm:ss")) return TRUE; + return TRUE; + } + } +} + +/************************************************************************** + * EnumTimeFormatsW (KERNEL32.@) + */ +BOOL WINAPI EnumTimeFormatsW( TIMEFMT_ENUMPROCW lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags ) +{ + FIXME("(%p,%ld,%ld): stub\n", lpTimeFmtEnumProc, Locale, dwFlags); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/****************************************************************************** + * EnumCalendarInfoA [KERNEL32.@] + */ +BOOL WINAPI EnumCalendarInfoA( CALINFO_ENUMPROCA calinfoproc,LCID locale, + CALID calendar,CALTYPE caltype ) +{ + FIXME("(%p,0x%04lx,0x%08lx,0x%08lx),stub!\n",calinfoproc,locale,calendar,caltype); + return FALSE; +} From def9bd78171205b99d56a09764eee4bce14999cf Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 26 Jun 2004 20:07:40 +0000 Subject: [PATCH 098/356] save modlue handle svn path=/trunk/; revision=9890 --- reactos/lib/kernel32/include/kernel32.h | 1 + reactos/lib/kernel32/misc/dllmain.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/lib/kernel32/include/kernel32.h b/reactos/lib/kernel32/include/kernel32.h index b3815f221e6..d87ba4a88bd 100755 --- a/reactos/lib/kernel32/include/kernel32.h +++ b/reactos/lib/kernel32/include/kernel32.h @@ -37,6 +37,7 @@ DWORD extern BOOL bIsFileApiAnsi; extern HANDLE hProcessHeap; extern HANDLE hBaseDir; +extern HMODULE hCurrentModule; extern CRITICAL_SECTION DllLock; diff --git a/reactos/lib/kernel32/misc/dllmain.c b/reactos/lib/kernel32/misc/dllmain.c index 0a9e5a0159d..afc8aff6fa6 100644 --- a/reactos/lib/kernel32/misc/dllmain.c +++ b/reactos/lib/kernel32/misc/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.34 2004/02/22 17:30:32 chorns Exp $ +/* $Id: dllmain.c,v 1.35 2004/06/26 20:07:40 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -23,6 +23,7 @@ extern UNICODE_STRING SystemDirectory; extern UNICODE_STRING WindowsDirectory; HANDLE hProcessHeap = NULL; +HMODULE hCurrentModule = NULL; HANDLE hBaseDir = NULL; static BOOL DllInitialized = FALSE; @@ -117,6 +118,7 @@ DllMain(HANDLE hDll, } hProcessHeap = RtlGetProcessHeap(); + hCurrentModule = hDll; /* * Initialize WindowsDirectory and SystemDirectory From add8be67c259a16ecfcb968075b8dd63af0a8803 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 26 Jun 2004 20:10:50 +0000 Subject: [PATCH 099/356] remove duplicate stuff due to adding lcformat from wine impl. misc stuff from wine svn path=/trunk/; revision=9891 --- reactos/lib/kernel32/misc/lang.c | 630 ++++++------------------------- 1 file changed, 114 insertions(+), 516 deletions(-) diff --git a/reactos/lib/kernel32/misc/lang.c b/reactos/lib/kernel32/misc/lang.c index a72031093db..edd70e49f87 100644 --- a/reactos/lib/kernel32/misc/lang.c +++ b/reactos/lib/kernel32/misc/lang.c @@ -1,4 +1,4 @@ -/* $Id: lang.c,v 1.19 2004/06/13 20:04:56 navaraf Exp $ +/* $Id: lang.c,v 1.20 2004/06/26 20:10:50 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT : ReactOS user mode libraries @@ -21,69 +21,57 @@ #define LOCALE_USE_CP_ACP 0x40000000 #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER) -static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); +//static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT); //#define _OLE2NLS_IN_BUILD_ -/* + +/****************************************************************************** * @implemented + * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.42 + * + * ConvertDefaultLocale (KERNEL32.@) + * + * Convert a default locale identifier into a real identifier. + * + * PARAMS + * lcid [I] LCID identifier of the locale to convert + * + * RETURNS + * lcid unchanged, if not a default locale or its sublanguage is + * not SUBLANG_NEUTRAL. + * GetSystemDefaultLCID(), if lcid == LOCALE_SYSTEM_DEFAULT. + * GetUserDefaultLCID(), if lcid == LOCALE_USER_DEFAULT or LOCALE_NEUTRAL. + * Otherwise, lcid with sublanguage changed to SUBLANG_DEFAULT. */ -LCID -STDCALL -ConvertDefaultLocale ( - LCID Locale - ) +LCID WINAPI ConvertDefaultLocale( LCID lcid ) { - switch(Locale) - { + LANGID langid; + + switch (lcid) + { case LOCALE_SYSTEM_DEFAULT: - return GetSystemDefaultLCID(); - + lcid = GetSystemDefaultLCID(); + break; case LOCALE_USER_DEFAULT: - return GetUserDefaultLCID(); - - /*case LOCALE_NEUTRAL: - return MAKELCID(LANG_NEUTRAL, SUBLANG_NEUTRAL);*/ - } - - /* ported from wine, is that right? */ - return MAKELANGID(PRIMARYLANGID(Locale), SUBLANG_NEUTRAL); + case LOCALE_NEUTRAL: + lcid = GetUserDefaultLCID(); + break; + default: + /* Replace SUBLANG_NEUTRAL with SUBLANG_DEFAULT */ + langid = LANGIDFROMLCID(lcid); + if (SUBLANGID(langid) == SUBLANG_NEUTRAL) + { + langid = MAKELANGID(PRIMARYLANGID(langid), SUBLANG_DEFAULT); + lcid = MAKELCID(langid, SORTIDFROMLCID(lcid)); + } + } + return lcid; } -/* - * @unimplemented - */ -BOOL -STDCALL -EnumCalendarInfoW ( - CALINFO_ENUMPROCW lpCalInfoEnumProc, - LCID Locale, - CALID Calendar, - CALTYPE CalType - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} -/* - * @unimplemented - */ -BOOL -STDCALL -EnumCalendarInfoA ( - CALINFO_ENUMPROCA lpCalInfoEnumProc, - LCID Locale, - CALID Calendar, - CALTYPE CalType - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - /* * @unimplemented @@ -117,36 +105,6 @@ EnumCalendarInfoExW( } -/* - * @unimplemented - */ -BOOL -STDCALL -EnumDateFormatsW ( - DATEFMT_ENUMPROCW lpDateFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -EnumDateFormatsA ( - DATEFMT_ENUMPROCA lpDateFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} /* @@ -327,36 +285,6 @@ EnumSystemLocalesA ( #endif -/* - * @unimplemented - */ -BOOL -STDCALL -EnumTimeFormatsW ( - TIMEFMT_ENUMPROCW lpTimeFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/* - * @unimplemented - */ -BOOL -STDCALL -EnumTimeFormatsA ( - TIMEFMT_ENUMPROCA lpTimeFmtEnumProc, - LCID Locale, - DWORD dwFlags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} /* @@ -504,86 +432,6 @@ GetCPInfoExA( } -/* - * @unimplemented - */ -int -STDCALL -GetCurrencyFormatW ( - LCID Locale, - DWORD dwFlags, - LPCWSTR lpValue, - CONST CURRENCYFMTW * lpFormat, - LPWSTR lpCurrencyStr, - int cchCurrency - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/* - * @unimplemented - */ -int -STDCALL -GetCurrencyFormatA ( - LCID Locale, - DWORD dwFlags, - LPCSTR lpValue, - CONST CURRENCYFMTA * lpFormat, - LPSTR lpCurrencyStr, - int cchCurrency - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -#ifndef _OLE2NLS_IN_BUILD_ - -/* - * @unimplemented - */ -int -STDCALL -GetDateFormatW ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME * lpDate, - LPCWSTR lpFormat, - LPWSTR lpDateStr, - int cchDate - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/* - * @unimplemented - */ -int -STDCALL -GetDateFormatA ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME * lpDate, - LPCSTR lpFormat, - LPSTR lpDateStr, - int cchDate - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -#endif - - /* * @unimplemented */ @@ -931,43 +779,8 @@ INT STDCALL GetLocaleInfoA( LCID lcid, LCTYPE lctype, LPSTR buffer, INT len ) } -/* - * @unimplemented - */ -int -STDCALL -GetNumberFormatW ( - LCID Locale, - DWORD dwFlags, - LPCWSTR lpValue, - CONST NUMBERFMTW * lpFormat, - LPWSTR lpNumberStr, - int cchNumber - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} -/* - * @unimplemented - */ -int -STDCALL -GetNumberFormatA ( - LCID Locale, - DWORD dwFlags, - LPCSTR lpValue, - CONST NUMBERFMTA * lpFormat, - LPSTR lpNumberStr, - int cchNumber - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented @@ -984,18 +797,13 @@ GetOEMCP (VOID) #ifndef _OLE2NLS_IN_BUILD_ /* - * @unimplemented + * @implemented */ LANGID STDCALL GetSystemDefaultLangID (VOID) { - /* FIXME: ??? */ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return MAKELANGID( - LANG_ENGLISH, - SUBLANG_ENGLISH_US - ); + return LANGIDFROMLCID(GetSystemDefaultLCID()); } @@ -1006,7 +814,11 @@ LCID STDCALL GetSystemDefaultLCID (VOID) { - return SystemLocale; + LCID lcid; + NtQueryDefaultLocale( FALSE, &lcid ); + return lcid; + +// return SystemLocale; } #endif @@ -1038,269 +850,7 @@ GetThreadLocale (VOID) #endif -INT RosGetTimeFormat(LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, int cchTime) -{ - INT nPos = 0, nLastFormatPos = 0; - BOOL bDrop = FALSE; - while( *lpFormat ) - { - if (*lpFormat == L'\'') - { - lpFormat++; - - while(*lpFormat) - { - if (*lpFormat == L'\'') - { - lpFormat++; - if(*lpFormat != L'\'') - break; - } - if (!cchTime) - nPos++; - else if(nPos > cchTime) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - else - { - if(!bDrop) - { - lpTimeStr[nPos] = *lpFormat; - nPos++; - } - } - *lpFormat++; - } - } - else if(*lpFormat==L'H' || *lpFormat==L'h' || *lpFormat==L'm' || *lpFormat==L's' || *lpFormat==L't' ) - { - int nCount, nBufLen; - WCHAR nType = *lpFormat; - WCHAR Buffer[40]; - - bDrop = FALSE; - - Buffer[0] = 0; - - for(nCount = 1; *lpFormat == nType; lpFormat++) - nCount++; - - switch(nType) - { - case L'h': - { - if(!(dwFlags & TIME_FORCE24HOURFORMAT)) - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, - lpTime->wHour == 0 ? 12 : (lpTime->wHour - 1) % 12 + 1); - break; - } - } - case L'H': - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wHour ); - break; - } - case L'm': - { - if(!(dwFlags & TIME_NOMINUTESORSECONDS)) - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wMinute ); - } - else - nPos = nLastFormatPos; - - break; - } - case L's': - { - if(!(dwFlags & (TIME_NOSECONDS|TIME_NOMINUTESORSECONDS))) - { - swprintf( Buffer, L"%.*d", nCount > 2 ? 2 : nCount, lpTime->wSecond ); - } - else - nPos = nLastFormatPos; - - break; - } - case L't': - { - if(!(dwFlags & TIME_NOTIMEMARKER)) - { - GetLocaleInfoW(Locale, (lpTime->wHour < 12) ? LOCALE_S1159 : LOCALE_S2359, Buffer, sizeof(Buffer) ); - if(nCount == 1) - Buffer[1] = 0; - } - else - { - nPos = nLastFormatPos; - bDrop = TRUE; - } - break; - } - } - nBufLen = wcslen(Buffer); - - if(!cchTime) - { - /* wine does nothing here?!? */ - } - else if(nPos + nBufLen < cchTime) - wcscpy( lpTimeStr + nPos, Buffer ); - else - { - lstrcpynW( lpTimeStr + nPos, Buffer, cchTime - nPos ); - - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - nPos += nBufLen; - nLastFormatPos = nPos; - } - else - { - if(!cchTime) - nPos++; - else if(nPos > cchTime) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - else - { - if(!bDrop) - { - lpTimeStr[nPos] = *lpFormat; - nPos++; - } - } - lpFormat++; - } - } - - /* Are we not only counting? */ - if (cchTime) - { - if (nPos >= cchTime) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - else - lpTimeStr[nPos] = L'\0'; - } - - nPos++; - return nPos; -} - -/* - * @implemented - */ -INT -STDCALL -GetTimeFormatW ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME* lpTime, - LPCWSTR lpFormat, - LPWSTR lpTimeStr, - int cchTime - ) -{ - WCHAR Buffer[40]; - SYSTEMTIME t; - - if (!Locale) - Locale = LOCALE_SYSTEM_DEFAULT; - - Locale = ConvertDefaultLocale( Locale ); - - if (lpFormat == NULL) - { - if (dwFlags & LOCALE_NOUSEROVERRIDE) - Locale = GetSystemDefaultLCID(); - - if (!GetLocaleInfoW(Locale, LOCALE_STIMEFORMAT, Buffer, 40)) - return 0; - - lpFormat = Buffer; - } - if (dwFlags & LOCALE_NOUSEROVERRIDE) - { - SetLastError(ERROR_INVALID_FLAGS); - return 0; - } - if (lpTime == NULL) - { - GetLocalTime(&t); - lpTime = &t; - } - if((lpTime->wHour > 24) || (lpTime->wMinute >= 60) || (lpTime->wSecond >= 60)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } - return RosGetTimeFormat(Locale, dwFlags, lpTime, lpFormat, lpTimeStr, cchTime); -} - - -/* - * @implemented - */ -int -STDCALL -GetTimeFormatA ( - LCID Locale, - DWORD dwFlags, - CONST SYSTEMTIME* lpTime, - LPCSTR lpFormat, - LPSTR lpTimeStr, - int cchTime - ) -{ - LPWSTR lpFormatU = NULL; - LPWSTR lpTimeStrU; - int numCharsU; - int retVal = 0; - - if (lpFormat != NULL) { - /* First just determine the number of necessary bytes - for the unicode string */ - int numBytes = MultiByteToWideChar(CP_ACP, 0, lpFormat, -1, NULL, 0); - - if (numBytes > 0) { - lpFormatU = HeapAlloc(GetProcessHeap(), 0, numBytes); - - if (lpFormatU != NULL) - MultiByteToWideChar(CP_ACP, 0, lpFormat, -1, lpFormatU, numBytes); - } - } - - /* Just get the number of characters needed to store the - Unicode output */ - numCharsU = GetTimeFormatW(Locale, dwFlags, lpTime, lpFormatU, NULL, 0); - - if (numCharsU != 0) { - lpTimeStrU = HeapAlloc(GetProcessHeap(), 0, numCharsU*sizeof(WCHAR)); - - if (lpTimeStrU != NULL) { - if (GetTimeFormatW(Locale, dwFlags, lpTime, lpFormatU, lpTimeStrU, numCharsU)) - /* Convert the output string to ANSI */ - retVal = WideCharToMultiByte(CP_ACP, 0, lpTimeStrU, numCharsU, lpTimeStr, cchTime, NULL, NULL); - - HeapFree(GetProcessHeap(), 0, lpTimeStrU); - } - } - - if (lpFormatU != NULL) - HeapFree(GetProcessHeap(), 0, lpFormatU); - - return retVal; -} @@ -1385,21 +935,40 @@ IsValidLanguageGroup( } -/* - * @unimplemented + +/****************************************************************************** + * @implemented + * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.44 + * + * IsValidLocale (KERNEL32.@) + * + * Determine if a locale is valid. + * + * PARAMS + * lcid [I] LCID of the locale to check + * flags [I] LCID_SUPPORTED = Valid, LCID_INSTALLED = Valid and installed on the system + * + * RETURN + * TRUE, if lcid is valid, + * FALSE, otherwise. + * + * NOTES + * Wine does not currently make the distinction between supported and installed. All + * languages supported are installed by default. */ -BOOL -STDCALL -IsValidLocale ( - LCID Locale, - DWORD dwFlags - ) +BOOL STDCALL +IsValidLocale( + LCID lcid, + DWORD flags + ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + /* check if language is registered in the kernel32 resources */ + return FindResourceExW( hCurrentModule, (LPWSTR)RT_STRING, + (LPCWSTR)LOCALE_ILANGUAGE, LANGIDFROMLCID(lcid)) != 0; } + #ifndef _OLE2NLS_IN_BUILD_ /* @@ -1507,19 +1076,48 @@ SetLocaleInfoW ( } -/* +/********************************************************************** * @implemented + * RIPPED FROM WINE's dlls\kernel\locale.c rev 1.42 + * + * SetThreadLocale (KERNEL32.@) + * + * Set the current threads locale. + * + * PARAMS + * lcid [I] LCID of the locale to set + * + * RETURNS + * Success: TRUE. The threads locale is set to lcid. + * Failure: FALSE. Use GetLastError() to determine the cause. + * */ -BOOL -STDCALL -SetThreadLocale ( - LCID Locale - ) +BOOL WINAPI SetThreadLocale( LCID lcid ) { - /* FIXME - Check if locale is valid */ - - NtCurrentTeb()->CurrentLocale = Locale; - return TRUE; + DPRINT("SetThreadLocale(0x%04lX)\n", lcid); + + lcid = ConvertDefaultLocale(lcid); + + if (lcid != GetThreadLocale()) + { + if (!IsValidLocale(lcid, LCID_SUPPORTED)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + NtCurrentTeb()->CurrentLocale = lcid; + /* FIXME: NtCurrentTeb()->code_page = get_lcid_codepage( lcid ); + * Wine save the acp for easy/fast access, but ROS has no such Teb member. + * Maybe add this member to ros as well? + */ + + /* + Lag test app for å se om locale etc, endres i en app. etter at prosessen er + startet, eller om bare nye prosesser blir berørt. + */ + } + return TRUE; } #endif From c12eca029d0ce98d2f3e971c0deda387c596f2b8 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sat, 26 Jun 2004 20:11:18 +0000 Subject: [PATCH 100/356] make misc/lcformat svn path=/trunk/; revision=9892 --- reactos/lib/kernel32/makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index 3ac8a5e71c7..eff36290df5 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.80 2004/05/29 21:24:44 hbirr Exp $ +# $Id: makefile,v 1.81 2004/06/26 20:11:18 gdalsnes Exp $ PATH_TO_TOP = ../.. @@ -34,7 +34,7 @@ MISC_OBJECTS = misc/error.o misc/atom.o misc/handle.o misc/env.o \ misc/stubs.o misc/lang.o misc/ldr.o misc/res.o \ misc/sysinfo.o misc/profile.o \ misc/mbchars.o misc/muldiv.o misc/computername.o \ - misc/perfcnt.o misc/lzexpand_main.o + misc/perfcnt.o misc/lzexpand_main.o misc/lcformat.o FILE_OBJECTS = file/file.o file/curdir.o file/lfile.o file/dir.o \ file/iocompl.o file/volume.o file/deviceio.o file/dosdev.o \ From 20ac14caf593fc3cd35ad04801954e1b78e91fa0 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 26 Jun 2004 22:30:34 +0000 Subject: [PATCH 101/356] - Added VideoPortQueryPerformanceCounter and VideoPortQueryServices to the import library definition file. - Fixed minor memory overrun in VideoPortInitialize for older video drivers (< Win NT 5.1). svn path=/trunk/; revision=9893 --- reactos/drivers/video/videoprt/videoprt.c | 5 +++-- reactos/drivers/video/videoprt/videoprt.def | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 3fc4bb3e2e2..ff7b14565fb 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.c,v 1.24 2004/03/19 20:58:32 navaraf Exp $ + * $Id: videoprt.c,v 1.25 2004/06/26 22:30:34 navaraf Exp $ */ #include "videoprt.h" @@ -534,7 +534,8 @@ VideoPortInitialize( RtlCopyMemory( &DriverExtension->InitializationData, HwInitializationData, - sizeof(VIDEO_HW_INITIALIZATION_DATA)); + min(sizeof(VIDEO_HW_INITIALIZATION_DATA), + HwInitializationData->HwInitDataSize)); DriverExtension->HwContext = HwContext; RtlCopyMemory(&DriverExtension->RegistryPath, RegistryPath, sizeof(UNICODE_STRING)); diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index e0bd5ee958d..a5caae0c563 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,4 +1,4 @@ -; $Id: videoprt.def,v 1.7 2004/03/08 20:27:33 dwelch Exp $ +; $Id: videoprt.def,v 1.8 2004/06/26 22:30:34 navaraf Exp $ ; ; vidport.def - export definition file for ReactOS ; @@ -39,6 +39,8 @@ VideoPortMapMemory@24 VideoPortMoveMemory@12 VideoPortPutDmaAdapter@8 VideoPortQueueDpc@12 +VideoPortQueryPerformanceCounter@8 +VideoPortQueryServices@12 VideoPortReadPortUchar@4 VideoPortReadPortUshort@4 VideoPortReadPortUlong@4 From 0ce9ce5756b11e06f188c3e3b368c30c955d20c7 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 26 Jun 2004 22:30:34 +0000 Subject: [PATCH 102/356] - Use the Video Port driver Int 10 services instead of using undocumented Ke386CallBios function. - Power management functions implementation. Based on patch by Magnus Olsen . - First steps towards VBE 1.2 support. Based on patch by Magnus Olsen . svn path=/trunk/; revision=9894 --- reactos/drivers/video/miniport/vbe/vbemp.c | 637 ++++++++++++--------- reactos/drivers/video/miniport/vbe/vbemp.h | 86 ++- 2 files changed, 418 insertions(+), 305 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 960efcfd16f..07f881f5e11 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -1,8 +1,10 @@ /* * ReactOS VBE miniport video driver - * * Copyright (C) 2004 Filip Navara * + * Power Management and VBE 1.2 support + * Copyright (C) 2004 Magnus Olsen + * * 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 @@ -19,7 +21,8 @@ * * TODO: * - Check input parameters everywhere. - * - Implement power management support. + * - Call VideoPortVerifyAccessRanges to reserve the memory we're about + * to map. */ /* INCLUDES *******************************************************************/ @@ -47,125 +50,13 @@ DriverEntry(IN PVOID Context1, IN PVOID Context2) } /* - * InitializeVideoAddressSpace + * VBEFindAdapter * - * This function maps the BIOS memory into out virtual address space and - * setups real-mode interrupt table. + * Should detect a VBE compatible display adapter, but it's not possible + * to use video port Int 10 services at this time during initialization, + * so we always return NO_ERROR and do the real work in VBEInitialize. */ -BOOL FASTCALL -InitializeVideoAddressSpace(VOID) -{ - NTSTATUS Status; - PVOID BaseAddress; - PVOID NullAddress; - ULONG ViewSize; - CHAR IVT[1024]; - CHAR BDA[256]; - LARGE_INTEGER Offset; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING PhysMemName; - HANDLE PhysMemHandle; - - /* - * Open the physical memory section - */ - - RtlInitUnicodeString(&PhysMemName, L"\\Device\\PhysicalMemory"); - InitializeObjectAttributes(&ObjectAttributes, &PhysMemName, 0, NULL, NULL); - Status = ZwOpenSection(&PhysMemHandle, SECTION_ALL_ACCESS, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT(("VBEMP: Couldn't open \\Device\\PhysicalMemory\n")); - return FALSE; - } - - /* - * Map the BIOS and device registers into the address space - */ - - Offset.QuadPart = 0xa0000; - ViewSize = 0x30000; - BaseAddress = (PVOID)0xa0000; - Status = NtMapViewOfSection(PhysMemHandle, NtCurrentProcess(), &BaseAddress, - 0, 8192, &Offset, &ViewSize, ViewUnmap, 0, PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT(("VBEMP: Couldn't map physical memory (%x)\n", Status)); - NtClose(PhysMemHandle); - return FALSE; - } - NtClose(PhysMemHandle); - if (BaseAddress != (PVOID)0xa0000) - { - DPRINT(("VBEMP: Couldn't map physical memory at the right address " - "(was %x)\n", BaseAddress)); - return FALSE; - } - - /* - * Map some memory to use for the non-BIOS parts of the v86 mode address - * space - */ - - BaseAddress = (PVOID)0x1; - ViewSize = 0x20000; - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - &BaseAddress, - 0, - &ViewSize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT(("VBEMP: Failed to allocate virtual memory (Status %x)\n", Status)); - return FALSE; - } - if (BaseAddress != (PVOID)0x0) - { - DPRINT(("VBEMP: Failed to allocate virtual memory at right address " - "(was %x)\n", BaseAddress)); - return FALSE; - } - - /* - * Get the real mode IVT from the kernel - */ - - Status = NtVdmControl(0, IVT); - if (!NT_SUCCESS(Status)) - { - DPRINT(("VBEMP: NtVdmControl failed (status %x)\n", Status)); - return 0; - } - - /* - * Copy the real mode IVT into the right place - */ - - NullAddress = (PVOID)0x0; /* Workaround for GCC 3.4 */ - VideoPortMoveMemory(NullAddress, IVT, 1024); - - /* - * Get the BDA from the kernel - */ - - Status = NtVdmControl(1, BDA); - if (!NT_SUCCESS(Status)) - { - DPRINT(("VBEMP: NtVdmControl failed (status %x)\n", Status)); - return FALSE; - } - - /* - * Copy the BDA into the right place - */ - - VideoPortMoveMemory((PVOID)0x400, BDA, 256); - - return TRUE; -} - VP_STATUS STDCALL VBEFindAdapter( IN PVOID HwDeviceExtension, @@ -174,79 +65,7 @@ VBEFindAdapter( IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again) { - KV86M_REGISTERS BiosRegisters; - DWORD ViewSize; - NTSTATUS Status; - PVBE_INFO VbeInfo; - PVBE_DEVICE_EXTENSION VBEDeviceExtension = - (PVBE_DEVICE_EXTENSION)HwDeviceExtension; - - /* - * Map the BIOS parts of memory into our memory space and intitalize - * the real mode interrupt table. - */ - - InitializeVideoAddressSpace(); - - /* - * Allocate a bit of memory that will be later used for VBE transport - * buffer. This memory must be accessible from V86 mode so it must fit - * in the first megabyte of physical memory. - */ - - VBEDeviceExtension->TrampolineMemory = (PVOID)0x20000; - ViewSize = 0x400; - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - (PVOID*)&VBEDeviceExtension->TrampolineMemory, 0, &ViewSize, MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT(("Failed to allocate virtual memory (Status %x)\n", Status)); - return 0; - } - if (VBEDeviceExtension->TrampolineMemory > (PVOID)(0x100000 - 0x400)) - { - DPRINT(("Failed to allocate virtual memory at right address " - "(was %x)\n", VBEDeviceExtension->TrampolineMemory)); - return 0; - } - VBEDeviceExtension->PhysicalAddress.QuadPart = - (UINT_PTR)VBEDeviceExtension->TrampolineMemory; - - /* - * Get the VBE general information. - */ - - VbeInfo = (PVBE_INFO)VBEDeviceExtension->TrampolineMemory; - VideoPortMoveMemory(VbeInfo->Signature, "VBE2", 4); - VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); - BiosRegisters.Eax = 0x4F00; - BiosRegisters.Edi = VBEDeviceExtension->PhysicalAddress.QuadPart & 0xFF; - BiosRegisters.Es = VBEDeviceExtension->PhysicalAddress.QuadPart >> 4; - Ke386CallBios(0x10, &BiosRegisters); - if (BiosRegisters.Eax == 0x4F) - { - if (VbeInfo->Version >= 0x200) - { - DPRINT(("VBE BIOS Present (%d.%d, %8ld Kb)\n", - VbeInfo->Version / 0x100, VbeInfo->Version & 0xFF, - VbeInfo->TotalMemory * 16)); - - return NO_ERROR; - } - else - { - DPRINT(("VBE BIOS present, but incompatible version.\n")); - - return ERROR_DEV_NOT_EXIST; - } - } - else - { - DPRINT(("No VBE BIOS found.\n")); - - return ERROR_DEV_NOT_EXIST; - } + return NO_ERROR; } /* @@ -254,60 +73,154 @@ VBEFindAdapter( * * Performs the first initialization of the adapter, after the HAL has given * up control of the video hardware to the video port driver. + * + * This function performs these steps: + * - Gets global VBE information and finds if VBE BIOS is present. + * - Builds the internal mode list using the list of modes provided by + * the VBE. */ BOOLEAN STDCALL VBEInitialize(PVOID HwDeviceExtension) { + INT10_BIOS_ARGUMENTS BiosRegisters; + VP_STATUS Status; + PVBE_DEVICE_EXTENSION VBEDeviceExtension = + (PVBE_DEVICE_EXTENSION)HwDeviceExtension; + ULONG Length; + ULONG ModeCount; + ULONG SuitableModeCount; + USHORT ModeTemp; + ULONG CurrentMode; + PVBE_MODEINFO VbeModeInfo; + VBE_MODEINFO TempVbeModeInfo; + WORD TempVbeModeNumber; + WORD DefaultMode; + + /* + * Get the Int 10 interface that we will use for allocating real + * mode memory and calling the video BIOS. + */ + + VBEDeviceExtension->Int10Interface.Version = VIDEO_PORT_INT10_INTERFACE_VERSION_1; + VBEDeviceExtension->Int10Interface.Size = sizeof(VIDEO_PORT_INT10_INTERFACE); + Status = VideoPortQueryServices( + HwDeviceExtension, + VideoPortServicesInt10, + (PINTERFACE)&VBEDeviceExtension->Int10Interface); + + if (Status != NO_ERROR) + { + DPRINT(("Failed to get Int 10 service functions (Status %x)\n", Status)); + return 0; + } + + /* + * Allocate a bit of memory that will be later used for VBE transport + * buffer. This memory must be accessible from V86 mode so it must fit + * in the first megabyte of physical memory. + */ + + Length = 0x400; + Status = VBEDeviceExtension->Int10Interface.Int10AllocateBuffer( + VBEDeviceExtension->Int10Interface.Context, + &VBEDeviceExtension->TrampolineMemorySegment, + &VBEDeviceExtension->TrampolineMemoryOffset, + &Length); + + if (Status != NO_ERROR) + { + DPRINT(("Failed to allocate virtual memory (Status %x)\n", Status)); + return 0; + } + + /* + * Get the VBE general information. + */ + + VBEDeviceExtension->Int10Interface.Int10WriteMemory( + VBEDeviceExtension->Int10Interface.Context, + VBEDeviceExtension->TrampolineMemorySegment, + VBEDeviceExtension->TrampolineMemoryOffset, + "VBE2", + 4); + + VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); + BiosRegisters.Eax = VBE_GET_CONTROLLER_INFORMATION; + BiosRegisters.Edi = VBEDeviceExtension->TrampolineMemoryOffset; + BiosRegisters.SegEs = VBEDeviceExtension->TrampolineMemorySegment; + VBEDeviceExtension->Int10Interface.Int10CallBios( + VBEDeviceExtension->Int10Interface.Context, + &BiosRegisters); + + if (BiosRegisters.Eax == VBE_SUCCESS) + { + VBEDeviceExtension->Int10Interface.Int10ReadMemory( + VBEDeviceExtension->Int10Interface.Context, + VBEDeviceExtension->TrampolineMemorySegment, + VBEDeviceExtension->TrampolineMemoryOffset, + &VBEDeviceExtension->VbeInfo, + sizeof(VBEDeviceExtension->VbeInfo)); + + DPRINT(("VBE BIOS Present (%d.%d, %8ld Kb)\n", + VBEDeviceExtension->VbeInfo.Version / 0x100, + VBEDeviceExtension->VbeInfo.Version & 0xFF, + VBEDeviceExtension->VbeInfo.TotalMemory * 16)); + +#ifdef VBE12_SUPPORT + if (VBEDeviceExtension->VbeInfo.Version < 0x102) +#else + if (VBEDeviceExtension->VbeInfo.Version < 0x200) +#endif + { + DPRINT(("VBE BIOS present, but incompatible version.\n")); + return ERROR_DEV_NOT_EXIST; + } + } + else + { + DPRINT(("No VBE BIOS found.\n")); + return ERROR_DEV_NOT_EXIST; + } + +#ifdef VBE12_SUPPORT + if (VBEDeviceExtension->VbeInfo.Version < 0x200) + { + /* + * FIXME: Build a mode list here based on the total memory + * available on the video card and the video mode tables + * from the VBE specification. + */ + return ERROR_NOT_SUPPORTED; + } +#endif + /* * Build a mode list here that can be later used by * IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES and IOCTL_VIDEO_QUERY_AVAIL_MODES * calls. */ - ULONG ModeCount; - ULONG CurrentMode; - KV86M_REGISTERS BiosRegisters; - PVBE_DEVICE_EXTENSION VBEDeviceExtension = - (PVBE_DEVICE_EXTENSION)HwDeviceExtension; - PVBE_INFO VbeInfo; - PVBE_MODEINFO VbeModeInfo; - VBE_MODEINFO TempVbeModeInfo; - WORD TempVbeModeNumber; - WORD *ModeList; - WORD DefaultMode; - - InitializeVideoAddressSpace(); - - /* - * Get the VBE general information. - */ - - VbeInfo = (PVBE_INFO)VBEDeviceExtension->TrampolineMemory; - VideoPortMoveMemory(VbeInfo->Signature, "VBE2", 4); - VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); - BiosRegisters.Eax = 0x4F00; - BiosRegisters.Edi = VBEDeviceExtension->PhysicalAddress.QuadPart & 0xFF; - BiosRegisters.Es = VBEDeviceExtension->PhysicalAddress.QuadPart >> 4; - Ke386CallBios(0x10, &BiosRegisters); - - VBEDeviceExtension->VBEVersion = VbeInfo->Version; - VBEDeviceExtension->VGACompatible = !(VbeInfo->Capabilities & 2); - /* * Get the number of supported video modes. + * + * No need to be map the memory. It's either in the video BIOS memory or + * in our trampoline memory. In either case the memory is already mapped. */ - /* - * No need to be mapped, it's either in BIOS memory or in our trampoline - * memory. Both of them are already mapped. - */ - ModeList = (WORD *)((HIWORD(VbeInfo->VideoModePtr) << 4) + LOWORD(VbeInfo->VideoModePtr)); - for (CurrentMode = 0, ModeCount = 0; - ModeList[CurrentMode] != 0xFFFF && ModeList[CurrentMode] != 0; - CurrentMode++) + for (ModeCount = 0; ; ModeCount++) { - ModeCount++; + /* Read the VBE mode number. */ + VBEDeviceExtension->Int10Interface.Int10ReadMemory( + VBEDeviceExtension->Int10Interface.Context, + HIWORD(VBEDeviceExtension->VbeInfo.VideoModePtr), + LOWORD(VBEDeviceExtension->VbeInfo.VideoModePtr) + (ModeCount << 1), + &ModeTemp, + sizeof(ModeTemp)); + + /* End of list? */ + if (ModeTemp == 0xFFFF || ModeTemp == 0) + break; } /* @@ -323,35 +236,61 @@ VBEInitialize(PVOID HwDeviceExtension) * Get the actual mode infos. */ - for (CurrentMode = 0, ModeCount = 0, DefaultMode = 0; - ModeList[CurrentMode] != 0xFFFF && ModeList[CurrentMode] != 0; + for (CurrentMode = 0, SuitableModeCount = 0, DefaultMode = 0; + CurrentMode < ModeCount; CurrentMode++) { - BiosRegisters.Eax = 0x4F01; - BiosRegisters.Ecx = ModeList[CurrentMode]; - BiosRegisters.Edi = (VBEDeviceExtension->PhysicalAddress.QuadPart + 0x200) & 0xF; - BiosRegisters.Es = (VBEDeviceExtension->PhysicalAddress.QuadPart + 0x200) >> 4; - Ke386CallBios(0x10, &BiosRegisters); - VbeModeInfo = (PVBE_MODEINFO)(VBEDeviceExtension->TrampolineMemory + 0x200); - if (BiosRegisters.Eax == 0x4F && + /* Read the VBE mode number. */ + VBEDeviceExtension->Int10Interface.Int10ReadMemory( + VBEDeviceExtension->Int10Interface.Context, + HIWORD(VBEDeviceExtension->VbeInfo.VideoModePtr), + LOWORD(VBEDeviceExtension->VbeInfo.VideoModePtr) + (CurrentMode << 1), + &ModeTemp, + sizeof(ModeTemp)); + + /* Call VBE BIOS to read the mode info. */ + VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); + BiosRegisters.Eax = VBE_GET_MODE_INFORMATION; + BiosRegisters.Ecx = ModeTemp; + BiosRegisters.Edi = VBEDeviceExtension->TrampolineMemoryOffset + 0x200; + BiosRegisters.SegEs = VBEDeviceExtension->TrampolineMemorySegment; + VBEDeviceExtension->Int10Interface.Int10CallBios( + VBEDeviceExtension->Int10Interface.Context, + &BiosRegisters); + + /* Read the VBE mode info. */ + VBEDeviceExtension->Int10Interface.Int10ReadMemory( + VBEDeviceExtension->Int10Interface.Context, + VBEDeviceExtension->TrampolineMemorySegment, + VBEDeviceExtension->TrampolineMemoryOffset + 0x200, + VBEDeviceExtension->ModeInfo + SuitableModeCount, + sizeof(VBE_MODEINFO)); + + VbeModeInfo = VBEDeviceExtension->ModeInfo + SuitableModeCount; + + /* Is this mode acceptable? */ + if (BiosRegisters.Eax == VBE_SUCCESS && VbeModeInfo->XResolution >= 640 && VbeModeInfo->YResolution >= 480 && (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)) { - VideoPortMoveMemory(VBEDeviceExtension->ModeInfo + ModeCount, - VBEDeviceExtension->TrampolineMemory + 0x200, - sizeof(VBE_MODEINFO)); - VBEDeviceExtension->ModeNumbers[ModeCount] = ModeList[CurrentMode] | 0x4000; + VBEDeviceExtension->ModeNumbers[SuitableModeCount] = ModeTemp | 0x4000; if (VbeModeInfo->XResolution == 640 && VbeModeInfo->YResolution == 480 && VbeModeInfo->BitsPerPixel == 32) { - DefaultMode = ModeCount; + DefaultMode = SuitableModeCount; } - ModeCount++; + SuitableModeCount++; } } + if (SuitableModeCount == 0) + { + DPRINT(("VBEMP: No video modes supported\n")); + return FALSE; + } + /* * Exchange the default mode so it's at the first place in list. */ @@ -366,13 +305,7 @@ VBEInitialize(PVOID HwDeviceExtension) VBEDeviceExtension->ModeNumbers[0] = VBEDeviceExtension->ModeNumbers[DefaultMode]; VBEDeviceExtension->ModeNumbers[DefaultMode] = TempVbeModeNumber; - if (ModeCount == 0) - { - DPRINT(("VBEMP: No video modes supported\n")); - return FALSE; - } - - VBEDeviceExtension->ModeCount = ModeCount; + VBEDeviceExtension->ModeCount = SuitableModeCount; /* * Print the supported video modes when DBG is set. @@ -380,7 +313,7 @@ VBEInitialize(PVOID HwDeviceExtension) #ifdef DBG for (CurrentMode = 0; - CurrentMode < ModeCount; + CurrentMode < SuitableModeCount; CurrentMode++) { DPRINT(("%dx%dx%d\n", @@ -443,8 +376,14 @@ VBEStartIO( break; case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: + if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } Result = VBEUnmapVideoMemory( (PVBE_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MEMORY)RequestPacket->InputBuffer, RequestPacket->StatusBlock); break; @@ -538,7 +477,62 @@ VBEGetPowerState( ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl) { - return ERROR_INVALID_FUNCTION; + INT10_BIOS_ARGUMENTS BiosRegisters; + PVBE_DEVICE_EXTENSION VBEDeviceExtension = + (PVBE_DEVICE_EXTENSION)HwDeviceExtension; + + if (HwId != DISPLAY_ADAPTER_HW_ID || + VideoPowerControl->Length < sizeof(VIDEO_POWER_MANAGEMENT)) + return ERROR_INVALID_FUNCTION; + + /* + * Get general power support information. + */ + + VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); + BiosRegisters.Eax = VBE_POWER_MANAGEMENT_EXTENSIONS; + BiosRegisters.Ebx = 0; + BiosRegisters.Edi = 0; + BiosRegisters.SegEs = 0; + VBEDeviceExtension->Int10Interface.Int10CallBios( + VBEDeviceExtension->Int10Interface.Context, + &BiosRegisters); + + if (BiosRegisters.Eax == VBE_NOT_SUPPORTED) + return ERROR_NOT_SUPPORTED; + if (BiosRegisters.Eax != VBE_SUCCESS) + return ERROR_INVALID_FUNCTION; + + /* + * Get current power state. + */ + + VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); + BiosRegisters.Eax = VBE_POWER_MANAGEMENT_EXTENSIONS; + BiosRegisters.Ebx = 0x2; + BiosRegisters.Edi = 0; + BiosRegisters.SegEs = 0; + VBEDeviceExtension->Int10Interface.Int10CallBios( + VBEDeviceExtension->Int10Interface.Context, + &BiosRegisters); + + if (BiosRegisters.Eax == VBE_SUCCESS) + { + VideoPowerControl->DPMSVersion = BiosRegisters.Ebx & 0xFF; + switch (BiosRegisters.Ebx >> 8) + { + case 0: VideoPowerControl->PowerState = VideoPowerOn; break; + case 1: VideoPowerControl->PowerState = VideoPowerStandBy; break; + case 2: VideoPowerControl->PowerState = VideoPowerSuspend; break; + case 4: VideoPowerControl->PowerState = VideoPowerOff; break; + case 5: VideoPowerControl->PowerState = VideoPowerOn; break; + default: VideoPowerControl->PowerState = VideoPowerUnspecified; + } + + return NO_ERROR; + } + + return ERROR_NOT_SUPPORTED; } /* @@ -553,7 +547,45 @@ VBESetPowerState( ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl) { - return ERROR_INVALID_FUNCTION; + INT10_BIOS_ARGUMENTS BiosRegisters; + PVBE_DEVICE_EXTENSION VBEDeviceExtension = + (PVBE_DEVICE_EXTENSION)HwDeviceExtension; + + if (HwId != DISPLAY_ADAPTER_HW_ID || + VideoPowerControl->Length < sizeof(VIDEO_POWER_MANAGEMENT) || + VideoPowerControl->PowerState < VideoPowerOn || + VideoPowerControl->PowerState > VideoPowerHibernate) + return ERROR_INVALID_FUNCTION; + + if (VideoPowerControl->PowerState == VideoPowerHibernate) + return NO_ERROR; + + /* + * Set current power state. + */ + + VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); + BiosRegisters.Eax = VBE_POWER_MANAGEMENT_EXTENSIONS; + BiosRegisters.Ebx = 1; + BiosRegisters.Edi = 0; + BiosRegisters.SegEs = 0; + switch (VideoPowerControl->PowerState) + { + case VideoPowerStandBy: BiosRegisters.Ebx |= 0x100; break; + case VideoPowerSuspend: BiosRegisters.Ebx |= 0x200; break; + case VideoPowerOff: BiosRegisters.Ebx |= 0x400; break; + } + + VBEDeviceExtension->Int10Interface.Int10CallBios( + VBEDeviceExtension->Int10Interface.Context, + &BiosRegisters); + + if (BiosRegisters.Eax == VBE_NOT_SUPPORTED) + return ERROR_NOT_SUPPORTED; + if (BiosRegisters.Eax != VBE_SUCCESS) + return ERROR_INVALID_FUNCTION; + + return VBE_SUCCESS; } /* @@ -568,13 +600,21 @@ VBESetCurrentMode( PVIDEO_MODE RequestedMode, PSTATUS_BLOCK StatusBlock) { - KV86M_REGISTERS BiosRegisters; + INT10_BIOS_ARGUMENTS BiosRegisters; + + if (RequestedMode->RequestedMode >= DeviceExtension->ModeCount) + { + return ERROR_INVALID_PARAMETER; + } VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); - BiosRegisters.Eax = 0x4F02; + BiosRegisters.Eax = VBE_SET_VBE_MODE; BiosRegisters.Ebx = DeviceExtension->ModeNumbers[RequestedMode->RequestedMode]; - Ke386CallBios(0x10, &BiosRegisters); - if (BiosRegisters.Eax == 0x4F) + DeviceExtension->Int10Interface.Int10CallBios( + DeviceExtension->Int10Interface.Context, + &BiosRegisters); + + if (BiosRegisters.Eax == VBE_SUCCESS) { DeviceExtension->CurrentMode = RequestedMode->RequestedMode; } @@ -583,7 +623,8 @@ VBESetCurrentMode( DPRINT(("VBEMP: VBESetCurrentMode failed (%x)\n", BiosRegisters.Eax)); DeviceExtension->CurrentMode = -1; } - return (BiosRegisters.Eax == 0x4F); + + return BiosRegisters.Eax == VBE_SUCCESS; } /* @@ -598,14 +639,16 @@ VBEResetDevice( PVBE_DEVICE_EXTENSION DeviceExtension, PSTATUS_BLOCK StatusBlock) { - KV86M_REGISTERS BiosRegisters; + INT10_BIOS_ARGUMENTS BiosRegisters; - InitializeVideoAddressSpace(); VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); - BiosRegisters.Eax = 0x4F02; + BiosRegisters.Eax = VBE_SET_VBE_MODE; BiosRegisters.Ebx = 0x3; - Ke386CallBios(0x10, &BiosRegisters); - return TRUE; + DeviceExtension->Int10Interface.Int10CallBios( + DeviceExtension->Int10Interface.Context, + &BiosRegisters); + + return BiosRegisters.Eax == VBE_SUCCESS; } /* @@ -623,16 +666,28 @@ VBEMapVideoMemory( PSTATUS_BLOCK StatusBlock) { PHYSICAL_ADDRESS FrameBuffer; - ULONG inIoSpace = 0; + ULONG inIoSpace = VIDEO_MEMORY_SPACE_MEMORY; StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION); - FrameBuffer.QuadPart = - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].PhysBasePtr; - MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; - MapInformation->VideoRamLength = - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BytesPerScanLine * - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution; + if (DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].ModeAttributes & + VBE_MODEATTR_LINEAR) + { + FrameBuffer.QuadPart = + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].PhysBasePtr; + MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; + MapInformation->VideoRamLength = + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BytesPerScanLine * + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution; + } +#ifdef VBE12_SUPPORT + else + { + FrameBuffer.QuadPart = 0xA0000; + MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; + MapInformation->VideoRamLength = 0x10000; + } +#endif VideoPortMapMemory(DeviceExtension, FrameBuffer, &MapInformation->VideoRamLength, &inIoSpace, @@ -641,8 +696,6 @@ VBEMapVideoMemory( MapInformation->FrameBufferBase = MapInformation->VideoRamBase; MapInformation->FrameBufferLength = MapInformation->VideoRamLength; - DeviceExtension->FrameBufferMemory = MapInformation->VideoRamBase; - return TRUE; } @@ -656,9 +709,10 @@ VBEMapVideoMemory( BOOL FASTCALL VBEUnmapVideoMemory( PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MEMORY VideoMemory, PSTATUS_BLOCK StatusBlock) { - VideoPortUnmapMemory(DeviceExtension, DeviceExtension->FrameBufferMemory, + VideoPortUnmapMemory(DeviceExtension, VideoMemory->RequestedVirtualAddress, NULL); return TRUE; } @@ -709,7 +763,7 @@ VBEQueryMode( VideoMode->YMillimeter = 0; /* FIXME */ if (VBEMode->BitsPerPixel > 8) { - if (DeviceExtension->VBEVersion < 0x300) + if (DeviceExtension->VbeInfo.Version < 0x300) { VideoMode->NumberRedBits = VBEMode->RedMaskSize; VideoMode->NumberGreenBits = VBEMode->GreenMaskSize; @@ -813,14 +867,19 @@ VBESetColorRegisters( PVIDEO_CLUT ColorLookUpTable, PSTATUS_BLOCK StatusBlock) { - KV86M_REGISTERS BiosRegisters; + INT10_BIOS_ARGUMENTS BiosRegisters; ULONG Entry; PULONG OutputEntry; + ULONG OutputBuffer[256]; if (ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry > 256) return FALSE; - if (DeviceExtension->VGACompatible) + /* + * For VGA compatible adapters program the color registers directly. + */ + + if (!(DeviceExtension->VbeInfo.Capabilities & 2)) { for (Entry = ColorLookUpTable->FirstEntry; Entry < ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry; @@ -831,6 +890,7 @@ VBESetColorRegisters( VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[Entry].RgbArray.Green); VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[Entry].RgbArray.Blue); } + return TRUE; } else @@ -841,7 +901,7 @@ VBESetColorRegisters( */ for (Entry = ColorLookUpTable->FirstEntry, - OutputEntry = DeviceExtension->TrampolineMemory; + OutputEntry = OutputBuffer; Entry < ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry; Entry++, OutputEntry++) { @@ -851,13 +911,24 @@ VBESetColorRegisters( (ColorLookUpTable->LookupTable[Entry].RgbArray.Blue); } - BiosRegisters.Eax = 0x4F09; + DeviceExtension->Int10Interface.Int10WriteMemory( + DeviceExtension->Int10Interface.Context, + DeviceExtension->TrampolineMemorySegment, + DeviceExtension->TrampolineMemoryOffset, + OutputBuffer, + (OutputEntry - OutputBuffer) * sizeof(ULONG)); + + VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters)); + BiosRegisters.Eax = VBE_SET_GET_PALETTE_DATA; BiosRegisters.Ebx = 0; BiosRegisters.Ecx = ColorLookUpTable->NumEntries; BiosRegisters.Edx = ColorLookUpTable->FirstEntry; - BiosRegisters.Edi = DeviceExtension->PhysicalAddress.QuadPart & 0xF; - BiosRegisters.Es = DeviceExtension->PhysicalAddress.QuadPart >> 4; - Ke386CallBios(0x10, &BiosRegisters); - return (BiosRegisters.Eax == 0x4F); + BiosRegisters.Edi = DeviceExtension->TrampolineMemoryOffset; + BiosRegisters.SegEs = DeviceExtension->TrampolineMemorySegment; + DeviceExtension->Int10Interface.Int10CallBios( + DeviceExtension->Int10Interface.Context, + &BiosRegisters); + + return BiosRegisters.Eax == VBE_SUCCESS; } } diff --git a/reactos/drivers/video/miniport/vbe/vbemp.h b/reactos/drivers/video/miniport/vbe/vbemp.h index 58ceed90aa4..cae4716e10f 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.h +++ b/reactos/drivers/video/miniport/vbe/vbemp.h @@ -31,26 +31,67 @@ #include #include -/* For Ke386CallBios */ -#include "internal/v86m.h" - -/* FIXME: Missing define in w32api! */ -#ifndef NtCurrentProcess -#define NtCurrentProcess() ((HANDLE)(LONG_PTR)-1) -#endif - #ifdef DBG #define DPRINT(arg) DbgPrint arg; #else #define DPRINT(arg) #endif +/* + * Compile-time define to get VBE 1.2 support. The implementation + * is far from complete now and so it's left undefined. + */ + +/* #define VBE12_SUPPORT */ + #include /* - * VBE specification defined structure for general adapter info - * returned by function 0x4F00. + * VBE Command Definitions */ + +#define VBE_GET_CONTROLLER_INFORMATION 0x4F00 +#define VBE_GET_MODE_INFORMATION 0x4F01 +#define VBE_SET_VBE_MODE 0x4F02 +#define VBE_GET_CURRENT_VBE_MODE 0x4F03 +#define VBE_SAVE_RESTORE_STATE 0x4F04 +#define VBE_DISPLAY_WINDOW_CONTROL 0x4F05 +#define VBE_SET_GET_LOGICAL_SCAN_LINE_LENGTH 0x4F06 +#define VBE_SET_GET_DISPLAY_START 0x4F07 +#define VBE_SET_GET_DAC_PALETTE_FORMAT 0x4F08 +#define VBE_SET_GET_PALETTE_DATA 0x4F09 + +/* VBE 2.0+ */ +#define VBE_RETURN_PROTECTED_MODE_INTERFACE 0x4F0A +#define VBE_GET_SET_PIXEL_CLOCK 0x4F0B + +/* Extensions */ +#define VBE_POWER_MANAGEMENT_EXTENSIONS 0x4F10 +#define VBE_FLAT_PANEL_INTERFACE_EXTENSIONS 0x4F11 +#define VBE_AUDIO_INTERFACE_EXTENSIONS 0x4F12 +#define VBE_OEM_EXTENSIONS 0x4F13 +#define VBE_DISPLAY_DATA_CHANNEL 0x4F14 + +/* + * VBE Video Mode Information Attributes + */ + +#define VBE_MODEATTR_LINEAR 0x80 + +/* + * VBE Return Codes + */ + +#define VBE_SUCCESS 0x4F +#define VBE_UNSUCCESSFUL 0x14F +#define VBE_NOT_SUPPORTED 0x24F +#define VBE_FUNCTION_INVALID 0x34F + +/* + * VBE specification defined structure for general adapter info + * returned by function VBE_GET_CONTROLLER_INFORMATION command. + */ + typedef struct { CHAR Signature[4]; @@ -69,9 +110,11 @@ typedef struct /* * VBE specification defined structure for specific video mode - * info returned by function 0x4F01. + * info returned by function VBE_GET_MODE_INFORMATION command. */ -typedef struct { + +typedef struct +{ /* Mandatory information for all VBE revisions */ WORD ModeAttributes; BYTE WinAAttributes; @@ -129,21 +172,19 @@ typedef struct { CHAR Reserved4[189]; } VBE_MODEINFO, *PVBE_MODEINFO; -#define VBE_MODEATTR_LINEAR 0x80 - #include -typedef struct { - /* Trampoline memory for communication with VBE real-mode interface. */ - PHYSICAL_ADDRESS PhysicalAddress; - PVOID TrampolineMemory; +typedef struct +{ + /* Interface to Int10 calls */ + VIDEO_PORT_INT10_INTERFACE Int10Interface; - /* Pointer to mapped frame buffer memory */ - PVOID FrameBufferMemory; + /* Trampoline memory for communication with VBE real-mode interface */ + USHORT TrampolineMemorySegment; + USHORT TrampolineMemoryOffset; /* General controller/BIOS information */ - BOOL VGACompatible; - WORD VBEVersion; + VBE_INFO VbeInfo; /* Saved information about video modes */ ULONG ModeCount; @@ -207,6 +248,7 @@ VBEMapVideoMemory( BOOL FASTCALL VBEUnmapVideoMemory( PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MEMORY VideoMemory, PSTATUS_BLOCK StatusBlock); BOOL FASTCALL From 8d2f5591896075efb6694906dd6de554b1dd6d86 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Sun, 27 Jun 2004 04:08:57 +0000 Subject: [PATCH 103/356] fix end-of-lines svn path=/trunk/; revision=9897 --- reactos/ntoskrnl/rtl/i386/except.s | 582 ++++++++++++++--------------- 1 file changed, 291 insertions(+), 291 deletions(-) diff --git a/reactos/ntoskrnl/rtl/i386/except.s b/reactos/ntoskrnl/rtl/i386/except.s index 156da64b626..1b613708cbf 100755 --- a/reactos/ntoskrnl/rtl/i386/except.s +++ b/reactos/ntoskrnl/rtl/i386/except.s @@ -1,291 +1,291 @@ -/* $Id: except.s,v 1.4 2004/06/25 16:39:41 weiden Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Kernel-mode exception support for IA-32 - * FILE: ntoskrnl/rtl/i386/except.s - * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - * NOTES: This file is shared with lib/ntdll/rtl/i386/except.s. - * Please keep them in sync. - */ - -#define EXCEPTION_UNWINDING 0x02 - -#define EREC_FLAGS 0x04 - -#define ExceptionContinueExecution 0 -#define ExceptionContinueSearch 1 -#define ExceptionNestedException 2 -#define ExceptionCollidedUnwind 3 - -.globl _RtlpExecuteHandlerForException -.globl _RtlpExecuteHandlerForUnwind - -#define CONTEXT_FLAGS 0x00 -#define CONTEXT_SEGGS 0x8C -#define CONTEXT_SEGFS 0x90 -#define CONTEXT_SEGES 0x94 -#define CONTEXT_SEGDS 0x98 -#define CONTEXT_EDI 0x9C -#define CONTEXT_ESI 0xA0 -#define CONTEXT_EBX 0xA4 -#define CONTEXT_EDX 0xA8 -#define CONTEXT_ECX 0xAC -#define CONTEXT_EAX 0xB0 -#define CONTEXT_EBP 0xB4 -#define CONTEXT_EIP 0xB8 -#define CONTEXT_SEGCS 0xBC -#define CONTEXT_EFLAGS 0xC0 -#define CONTEXT_ESP 0xC4 -#define CONTEXT_SEGSS 0xC8 - - -#define RCC_CONTEXT 0x08 - -// EAX = value to print -_do_debug: - pushal - pushl %eax - call _AsmDebug@4 - popal - ret - -#ifndef __NTOSKRNL__ - -// -// VOID -// RtlpCaptureContext(PCONTEXT pContext); -// -// Parameters: -// [ESP+08h] - PCONTEXT_X86 pContext -// Registers: -// None -// Returns: -// Nothing -// Notes: -// Grabs the current CPU context. -.globl _RtlpCaptureContext -_RtlpCaptureContext: - pushl %ebp - movl %esp, %ebp - movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure - - cld - pushf - pop %eax - movl %eax, CONTEXT_EFLAGS(%edx) - xorl %eax, %eax - movl %eax, CONTEXT_EAX(%edx) - movl %eax, CONTEXT_EBX(%edx) - movl %eax, CONTEXT_ECX(%edx) - movl %eax, CONTEXT_EDX(%edx) - movl %eax, CONTEXT_ESI(%edx) - movl %eax, CONTEXT_EDI(%edx) - movl %cs, %eax - movl %eax, CONTEXT_SEGCS(%edx) - movl %ds, %eax - movl %eax, CONTEXT_SEGDS(%edx) - movl %es, %eax - movl %eax, CONTEXT_SEGES(%edx) - movl %fs, %eax - movl %eax, CONTEXT_SEGFS(%edx) - movl %gs, %eax - movl %eax, CONTEXT_SEGGS(%edx) - movl %ss, %eax - movl %eax, CONTEXT_SEGSS(%edx) - - // - // STACK LAYOUT: - (ESP to put in context structure) - // - RETURN ADDRESS OF CALLER OF CALLER - // - EBP OF CALLER OF CALLER - // ... - // - RETURN ADDRESS OF CALLER - // - EBP OF CALLER - // ... - // - - // Get return address of the caller of the caller of this function - movl %ebp, %ebx - //movl 4(%ebx), %eax // EAX = return address of caller - movl (%ebx), %ebx // EBX = EBP of caller - - movl 4(%ebx), %eax // EAX = return address of caller of caller - movl (%ebx), %ebx // EBX = EBP of caller of caller - - movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller - movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller - addl $8, %ebx - movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 - - movl %ebp, %esp - popl %ebp - ret - -#endif /* !__NTOSKRNL__ */ - -#define REH_ERECORD 0x08 -#define REH_RFRAME 0x0C -#define REH_CONTEXT 0x10 -#define REH_DCONTEXT 0x14 -#define REH_EROUTINE 0x18 - -// Parameters: -// None -// Registers: -// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord -// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame -// [EBP+10h] - PVOID Context -// [EBP+14h] - PVOID DispatcherContext -// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine -// EDX - Address of protecting exception handler -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// Setup the protecting exception handler and call the exception -// handler in the right context. -_RtlpExecuteHandler: - pushl %ebp - movl %esp, %ebp - pushl REH_RFRAME(%ebp) - - pushl %edx - pushl %fs:0x0 - movl %esp, %fs:0x0 - - // Prepare to call the exception handler - pushl REH_DCONTEXT(%ebp) - pushl REH_CONTEXT(%ebp) - pushl REH_RFRAME(%ebp) - pushl REH_ERECORD(%ebp) - - // Now call the exception handler - movl REH_EROUTINE(%ebp), %eax - call *%eax - - cmpl $-1, %fs:0x0 - jne .reh_stack_looks_ok - - // This should not happen - pushl 0 - pushl 0 - pushl 0 - pushl 0 - call _RtlAssert@16 - -.reh_loop: - jmp .reh_loop - -.reh_stack_looks_ok: - movl %fs:0x0, %esp - - // Return to the 'front-end' for this function - popl %fs:0x0 - movl %ebp, %esp - popl %ebp - ret - - -#define REP_ERECORD 0x04 -#define REP_RFRAME 0x08 -#define REP_CONTEXT 0x0C -#define REP_DCONTEXT 0x10 - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// This exception handler protects the exception handling -// mechanism by detecting nested exceptions. -_RtlpExceptionProtector: - movl $ExceptionContinueSearch, %eax - movl REP_ERECORD(%esp), %ecx - testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) - jnz .rep_end - - // Unwinding is not taking place, so return ExceptionNestedException - - // Set DispatcherContext field to the exception registration for the - // exception handler that executed when a nested exception occurred - movl REP_DCONTEXT(%esp), %ecx - movl REP_RFRAME(%esp), %eax - movl %eax, (%ecx) - movl $ExceptionNestedException, %eax - -.rep_end: - ret - - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// Front-end -_RtlpExecuteHandlerForException: - movl $_RtlpExceptionProtector, %edx - jmp _RtlpExecuteHandler - - -#define RUP_ERECORD 0x04 -#define RUP_RFRAME 0x08 -#define RUP_CONTEXT 0x0C -#define RUP_DCONTEXT 0x10 - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -// Notes: -// This exception handler protects the exception handling -// mechanism by detecting collided unwinds. -_RtlpUnwindProtector: - movl $ExceptionContinueSearch, %eax - movl %ecx, RUP_ERECORD(%esp) - testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) - jz .rup_end - - // Unwinding is taking place, so return ExceptionCollidedUnwind - - movl RUP_RFRAME(%esp), %ecx - movl RUP_DCONTEXT(%esp), %edx - - // Set DispatcherContext field to the exception registration for the - // exception handler that executed when a collision occurred - movl RUP_RFRAME(%ecx), %eax - movl %eax, (%edx) - movl $ExceptionCollidedUnwind, %eax - -.rup_end: - ret - - -// Parameters: -// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord -// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame -// [ESP+0Ch] - PCONTEXT Context -// [ESP+10h] - PVOID DispatcherContext -// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler -// Registers: -// None -// Returns: -// EXCEPTION_DISPOSITION -_RtlpExecuteHandlerForUnwind: - movl $_RtlpUnwindProtector, %edx - jmp _RtlpExecuteHandler +/* $Id: except.s,v 1.5 2004/06/27 04:08:57 royce Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Kernel-mode exception support for IA-32 + * FILE: ntoskrnl/rtl/i386/except.s + * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) + * NOTES: This file is shared with lib/ntdll/rtl/i386/except.s. + * Please keep them in sync. + */ + +#define EXCEPTION_UNWINDING 0x02 + +#define EREC_FLAGS 0x04 + +#define ExceptionContinueExecution 0 +#define ExceptionContinueSearch 1 +#define ExceptionNestedException 2 +#define ExceptionCollidedUnwind 3 + +.globl _RtlpExecuteHandlerForException +.globl _RtlpExecuteHandlerForUnwind + +#define CONTEXT_FLAGS 0x00 +#define CONTEXT_SEGGS 0x8C +#define CONTEXT_SEGFS 0x90 +#define CONTEXT_SEGES 0x94 +#define CONTEXT_SEGDS 0x98 +#define CONTEXT_EDI 0x9C +#define CONTEXT_ESI 0xA0 +#define CONTEXT_EBX 0xA4 +#define CONTEXT_EDX 0xA8 +#define CONTEXT_ECX 0xAC +#define CONTEXT_EAX 0xB0 +#define CONTEXT_EBP 0xB4 +#define CONTEXT_EIP 0xB8 +#define CONTEXT_SEGCS 0xBC +#define CONTEXT_EFLAGS 0xC0 +#define CONTEXT_ESP 0xC4 +#define CONTEXT_SEGSS 0xC8 + + +#define RCC_CONTEXT 0x08 + +// EAX = value to print +_do_debug: + pushal + pushl %eax + call _AsmDebug@4 + popal + ret + +#ifndef __NTOSKRNL__ + +// +// VOID +// RtlpCaptureContext(PCONTEXT pContext); +// +// Parameters: +// [ESP+08h] - PCONTEXT_X86 pContext +// Registers: +// None +// Returns: +// Nothing +// Notes: +// Grabs the current CPU context. +.globl _RtlpCaptureContext +_RtlpCaptureContext: + pushl %ebp + movl %esp, %ebp + movl RCC_CONTEXT(%ebp), %edx // EDX = Address of context structure + + cld + pushf + pop %eax + movl %eax, CONTEXT_EFLAGS(%edx) + xorl %eax, %eax + movl %eax, CONTEXT_EAX(%edx) + movl %eax, CONTEXT_EBX(%edx) + movl %eax, CONTEXT_ECX(%edx) + movl %eax, CONTEXT_EDX(%edx) + movl %eax, CONTEXT_ESI(%edx) + movl %eax, CONTEXT_EDI(%edx) + movl %cs, %eax + movl %eax, CONTEXT_SEGCS(%edx) + movl %ds, %eax + movl %eax, CONTEXT_SEGDS(%edx) + movl %es, %eax + movl %eax, CONTEXT_SEGES(%edx) + movl %fs, %eax + movl %eax, CONTEXT_SEGFS(%edx) + movl %gs, %eax + movl %eax, CONTEXT_SEGGS(%edx) + movl %ss, %eax + movl %eax, CONTEXT_SEGSS(%edx) + + // + // STACK LAYOUT: - (ESP to put in context structure) + // - RETURN ADDRESS OF CALLER OF CALLER + // - EBP OF CALLER OF CALLER + // ... + // - RETURN ADDRESS OF CALLER + // - EBP OF CALLER + // ... + // + + // Get return address of the caller of the caller of this function + movl %ebp, %ebx + //movl 4(%ebx), %eax // EAX = return address of caller + movl (%ebx), %ebx // EBX = EBP of caller + + movl 4(%ebx), %eax // EAX = return address of caller of caller + movl (%ebx), %ebx // EBX = EBP of caller of caller + + movl %eax, CONTEXT_EIP(%edx) // EIP = return address of caller of caller + movl %ebx, CONTEXT_EBP(%edx) // EBP = EBP of caller of caller + addl $8, %ebx + movl %ebx, CONTEXT_ESP(%edx) // ESP = EBP of caller of caller + 8 + + movl %ebp, %esp + popl %ebp + ret + +#endif /* !__NTOSKRNL__ */ + +#define REH_ERECORD 0x08 +#define REH_RFRAME 0x0C +#define REH_CONTEXT 0x10 +#define REH_DCONTEXT 0x14 +#define REH_EROUTINE 0x18 + +// Parameters: +// None +// Registers: +// [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord +// [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame +// [EBP+10h] - PVOID Context +// [EBP+14h] - PVOID DispatcherContext +// [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine +// EDX - Address of protecting exception handler +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Setup the protecting exception handler and call the exception +// handler in the right context. +_RtlpExecuteHandler: + pushl %ebp + movl %esp, %ebp + pushl REH_RFRAME(%ebp) + + pushl %edx + pushl %fs:0x0 + movl %esp, %fs:0x0 + + // Prepare to call the exception handler + pushl REH_DCONTEXT(%ebp) + pushl REH_CONTEXT(%ebp) + pushl REH_RFRAME(%ebp) + pushl REH_ERECORD(%ebp) + + // Now call the exception handler + movl REH_EROUTINE(%ebp), %eax + call *%eax + + cmpl $-1, %fs:0x0 + jne .reh_stack_looks_ok + + // This should not happen + pushl 0 + pushl 0 + pushl 0 + pushl 0 + call _RtlAssert@16 + +.reh_loop: + jmp .reh_loop + +.reh_stack_looks_ok: + movl %fs:0x0, %esp + + // Return to the 'front-end' for this function + popl %fs:0x0 + movl %ebp, %esp + popl %ebp + ret + + +#define REP_ERECORD 0x04 +#define REP_RFRAME 0x08 +#define REP_CONTEXT 0x0C +#define REP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting nested exceptions. +_RtlpExceptionProtector: + movl $ExceptionContinueSearch, %eax + movl REP_ERECORD(%esp), %ecx + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jnz .rep_end + + // Unwinding is not taking place, so return ExceptionNestedException + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a nested exception occurred + movl REP_DCONTEXT(%esp), %ecx + movl REP_RFRAME(%esp), %eax + movl %eax, (%ecx) + movl $ExceptionNestedException, %eax + +.rep_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// Front-end +_RtlpExecuteHandlerForException: + movl $_RtlpExceptionProtector, %edx + jmp _RtlpExecuteHandler + + +#define RUP_ERECORD 0x04 +#define RUP_RFRAME 0x08 +#define RUP_CONTEXT 0x0C +#define RUP_DCONTEXT 0x10 + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +// Notes: +// This exception handler protects the exception handling +// mechanism by detecting collided unwinds. +_RtlpUnwindProtector: + movl $ExceptionContinueSearch, %eax + movl %ecx, RUP_ERECORD(%esp) + testl $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx) + jz .rup_end + + // Unwinding is taking place, so return ExceptionCollidedUnwind + + movl RUP_RFRAME(%esp), %ecx + movl RUP_DCONTEXT(%esp), %edx + + // Set DispatcherContext field to the exception registration for the + // exception handler that executed when a collision occurred + movl RUP_RFRAME(%ecx), %eax + movl %eax, (%edx) + movl $ExceptionCollidedUnwind, %eax + +.rup_end: + ret + + +// Parameters: +// [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord +// [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame +// [ESP+0Ch] - PCONTEXT Context +// [ESP+10h] - PVOID DispatcherContext +// [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler +// Registers: +// None +// Returns: +// EXCEPTION_DISPOSITION +_RtlpExecuteHandlerForUnwind: + movl $_RtlpUnwindProtector, %edx + jmp _RtlpExecuteHandler From 629da60934d53545007a83988799935f5008315c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 27 Jun 2004 05:38:54 +0000 Subject: [PATCH 104/356] Removed Named Arguments for non-public APIs and added explanations/sources for non-GNU IFS APIs. svn path=/trunk/; revision=9898 --- reactos/include/ddk/fsfuncs.h | 61 ++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/reactos/include/ddk/fsfuncs.h b/reactos/include/ddk/fsfuncs.h index 4907134f372..251ee7c92a2 100644 --- a/reactos/include/ddk/fsfuncs.h +++ b/reactos/include/ddk/fsfuncs.h @@ -1,10 +1,56 @@ #ifndef __INCLUDE_DDK_FSFUNCS_H #define __INCLUDE_DDK_FSFUNCS_H -/* $Id: fsfuncs.h,v 1.23 2004/06/23 00:41:55 ion Exp $ */ +/* $Id: fsfuncs.h,v 1.24 2004/06/27 05:38:54 ion Exp $ */ #define FlagOn(x,f) ((x) & (f)) #include +/* Some comments on the Prototypes that aren't in the GNU IFS: + +The following come from alternate sources, or guessed from documentation: +FsRtlNotifyFullChangeDirectory GOOGLE GROUPS +FsRtlIsPagingFile OSR DOCUMENTATION +FsRtlAcquireFileExclusive (GUESS: The function takes a single parameter. The function name is "AcquireFile". Logical assumption says this is a File Object. NTFSD ML Post confirms.) +FsRtlReleaseFile (GUESS: The function takes a single parameter. The function name is "AcquireFile". Logical assumption says this is a File Object. NTFSD ML Post confirms.) +FsRtlMdlReadCompleteDev (FsRtlMdlReadComplete is on GNU IFS. The Dev Suffix simply means an extra PDEVICE_OBJECT param) +FsRtlMdlReadDev (FsRtlMdlReadDev is on GNU IFS. The Dev Suffix simply means an extra PDEVICE_OBJECT param) +FsRtlMdlWriteCompleteDev FsRtlMdlWriteCompleteDev is on GNU IFS. The Dev Suffix simply means an extra PDEVICE_OBJECT param) +FsRtlPrepareMdlWrite (Compared with CcMdlWrite, which is already documented) +FsRtlPrepareMdlWriteDev (Same as above, and add a pointer to device object (Dev suffix) +FsRtlGetNextMcbEntry(FsRtlGetNextLargeMcbEntry is documented and uses LONGLONGs. Logical assumption that this one only uses LONGS and non-large MCB (Documented)) + +Stream Context. Going along with public OSR documenttion: + +FsRtlInsertPerStreamContext: +"This call is used by the file system filter driver to associate a given context block +(allocated by the filter and initialized using FsRtlInitPerStreamContext) with the stream associated with the given file object." +Notice we are told "given context block...initialized using FsRtlInitPerStreamContext". This function description tells us: +" provide space for the FSRTL_PER_STREAM_CONTEXT block in the filter driver’s context structure" +Therefore, one of the parameters is PFSRTL_PER_STREAM_CONTEXT. +"with the stream associated with the given file object." The OSR Documentations then mentions: +"Tracking per-file (or “per stream”) context information in FSRTL_ADVANCED_FCB_HEADER" +So we are associating a FSRTL_PER_STREAM_CONTEXT block with the FSRTL_ADVANCED_FCB_HEADER associated with the file object. +FSRTL_ADVANCED_FCB_HEADER is documented by a search through Google. +FSRTL_PER_STREAM_CONTEXT is *NOT* documented anywhere else then in the IFS, so it has been removed. + +FsRtlLookupPerStreamContextInternal +"FsRtlLookupPerStreamContext – this call is used by the file system filter driver to locate a given context +block that is associated with the file object. Typically, a file system filter driver will identify its +own context block using unique OwnerId and InstanceId parameters when creating the context block and subsequently +when locating the associated information." +OSR tells us here that the last two parameters are OwnerId and InstanceId. It also says it will find a given context block, +so there's our Return Value. (Although, not being documented, we must put PVOID). It looks into a file object's stream, so we +probably need that FCB header again. + +FsRtlRemovePerStreamContext +OSR is vague, so all we know for sure is that we are sending an FCB Header. The return value isn't NTSTATUS, but seems to be a +pointer. We don't know what the two other parameters are, so they have been marked as unknown. + +FsRtlTeardownPerStreamContexts +OSR doens't tell a lot, but we only have one parameter. It must be the FCB Header. Furthermore, the CVS of Captive implements +this function as a stub, and confirms the theory. + +*/ VOID STDCALL @@ -424,6 +470,7 @@ FsRtlMdlRead ( OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus ); + BOOLEAN STDCALL FsRtlMdlReadComplete ( @@ -584,6 +631,7 @@ FsRtlPrepareMdlWrite ( OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus ); + BOOLEAN STDCALL FsRtlPrepareMdlWriteDev ( @@ -613,6 +661,7 @@ FsRtlPostPagingFileStackOverflow ( DWORD Unknown1, DWORD Unknown2 ); + VOID STDCALL FsRtlPostStackOverflow ( @@ -620,6 +669,7 @@ FsRtlPostStackOverflow ( DWORD Unknown1, DWORD Unknown2 ); + BOOLEAN STDCALL FsRtlPrivateLock ( @@ -636,6 +686,7 @@ FsRtlPrivateLock ( IN PVOID Context, IN BOOLEAN AlreadySynchronized ); + NTSTATUS STDCALL FsRtlProcessFileLock ( @@ -647,8 +698,8 @@ FsRtlProcessFileLock ( STDCALL NTSTATUS FsRtlRegisterFileSystemFilterCallbacks ( - IN struct _DRIVER_OBJECT *FilterDriverObject, - IN PFS_FILTER_CALLBACKS Callbacks + IN PVOID Unknown, + IN PVOID Unknown ); NTSTATUS STDCALL @@ -676,8 +727,8 @@ STDCALL PFSRTL_PER_STREAM_CONTEXT FsRtlRemovePerStreamContext ( IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL + IN PVOID Unknown1 OPTIONAL, + IN PVOID Unknown2 OPTIONAL ); STDCALL From 2bb2c4aae8c736f7eadebac12f636cece61141e8 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 07:56:44 +0000 Subject: [PATCH 105/356] - Replaced the old default mode algortihm with video mode list sorting. - Added check for video mode memory model since we don't support anything but Direct Color and Packed Pixel modes. - More work in order to support VBE 1.2. - Fixed retun values in VBEInitialize. svn path=/trunk/; revision=9899 --- reactos/drivers/video/miniport/vbe/vbemp.c | 139 +++++++++++++++------ reactos/drivers/video/miniport/vbe/vbemp.h | 5 +- 2 files changed, 104 insertions(+), 40 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 07f881f5e11..6992ce6df96 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -68,6 +68,85 @@ VBEFindAdapter( return NO_ERROR; } +/* + * VBESortModesCallback + * + * Helper function for sorting video mode list. + */ + +static int +VBESortModesCallback(PVBE_MODEINFO VbeModeInfoA, PVBE_MODEINFO VbeModeInfoB) +{ + DPRINT(("VBESortModesCallback: %dx%dx%d / %dx%dx%d\n", + VbeModeInfoA->XResolution, VbeModeInfoA->YResolution, + VbeModeInfoA->BitsPerPixel, + VbeModeInfoB->XResolution, VbeModeInfoB->YResolution, + VbeModeInfoB->BitsPerPixel)); + + /* + * FIXME: Until some reasonable method for changing video modes will + * be available we favor more bits per pixel. It should be changed + * later. + */ + if (VbeModeInfoA->BitsPerPixel < VbeModeInfoB->BitsPerPixel) return 1; + if (VbeModeInfoA->BitsPerPixel > VbeModeInfoB->BitsPerPixel) return -1; + if (VbeModeInfoA->XResolution < VbeModeInfoB->XResolution) return -1; + if (VbeModeInfoA->XResolution > VbeModeInfoB->XResolution) return 1; + if (VbeModeInfoA->YResolution < VbeModeInfoB->YResolution) return -1; + if (VbeModeInfoA->YResolution > VbeModeInfoB->YResolution) return 1; + return 0; +} + +/* + * VBESortModes + * + * Simple function for sorting the video mode list. Uses bubble sort. + */ + +VOID FASTCALL +VBESortModes(PVBE_DEVICE_EXTENSION DeviceExtension) +{ + BOOLEAN Finished = FALSE; + ULONG Pos; + int Result; + VBE_MODEINFO TempModeInfo; + WORD TempModeNumber; + + while (!Finished) + { + Finished = TRUE; + for (Pos = 0; Pos < DeviceExtension->ModeCount - 1; Pos++) + { + Result = VBESortModesCallback( + DeviceExtension->ModeInfo + Pos, + DeviceExtension->ModeInfo + Pos + 1); + if (Result > 0) + { + Finished = FALSE; + + VideoPortMoveMemory( + &TempModeInfo, + DeviceExtension->ModeInfo + Pos, + sizeof(VBE_MODEINFO)); + TempModeNumber = DeviceExtension->ModeNumbers[Pos]; + + VideoPortMoveMemory( + DeviceExtension->ModeInfo + Pos, + DeviceExtension->ModeInfo + Pos + 1, + sizeof(VBE_MODEINFO)); + DeviceExtension->ModeNumbers[Pos] = + DeviceExtension->ModeNumbers[Pos + 1]; + + VideoPortMoveMemory( + DeviceExtension->ModeInfo + Pos + 1, + &TempModeInfo, + sizeof(VBE_MODEINFO)); + DeviceExtension->ModeNumbers[Pos + 1] = TempModeNumber; + } + } + } +} + /* * VBEInitialize * @@ -93,9 +172,6 @@ VBEInitialize(PVOID HwDeviceExtension) USHORT ModeTemp; ULONG CurrentMode; PVBE_MODEINFO VbeModeInfo; - VBE_MODEINFO TempVbeModeInfo; - WORD TempVbeModeNumber; - WORD DefaultMode; /* * Get the Int 10 interface that we will use for allocating real @@ -112,7 +188,7 @@ VBEInitialize(PVOID HwDeviceExtension) if (Status != NO_ERROR) { DPRINT(("Failed to get Int 10 service functions (Status %x)\n", Status)); - return 0; + return FALSE; } /* @@ -131,7 +207,7 @@ VBEInitialize(PVOID HwDeviceExtension) if (Status != NO_ERROR) { DPRINT(("Failed to allocate virtual memory (Status %x)\n", Status)); - return 0; + return FALSE; } /* @@ -174,27 +250,15 @@ VBEInitialize(PVOID HwDeviceExtension) #endif { DPRINT(("VBE BIOS present, but incompatible version.\n")); - return ERROR_DEV_NOT_EXIST; + return FALSE; } } else { DPRINT(("No VBE BIOS found.\n")); - return ERROR_DEV_NOT_EXIST; + return FALSE; } -#ifdef VBE12_SUPPORT - if (VBEDeviceExtension->VbeInfo.Version < 0x200) - { - /* - * FIXME: Build a mode list here based on the total memory - * available on the video card and the video mode tables - * from the VBE specification. - */ - return ERROR_NOT_SUPPORTED; - } -#endif - /* * Build a mode list here that can be later used by * IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES and IOCTL_VIDEO_QUERY_AVAIL_MODES @@ -236,7 +300,7 @@ VBEInitialize(PVOID HwDeviceExtension) * Get the actual mode infos. */ - for (CurrentMode = 0, SuitableModeCount = 0, DefaultMode = 0; + for (CurrentMode = 0, SuitableModeCount = 0; CurrentMode < ModeCount; CurrentMode++) { @@ -272,16 +336,21 @@ VBEInitialize(PVOID HwDeviceExtension) if (BiosRegisters.Eax == VBE_SUCCESS && VbeModeInfo->XResolution >= 640 && VbeModeInfo->YResolution >= 480 && - (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)) + (VbeModeInfo->MemoryModel == VBE_MEMORYMODEL_PACKEDPIXEL || + VbeModeInfo->MemoryModel == VBE_MEMORYMODEL_DIRECTCOLOR)) { - VBEDeviceExtension->ModeNumbers[SuitableModeCount] = ModeTemp | 0x4000; - if (VbeModeInfo->XResolution == 640 && - VbeModeInfo->YResolution == 480 && - VbeModeInfo->BitsPerPixel == 32) + if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR) { - DefaultMode = SuitableModeCount; + VBEDeviceExtension->ModeNumbers[SuitableModeCount] = ModeTemp | 0x4000; + SuitableModeCount++; } - SuitableModeCount++; +#ifdef VBE12_SUPPORT + else + { + VBEDeviceExtension->ModeNumbers[SuitableModeCount] = ModeTemp; + SuitableModeCount++; + } +#endif } } @@ -291,21 +360,13 @@ VBEInitialize(PVOID HwDeviceExtension) return FALSE; } + VBEDeviceExtension->ModeCount = SuitableModeCount; + /* - * Exchange the default mode so it's at the first place in list. + * Sort the video mode list according to resolution and bits per pixel. */ - VideoPortMoveMemory(&TempVbeModeInfo, VBEDeviceExtension->ModeInfo, - sizeof(VBE_MODEINFO)); - VideoPortMoveMemory(VBEDeviceExtension->ModeInfo, VBEDeviceExtension->ModeInfo + DefaultMode, - sizeof(VBE_MODEINFO)); - VideoPortMoveMemory(VBEDeviceExtension->ModeInfo + DefaultMode, &TempVbeModeInfo, - sizeof(VBE_MODEINFO)); - TempVbeModeNumber = VBEDeviceExtension->ModeNumbers[0]; - VBEDeviceExtension->ModeNumbers[0] = VBEDeviceExtension->ModeNumbers[DefaultMode]; - VBEDeviceExtension->ModeNumbers[DefaultMode] = TempVbeModeNumber; - - VBEDeviceExtension->ModeCount = SuitableModeCount; + VBESortModes(VBEDeviceExtension); /* * Print the supported video modes when DBG is set. diff --git a/reactos/drivers/video/miniport/vbe/vbemp.h b/reactos/drivers/video/miniport/vbe/vbemp.h index cae4716e10f..b3ce9373458 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.h +++ b/reactos/drivers/video/miniport/vbe/vbemp.h @@ -73,11 +73,14 @@ #define VBE_DISPLAY_DATA_CHANNEL 0x4F14 /* - * VBE Video Mode Information Attributes + * VBE Video Mode Information Definitions */ #define VBE_MODEATTR_LINEAR 0x80 +#define VBE_MEMORYMODEL_PACKEDPIXEL 0x04 +#define VBE_MEMORYMODEL_DIRECTCOLOR 0x06 + /* * VBE Return Codes */ From 308a04ade4883c72eeb43127a081c1d33e67c0b5 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 27 Jun 2004 10:16:59 +0000 Subject: [PATCH 106/356] don't crash if requested process couldn't be found svn path=/trunk/; revision=9900 --- reactos/subsys/csrss/api/process.c | 7 ++++++- reactos/subsys/csrss/api/wapi.c | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/csrss/api/process.c b/reactos/subsys/csrss/api/process.c index 75c5596cde1..48fd6c3c995 100644 --- a/reactos/subsys/csrss/api/process.c +++ b/reactos/subsys/csrss/api/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.33 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: process.c,v 1.34 2004/06/27 10:16:59 weiden Exp $ * * reactos/subsys/csrss/api/process.c * @@ -411,6 +411,11 @@ CSR_API(CsrDuplicateHandle) Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; ProcessData = CsrGetProcessData(Request->Data.DuplicateHandleRequest.ProcessId); + if (ProcessData == NULL) + { + DPRINT1("CsrGetProcessData() failed for process 0x%x, unable to dublicate handle\n", Request->Data.DuplicateHandleRequest.ProcessId); + return STATUS_INVALID_HANDLE; + } Reply->Status = CsrGetObject(ProcessData, Request->Data.DuplicateHandleRequest.Handle, &Object); if (! NT_SUCCESS(Reply->Status)) { diff --git a/reactos/subsys/csrss/api/wapi.c b/reactos/subsys/csrss/api/wapi.c index 00a2a76514f..15d7ba00eae 100644 --- a/reactos/subsys/csrss/api/wapi.c +++ b/reactos/subsys/csrss/api/wapi.c @@ -1,4 +1,4 @@ -/* $Id: wapi.c,v 1.34 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: wapi.c,v 1.35 2004/06/27 10:16:59 weiden Exp $ * * reactos/subsys/csrss/api/wapi.c * @@ -135,7 +135,12 @@ Thread_Api2(HANDLE ServerPort) Reply = (PCSRSS_API_REPLY)&LpcReply; ProcessData = CsrGetProcessData((ULONG)LpcRequest.Header.ClientId.UniqueProcess); - + if (ProcessData == NULL) + { + DPRINT1("CSR: Unable to find process data for process 0x%x\n", (ULONG)LpcRequest.Header.ClientId.UniqueProcess); + NtClose(ServerPort); + continue; + } CsrApiCallHandler(ProcessData, Request, Reply); } } @@ -182,6 +187,12 @@ void Thread_Api(PVOID PortHandle) } ProcessData = CsrGetProcessData((ULONG)Request.Header.ClientId.UniqueProcess); + if (ProcessData == NULL) + { + DPRINT1("CSR: Unable to find process data for process 0x%x\n", (ULONG)Request.Header.ClientId.UniqueProcess); + NtClose(ServerPort); + continue; + } ProcessData->CsrSectionViewBase = LpcRead.ViewBase; ProcessData->CsrSectionViewSize = LpcRead.ViewSize; From 6f6c0f76ef41a1be46cce7cb5ad831b68c169f67 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 11:23:57 +0000 Subject: [PATCH 107/356] - Fixed compilation. svn path=/trunk/; revision=9901 --- reactos/include/ddk/fsfuncs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/include/ddk/fsfuncs.h b/reactos/include/ddk/fsfuncs.h index 251ee7c92a2..9a3fd3fbcfe 100644 --- a/reactos/include/ddk/fsfuncs.h +++ b/reactos/include/ddk/fsfuncs.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_DDK_FSFUNCS_H #define __INCLUDE_DDK_FSFUNCS_H -/* $Id: fsfuncs.h,v 1.24 2004/06/27 05:38:54 ion Exp $ */ +/* $Id: fsfuncs.h,v 1.25 2004/06/27 11:23:57 navaraf Exp $ */ #define FlagOn(x,f) ((x) & (f)) #include @@ -698,8 +698,8 @@ FsRtlProcessFileLock ( STDCALL NTSTATUS FsRtlRegisterFileSystemFilterCallbacks ( - IN PVOID Unknown, - IN PVOID Unknown + IN PVOID Unknown1, + IN PVOID Unknown2 ); NTSTATUS STDCALL From 625c7953e54f02432b883e5aa5884434031d7169 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 11:23:57 +0000 Subject: [PATCH 108/356] - Better handling of error cases in font handling. svn path=/trunk/; revision=9902 --- reactos/subsys/win32k/objects/text.c | 128 +++++++++++++++------------ 1 file changed, 70 insertions(+), 58 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index d9fe42fa4b4..c0515c2637c 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.99 2004/06/23 15:30:21 weiden Exp $ */ +/* $Id: text.c,v 1.100 2004/06/27 11:23:57 navaraf Exp $ */ #include #include @@ -1579,59 +1579,6 @@ NtGdiExtTextOut( XStart = Start.x + dc->w.DCOrgX; YStart = Start.y + dc->w.DCOrgY; - TextObj = TEXTOBJ_LockText(dc->w.hFont); - - if (!NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, &FontObj, &FontGDI))) - { - goto fail; - } - - face = FontGDI->face; - if (face->charmap == NULL) - { - DPRINT("WARNING: No charmap selected!\n"); - DPRINT("This font face has %d charmaps\n", face->num_charmaps); - - for (n = 0; n < face->num_charmaps; n++) - { - charmap = face->charmaps[n]; - DPRINT("found charmap encoding: %u\n", charmap->encoding); - if (charmap->encoding != 0) - { - found = charmap; - break; - } - } - if (!found) - DPRINT1("WARNING: Could not find desired charmap!\n"); - IntLockFreeType; - error = FT_Set_Charmap(face, found); - IntUnLockFreeType; - if (error) - DPRINT1("WARNING: Could not set the charmap!\n"); - } - - Render = IntIsFontRenderingEnabled(); - if (Render) - RenderMode = IntGetFontRenderMode(&TextObj->logfont); - else - RenderMode = FT_RENDER_MODE_MONO; - - IntLockFreeType; - error = FT_Set_Pixel_Sizes( - face, - /* FIXME should set character height if neg */ - (TextObj->logfont.lfHeight < 0 ? - - TextObj->logfont.lfHeight : - TextObj->logfont.lfHeight), - TextObj->logfont.lfWidth); - IntUnLockFreeType; - if (error) - { - DPRINT1("Error in setting pixel sizes: %u\n", error); - goto fail; - } - /* Create the brushes */ PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); if ( !PalDestGDI ) @@ -1695,6 +1642,59 @@ NtGdiExtTextOut( } } + TextObj = TEXTOBJ_LockText(dc->w.hFont); + + if (!NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, &FontObj, &FontGDI))) + { + goto fail; + } + + face = FontGDI->face; + if (face->charmap == NULL) + { + DPRINT("WARNING: No charmap selected!\n"); + DPRINT("This font face has %d charmaps\n", face->num_charmaps); + + for (n = 0; n < face->num_charmaps; n++) + { + charmap = face->charmaps[n]; + DPRINT("found charmap encoding: %u\n", charmap->encoding); + if (charmap->encoding != 0) + { + found = charmap; + break; + } + } + if (!found) + DPRINT1("WARNING: Could not find desired charmap!\n"); + IntLockFreeType; + error = FT_Set_Charmap(face, found); + IntUnLockFreeType; + if (error) + DPRINT1("WARNING: Could not set the charmap!\n"); + } + + Render = IntIsFontRenderingEnabled(); + if (Render) + RenderMode = IntGetFontRenderMode(&TextObj->logfont); + else + RenderMode = FT_RENDER_MODE_MONO; + + IntLockFreeType; + error = FT_Set_Pixel_Sizes( + face, + /* FIXME should set character height if neg */ + (TextObj->logfont.lfHeight < 0 ? + - TextObj->logfont.lfHeight : + TextObj->logfont.lfHeight), + TextObj->logfont.lfWidth); + IntUnLockFreeType; + if (error) + { + DPRINT1("Error in setting pixel sizes: %u\n", error); + goto fail; + } + /* * Process the vertical alignment and determine the yoff. */ @@ -1994,6 +1994,7 @@ NtGdiGetCharWidth32(HDC hDC, FT_Face face; FT_CharMap charmap, found = NULL; UINT i, glyph_index, BufferSize; + HFONT hFont; if (LastChar < FirstChar) { @@ -2016,10 +2017,17 @@ NtGdiGetCharWidth32(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } - TextObj = TEXTOBJ_LockText(dc->w.hFont); + TextObj = TEXTOBJ_LockText(hFont); + hFont = dc->w.hFont; DC_UnlockDc(hDC); - GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI); + if (!NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI))) + { + ExFreePool(SafeBuffer); + SetLastWin32Error(ERROR_INVALID_HANDLE); + TEXTOBJ_UnlockText(hFont); + return FALSE; + } face = FontGDI->face; if (face->charmap == NULL) @@ -2062,7 +2070,7 @@ NtGdiGetCharWidth32(HDC hDC, SafeBuffer[i - FirstChar] = face->glyph->advance.x >> 6; } IntUnLockFreeType; - TEXTOBJ_UnlockText(dc->w.hFont); + TEXTOBJ_UnlockText(hFont); MmCopyToCaller(Buffer, SafeBuffer, BufferSize); ExFreePool(SafeBuffer); return TRUE; @@ -2161,7 +2169,11 @@ TextIntGetTextExtentPoint(HDC hDC, FT_CharMap charmap, found = NULL; BOOL use_kerning; - GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI); + if (!NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI))) + { + return FALSE; + } + face = FontGDI->face; if (NULL != Fit) { From 13d400fbd2c147fff8995b50425d03bd2d70e468 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 11:24:06 +0000 Subject: [PATCH 109/356] - Better handling of error cases in DrawTextW. svn path=/trunk/; revision=9903 --- reactos/lib/user32/windows/font.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/reactos/lib/user32/windows/font.c b/reactos/lib/user32/windows/font.c index 544f9802014..a18f3091b1b 100644 --- a/reactos/lib/user32/windows/font.c +++ b/reactos/lib/user32/windows/font.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: font.c,v 1.9 2003/12/21 16:49:41 navaraf Exp $ +/* $Id: font.c,v 1.10 2004/06/27 11:24:06 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -97,8 +97,10 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr, else { TEXTMETRICA tm; - GetTextMetricsA( hdc, &tm ); - defWidth = 8 * tm.tmAveCharWidth; + if (GetTextMetricsA( hdc, &tm )) + defWidth = 8 * tm.tmAveCharWidth; + else + defWidth = 0; if (cTabStops == 1) cTabStops = 0; /* on negative *lpTabPos */ } @@ -742,7 +744,7 @@ static const WCHAR *TEXT_NextLineW( HDC hdc, const WCHAR *str, int *count, { int i = 0, j = 0; int plen = 0; - SIZE size; + SIZE size = {0, 0}; int maxl = *len; int seg_i, seg_count, seg_j; int max_seg_width; @@ -950,7 +952,7 @@ static void TEXT_DrawUnderscore (HDC hdc, int x, int y, const WCHAR *str, int of { int prefix_x; int prefix_end; - SIZE size; + SIZE size = {0, 0}; HPEN hpen; HPEN oldPen; From 3bd4ef3363f38e05514cd23cda575699db908601 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 11:24:43 +0000 Subject: [PATCH 110/356] - Better handling of error cases when no fonts are present in the system. svn path=/trunk/; revision=9904 --- reactos/lib/comctl32/listview.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/comctl32/listview.c b/reactos/lib/comctl32/listview.c index 8914a44abd2..6799434d182 100644 --- a/reactos/lib/comctl32/listview.c +++ b/reactos/lib/comctl32/listview.c @@ -2024,7 +2024,8 @@ calc_label: infoPtr->iconSize.cy + ICON_BOTTOM_PADDING; Label.right = Label.left + labelSize.cx; Label.bottom = Label.top + infoPtr->nItemHeight; - if (!oversizedBox && labelSize.cy > infoPtr->ntmHeight) + if (!oversizedBox && labelSize.cy > infoPtr->ntmHeight && + infoPtr->ntmHeight) { labelSize.cy = min(Box.bottom - Label.top, labelSize.cy); labelSize.cy /= infoPtr->ntmHeight; @@ -9516,7 +9517,8 @@ static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style, hOldFont = SelectObject(hdc, infoPtr->hFont); /*Get String Length in pixels */ - GetTextExtentPoint32W(hdc, text, lstrlenW(text), &sz); + if(!GetTextExtentPoint32W(hdc, text, lstrlenW(text), &sz)) + sz.cx = 0; /*Add Extra spacing for the next character */ GetTextMetricsW(hdc, &textMetric); From fbe9f7f64f32fb2735db9019ae3e58081d21b1ac Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 27 Jun 2004 12:21:14 +0000 Subject: [PATCH 111/356] Implement and use LdrProcessRelocationBlock(). svn path=/trunk/; revision=9905 --- reactos/include/ntdll/ldr.h | 6 ++ reactos/lib/ntdll/def/ntdll.def | 4 +- reactos/lib/ntdll/def/ntdll.edf | 4 +- reactos/lib/ntdll/ldr/utils.c | 114 +++++++++++++++++++++----------- 4 files changed, 84 insertions(+), 44 deletions(-) diff --git a/reactos/include/ntdll/ldr.h b/reactos/include/ntdll/ldr.h index 8075d53b200..e4a05e109f7 100644 --- a/reactos/include/ntdll/ldr.h +++ b/reactos/include/ntdll/ldr.h @@ -126,6 +126,12 @@ LdrLoadDll(IN PWSTR SearchPath OPTIONAL, IN PUNICODE_STRING Name, OUT PVOID *BaseAddress OPTIONAL); +PIMAGE_BASE_RELOCATION STDCALL +LdrProcessRelocationBlock(IN PVOID Address, + IN USHORT Count, + IN PUSHORT TypeOffset, + IN ULONG_PTR Delta); + NTSTATUS STDCALL LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, IN PCWSTR ValueName, diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 7f6b2e06a7c..376a3486cdc 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.121 2004/06/13 10:35:52 navaraf Exp $ +; $Id: ntdll.def,v 1.122 2004/06/27 12:21:14 ekohl Exp $ ; ; ReactOS Operating System ; @@ -51,7 +51,7 @@ LdrGetDllHandle@16 LdrGetProcedureAddress@16 LdrInitializeThunk@16 LdrLoadDll@16 -;LdrProcessRelocationBlock@16 +LdrProcessRelocationBlock@16 LdrQueryImageFileExecutionOptions@24 LdrQueryProcessModuleInformation@12 LdrShutdownProcess@0 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index d7c771d57b1..c21b6a89cf4 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.111 2004/06/13 10:35:52 navaraf Exp $ +; $Id: ntdll.edf,v 1.112 2004/06/27 12:21:14 ekohl Exp $ ; ; ReactOS Operating System ; @@ -51,7 +51,7 @@ LdrGetDllHandle=LdrGetDllHandle@16 LdrGetProcedureAddress=LdrGetProcedureAddress@16 LdrInitializeThunk=LdrInitializeThunk@16 LdrLoadDll=LdrLoadDll@16 -;LdrProcessRelocationBlock +LdrProcessRelocationBlock=LdrProcessRelocationBlock@16 LdrQueryImageFileExecutionOptions=LdrQueryImageFileExecutionOptions@24 LdrQueryProcessModuleInformation=LdrQueryProcessModuleInformation@12 LdrShutdownProcess=LdrShutdownProcess@0 diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index e68ef93bcaa..54fe950a1df 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.95 2004/06/26 15:11:14 navaraf Exp $ +/* $Id: utils.c,v 1.96 2004/06/27 12:20:33 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1226,10 +1226,10 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, { PIMAGE_DATA_DIRECTORY RelocationDDir; PIMAGE_BASE_RELOCATION RelocationDir, RelocationEnd; - ULONG Count, ProtectSize, OldProtect, OldProtect2, i; + ULONG Count, ProtectSize, OldProtect, OldProtect2; PVOID Page, ProtectPage, ProtectPage2; - PWORD TypeOffset; - ULONG Delta = (ULONG_PTR)ImageBase - NTHeaders->OptionalHeader.ImageBase; + PUSHORT TypeOffset; + ULONG_PTR Delta; NTSTATUS Status; if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) @@ -1244,19 +1244,21 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, { return STATUS_SUCCESS; } - + ProtectSize = PAGE_SIZE; - RelocationDir = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)ImageBase + + Delta = (ULONG_PTR)ImageBase - NTHeaders->OptionalHeader.ImageBase; + RelocationDir = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)ImageBase + RelocationDDir->VirtualAddress); - RelocationEnd = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)ImageBase + + RelocationEnd = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)ImageBase + RelocationDDir->VirtualAddress + RelocationDDir->Size); + while (RelocationDir < RelocationEnd && RelocationDir->SizeOfBlock > 0) { Count = (RelocationDir->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / - sizeof(WORD); + sizeof(USHORT); Page = ImageBase + RelocationDir->VirtualAddress; - TypeOffset = (PWORD)(RelocationDir + 1); + TypeOffset = (PUSHORT)(RelocationDir + 1); /* Unprotect the page(s) we're about to relocate. */ ProtectPage = Page; @@ -1268,7 +1270,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, if (!NT_SUCCESS(Status)) { DPRINT1("Failed to unprotect relocation target.\n"); - return(Status); + return Status; } if (RelocationDir->VirtualAddress + PAGE_SIZE < @@ -1288,36 +1290,21 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, &ProtectSize, OldProtect, &OldProtect); - return(Status); + return Status; } } - - /* Patch the page. */ - for (i = 0; i < Count; i++) + else { - SHORT Offset = TypeOffset[i] & 0xFFF; - USHORT Type = TypeOffset[i] >> 12; - - switch (Type) - { - case IMAGE_REL_BASED_ABSOLUTE: - break; - case IMAGE_REL_BASED_HIGH: - *(PUSHORT)(Page + Offset) += HIWORD(Delta); - break; - case IMAGE_REL_BASED_LOW: - *(PUSHORT)(Page + Offset) += LOWORD(Delta); - break; - case IMAGE_REL_BASED_HIGHLOW: - *(PULONG)(Page + Offset) += Delta; - break; - case IMAGE_REL_BASED_HIGHADJ: - default: - DPRINT("Unknown/unsupported fixup type %d.\n", type); - return STATUS_UNSUCCESSFUL; - } + ProtectPage2 = NULL; } + RelocationDir = LdrProcessRelocationBlock(Page, + Count, + TypeOffset, + Delta); + if (RelocationDir == NULL) + return STATUS_UNSUCCESSFUL; + /* Restore old page protection. */ NtProtectVirtualMemory(NtCurrentProcess(), &ProtectPage, @@ -1325,8 +1312,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, OldProtect, &OldProtect); - if (RelocationDir->VirtualAddress + PAGE_SIZE < - NTHeaders->OptionalHeader.SizeOfImage) + if (ProtectPage2 != NULL) { NtProtectVirtualMemory(NtCurrentProcess(), &ProtectPage2, @@ -1334,9 +1320,6 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders, OldProtect2, &OldProtect2); } - - RelocationDir = (IMAGE_BASE_RELOCATION*)((ULONG_PTR)RelocationDir + - RelocationDir->SizeOfBlock); } return STATUS_SUCCESS; @@ -3030,4 +3013,55 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, return Status; } + +PIMAGE_BASE_RELOCATION STDCALL +LdrProcessRelocationBlock(IN PVOID Address, + IN USHORT Count, + IN PUSHORT TypeOffset, + IN ULONG_PTR Delta) +{ + SHORT Offset; + USHORT Type; + USHORT i; + PUSHORT ShortPtr; + PULONG LongPtr; + + for (i = 0; i < Count; i++) + { + Offset = *TypeOffset & 0xFFF; + Type = *TypeOffset >> 12; + + switch (Type) + { + case IMAGE_REL_BASED_ABSOLUTE: + break; + + case IMAGE_REL_BASED_HIGH: + ShortPtr = (PUSHORT)(Address + Offset); + *ShortPtr += HIWORD(Delta); + break; + + case IMAGE_REL_BASED_LOW: + ShortPtr = (PUSHORT)(Address + Offset); + *ShortPtr += LOWORD(Delta); + break; + + case IMAGE_REL_BASED_HIGHLOW: + LongPtr = (PULONG)(Address + Offset); + *LongPtr += Delta; + break; + + case IMAGE_REL_BASED_HIGHADJ: + case IMAGE_REL_BASED_MIPS_JMPADDR: + default: + DPRINT1("Unknown/unsupported fixup type %hu.\n", Type); + return NULL; + } + + TypeOffset++; + } + + return (PIMAGE_BASE_RELOCATION)TypeOffset; +} + /* EOF */ From 988f8a5efc8eed9bb41ebab57a8087964470d807 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 27 Jun 2004 12:21:32 +0000 Subject: [PATCH 112/356] revert my previous patch svn path=/trunk/; revision=9906 --- reactos/subsys/csrss/api/process.c | 7 +------ reactos/subsys/csrss/api/wapi.c | 15 ++------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/reactos/subsys/csrss/api/process.c b/reactos/subsys/csrss/api/process.c index 48fd6c3c995..fef95841023 100644 --- a/reactos/subsys/csrss/api/process.c +++ b/reactos/subsys/csrss/api/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.34 2004/06/27 10:16:59 weiden Exp $ +/* $Id: process.c,v 1.35 2004/06/27 12:21:31 weiden Exp $ * * reactos/subsys/csrss/api/process.c * @@ -411,11 +411,6 @@ CSR_API(CsrDuplicateHandle) Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; ProcessData = CsrGetProcessData(Request->Data.DuplicateHandleRequest.ProcessId); - if (ProcessData == NULL) - { - DPRINT1("CsrGetProcessData() failed for process 0x%x, unable to dublicate handle\n", Request->Data.DuplicateHandleRequest.ProcessId); - return STATUS_INVALID_HANDLE; - } Reply->Status = CsrGetObject(ProcessData, Request->Data.DuplicateHandleRequest.Handle, &Object); if (! NT_SUCCESS(Reply->Status)) { diff --git a/reactos/subsys/csrss/api/wapi.c b/reactos/subsys/csrss/api/wapi.c index 15d7ba00eae..f4ec9c88333 100644 --- a/reactos/subsys/csrss/api/wapi.c +++ b/reactos/subsys/csrss/api/wapi.c @@ -1,4 +1,4 @@ -/* $Id: wapi.c,v 1.35 2004/06/27 10:16:59 weiden Exp $ +/* $Id: wapi.c,v 1.36 2004/06/27 12:21:32 weiden Exp $ * * reactos/subsys/csrss/api/wapi.c * @@ -135,12 +135,7 @@ Thread_Api2(HANDLE ServerPort) Reply = (PCSRSS_API_REPLY)&LpcReply; ProcessData = CsrGetProcessData((ULONG)LpcRequest.Header.ClientId.UniqueProcess); - if (ProcessData == NULL) - { - DPRINT1("CSR: Unable to find process data for process 0x%x\n", (ULONG)LpcRequest.Header.ClientId.UniqueProcess); - NtClose(ServerPort); - continue; - } + CsrApiCallHandler(ProcessData, Request, Reply); } } @@ -187,12 +182,6 @@ void Thread_Api(PVOID PortHandle) } ProcessData = CsrGetProcessData((ULONG)Request.Header.ClientId.UniqueProcess); - if (ProcessData == NULL) - { - DPRINT1("CSR: Unable to find process data for process 0x%x\n", (ULONG)Request.Header.ClientId.UniqueProcess); - NtClose(ServerPort); - continue; - } ProcessData->CsrSectionViewBase = LpcRead.ViewBase; ProcessData->CsrSectionViewSize = LpcRead.ViewSize; From f764d79dbb9d25ad37cfc8c37b4f6869587c59d0 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 13:58:05 +0000 Subject: [PATCH 113/356] - Fixed compilation. svn path=/trunk/; revision=9908 --- reactos/ntoskrnl/fs/notify.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/fs/notify.c b/reactos/ntoskrnl/fs/notify.c index 8f8f10e25a7..30ef07cbf04 100644 --- a/reactos/ntoskrnl/fs/notify.c +++ b/reactos/ntoskrnl/fs/notify.c @@ -1,4 +1,4 @@ -/* $Id: notify.c,v 1.10 2004/06/23 00:42:21 ion Exp $ +/* $Id: notify.c,v 1.11 2004/06/27 13:58:05 navaraf Exp $ * * reactos/ntoskrnl/fs/notify.c * @@ -315,8 +315,8 @@ FsRtlNotifyVolumeEvent ( STDCALL NTSTATUS FsRtlRegisterFileSystemFilterCallbacks ( - IN struct _DRIVER_OBJECT *FilterDriverObject, - IN PFS_FILTER_CALLBACKS Callbacks + IN PVOID Unknown1, + IN PVOID Unknown2 ) { UNIMPLEMENTED; From 870260bec78049793fdeb2f9a55a4baf38f4dea5 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 27 Jun 2004 14:15:33 +0000 Subject: [PATCH 114/356] - Fixed bug in binary search algorithm. svn path=/trunk/; revision=9909 --- reactos/ntoskrnl/ldr/rtl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ldr/rtl.c b/reactos/ntoskrnl/ldr/rtl.c index 0a165ea095e..19346b2e65f 100644 --- a/reactos/ntoskrnl/ldr/rtl.c +++ b/reactos/ntoskrnl/ldr/rtl.c @@ -1,4 +1,4 @@ -/* $Id: rtl.c,v 1.18 2003/12/30 18:52:05 fireball Exp $ +/* $Id: rtl.c,v 1.19 2004/06/27 14:15:33 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -175,7 +175,7 @@ LdrGetProcedureAddress (IN PVOID BaseAddress, AddressPtr = (PULONG)RVA((char*)BaseAddress, ExportDir->AddressOfFunctions); if (Name && Name->Length) { - ULONG minn, maxn; + LONG minn, maxn; /* by name */ OrdinalPtr = @@ -185,7 +185,7 @@ LdrGetProcedureAddress (IN PVOID BaseAddress, minn = 0; maxn = ExportDir->NumberOfNames; while (minn <= maxn) { - ULONG mid; + LONG mid; LONG res; mid = (minn + maxn) / 2; From 3424e4ee4a604297ea78e3fa9210aa068008bda2 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 28 Jun 2004 06:52:41 +0000 Subject: [PATCH 115/356] add explorer-cfg-template.xml for explorer default configuration svn path=/trunk/; revision=9912 --- reactos/bootdata/packages/reactos.dff | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index f8741b6408b..6f33636d262 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -106,6 +106,7 @@ subsys\win32k\win32k.sys 1 subsys\system\autochk\autochk.exe 1 subsys\system\cmd\cmd.exe 1 subsys\system\explorer\explorer.exe 4 +subsys\system\explorer\explorer-cfg-template.xml 4 subsys\system\explorer\notifyhook.dll 1 subsys\system\format\format.exe 1 subsys\system\regedit\regedit.exe 4 From 6c9226bcbff7bd148d4ce80594c4740cc639d8f3 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 28 Jun 2004 12:05:16 +0000 Subject: [PATCH 116/356] Don't use fixed size main window. GetProcAddress() does not accept Unicode procedure names. Visual improvements. svn path=/trunk/; revision=9913 --- reactos/lib/cpl/control/control.c | 56 ++++++++++++++++--------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/reactos/lib/cpl/control/control.c b/reactos/lib/cpl/control/control.c index 26689e015f1..a12395454d3 100644 --- a/reactos/lib/cpl/control/control.c +++ b/reactos/lib/cpl/control/control.c @@ -17,10 +17,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: control.c,v 1.1 2004/06/19 00:11:44 kuehng Exp $ +/* $Id: control.c,v 1.2 2004/06/28 12:05:16 ekohl Exp $ * * PROJECT: ReactOS System Control Panel - * FILE: lib/cpl/system/control.cpp + * FILE: lib/cpl/system/control.c * PURPOSE: ReactOS System Control Panel * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com) * UPDATE HISTORY: @@ -47,6 +47,22 @@ #define CTL_DEBUG(x) #endif + +#define MYWNDCLASS _T("CTLPANELCLASS") + +typedef LONG (CALLBACK *CPLAPPLETFUNC)(HWND hwndCPL, UINT uMsg, LPARAM lParam1, LPARAM lParam2); + +typedef struct CPLLISTENTRY +{ + TCHAR pszPath[MAX_PATH]; + HMODULE hDLL; + CPLAPPLETFUNC pFunc; + CPLINFO CPLInfo; + int nIndex; +} CPLLISTENTRY; + + +HWND hListView; HINSTANCE hInst; HWND hMainWnd; @@ -60,19 +76,6 @@ void dbgprint(TCHAR *format,...) va_end(va); } -#define MYWNDCLASS _T("CTLPANELCLASS") -HWND hListView; - -typedef LONG (CALLBACK *CPLAPPLETFUNC)(HWND hwndCPL, UINT uMsg, LPARAM lParam1, LPARAM lParam2); - -typedef struct CPLLISTENTRY{ - TCHAR pszPath[MAX_PATH]; - HMODULE hDLL; - CPLAPPLETFUNC pFunc; - CPLINFO CPLInfo; - int nIndex; -} CPLLISTENTRY; - void PopulateCPLList(HWND hLisCtrl) { WIN32_FIND_DATA fd; @@ -99,7 +102,7 @@ void PopulateCPLList(HWND hLisCtrl) pEntry->hDLL = LoadLibrary(pEntry->pszPath); CTL_DEBUG((_T("Handle %08X\r\n"),pEntry->hDLL)); - pEntry->pFunc = (CPLAPPLETFUNC)GetProcAddress(pEntry->hDLL,_T("CPlApplet")); + pEntry->pFunc = (CPLAPPLETFUNC)GetProcAddress(pEntry->hDLL,"CPlApplet"); CTL_DEBUG((_T("CPLFunc %08X\r\n"),pEntry->pFunc)); if(pEntry->pFunc && pEntry->pFunc(hLisCtrl,CPL_INIT,0,0)) { @@ -119,7 +122,6 @@ void PopulateCPLList(HWND hLisCtrl) LoadString(pEntry->hDLL,pEntry->CPLInfo.idName,Name,MAX_PATH); if(_tcslen(Name)) { - LV_ITEM lvi; memset(&lvi,0x00,sizeof(lvi)); @@ -149,41 +151,41 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) switch(uMsg) { case WM_CREATE: - { + { RECT rect; LV_COLUMN column; GetClientRect(hWnd,&rect); - hListView = CreateWindow(WC_LISTVIEW,_T(""),LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP,0,0,rect.right ,rect.bottom,hWnd,NULL,hInst,0); + hListView = CreateWindow(WC_LISTVIEW,_T(""),LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_TABSTOP,0,0,rect.right ,rect.bottom,hWnd,NULL,hInst,0); CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView)); memset(&column,0x00,sizeof(column)); column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM|LVCF_TEXT; column.fmt=LVCFMT_LEFT; - column.cx = 200; + column.cx = (rect.right - rect.left) / 3; column.iSubItem = 0; column.pszText = _T("Name"); ListView_InsertColumn(hListView,0,&column); - column.cx = 200; + column.cx = (rect.right - rect.left) - ((rect.right - rect.left) / 3) - 1; column.iSubItem = 1; column.pszText = _T("Comment"); ListView_InsertColumn(hListView,1,&column); PopulateCPLList(hListView); ListView_SetColumnWidth(hListView,2,LVSCW_AUTOSIZE_USEHEADER); - ListView_Update(hListView,0); + ListView_Update(hListView,0); } break; case WM_DESTROY: - PostQuitMessage(0); + PostQuitMessage(0); break; case WM_SIZE: - { + { RECT rect; GetClientRect(hWnd,&rect); MoveWindow(hListView,0,0,rect.right,rect.bottom,TRUE); } break; case WM_NOTIFY: - { + { NMHDR *phdr; phdr = (NMHDR*)lParam; switch(phdr->code) @@ -193,7 +195,7 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) int nSelect; LV_ITEM lvi; CPLLISTENTRY *pEntry; - nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED); + nSelect=SendMessage(hListView,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED); if(nSelect==-1) // no items { @@ -262,7 +264,7 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *lpCmdLine,i wc.lpfnWndProc = MyWindowProc; RegisterClass(&wc); InitCommonControls(); - hMainWnd = CreateWindow(MYWNDCLASS,_T("Control Panel"),WS_OVERLAPPEDWINDOW,300,300,500,300,NULL,LoadMenu(hInst,MAKEINTRESOURCE(IDM_MAINMENU)),hInst,0); + hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE,MYWNDCLASS,_T("Control Panel"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,LoadMenu(hInst,MAKEINTRESOURCE(IDM_MAINMENU)),hInst,0); if(!hMainWnd) { CTL_DEBUG((_T("Unable to create window\r\n"))); return -1; From a630cd560f96fe4bf6c0d5230651fa96b75e7498 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 28 Jun 2004 15:53:17 +0000 Subject: [PATCH 117/356] - Fixed implementation of PALOBJ_cGetColors. - Cleaned up IntEngCreateXlate and XLATEOBJ_iXlate a bit and fixed some cases (Indexed -> Bitfields/BGR, Bitfields/BGR -> Indexed). - Removed simple color cache from ClosestColorMatch, because it wasn't thread safe and would return bogus values when more XLATEOBJs are used at once. svn path=/trunk/; revision=9914 --- reactos/subsys/win32k/eng/palette.c | 55 ++--- reactos/subsys/win32k/eng/xlate.c | 342 +++++++++++----------------- 2 files changed, 160 insertions(+), 237 deletions(-) diff --git a/reactos/subsys/win32k/eng/palette.c b/reactos/subsys/win32k/eng/palette.c index e3330a4f486..f60ac6f72d1 100644 --- a/reactos/subsys/win32k/eng/palette.c +++ b/reactos/subsys/win32k/eng/palette.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: palette.c,v 1.21 2004/05/10 17:07:17 weiden Exp $ +/* $Id: palette.c,v 1.22 2004/06/28 15:53:17 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -32,22 +32,18 @@ * @implemented */ HPALETTE STDCALL -EngCreatePalette(ULONG Mode, - ULONG NumColors, - ULONG *Colors, - ULONG Red, - ULONG Green, - ULONG Blue) +EngCreatePalette(ULONG Mode, ULONG NumColors, ULONG *Colors, + ULONG Red, ULONG Green, ULONG Blue) { - HPALETTE Palette; + HPALETTE Palette; - Palette = PALETTE_AllocPalette(Mode, NumColors, Colors, Red, Green, Blue); - if (NULL != Palette) - { + Palette = PALETTE_AllocPalette(Mode, NumColors, Colors, Red, Green, Blue); + if (Palette != NULL) + { GDIOBJ_SetOwnership(Palette, NULL); - } + } - return Palette; + return Palette; } /* @@ -56,34 +52,31 @@ EngCreatePalette(ULONG Mode, BOOL STDCALL EngDeletePalette(IN HPALETTE Palette) { - GDIOBJ_SetOwnership(Palette, PsGetCurrentProcess()); + GDIOBJ_SetOwnership(Palette, PsGetCurrentProcess()); - return PALETTE_FreePalette(Palette); + return PALETTE_FreePalette(Palette); } /* * @implemented */ ULONG STDCALL -PALOBJ_cGetColors(PALOBJ *PalObj, - ULONG Start, - ULONG Colors, - ULONG *PaletteEntry) +PALOBJ_cGetColors(PALOBJ *PalObj, ULONG Start, ULONG Colors, ULONG *PaletteEntry) { - ULONG i; - PALGDI *PalGDI; + PALGDI *PalGDI; - PalGDI = (PALGDI*)PalObj; - //PalGDI = (PALGDI*)AccessInternalObjectFromUserObject(PalObj); + PalGDI = (PALGDI*)PalObj; + /* PalGDI = (PALGDI*)AccessInternalObjectFromUserObject(PalObj); */ - for(i=Start; iIndexedColors[i].peRed, - PalGDI->IndexedColors[i].peGreen, - PalGDI->IndexedColors[i].peBlue); - } + if (Start >= PalGDI->NumColors) + return 0; - return Colors; + Colors = min(Colors, PalGDI->NumColors - Start); + + /* NOTE: PaletteEntry ULONGs are in the same order as PALETTEENTRY. */ + RtlCopyMemory(PaletteEntry, PalGDI->IndexedColors + Start, sizeof(ULONG) * Colors); + + return Colors; } + /* EOF */ diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index 1c9b951e40e..fe860f22fea 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.35 2004/05/30 14:01:12 weiden Exp $ +/* $Id: xlate.c,v 1.36 2004/06/28 15:53:17 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,8 +30,6 @@ // TODO: Cache XLATEOBJs that are created by EngCreateXlate by checking if the given palettes match a cached list -ULONG CCMLastSourceColor = 0, CCMLastColorMatch = 0; - static ULONG FASTCALL ShiftAndMask(XLATEGDI *XlateGDI, ULONG Color) { ULONG TranslatedColor; @@ -72,14 +70,6 @@ ClosestColorMatch(XLATEGDI *XlateGDI, ULONG SourceColor, ULONG SourceRed, SourceGreen, SourceBlue; ULONG cxRed, cxGreen, cxBlue, rt, BestMatch = 16777215; - // Simple cache -- only one value because we don't want to waste time - // if the colors aren't very sequential - - if(SourceColor == CCMLastSourceColor) - { - return CCMLastColorMatch; - } - if (PAL_BITFIELDS == XlateGDI->XlateObj.iSrcType || PAL_BGR == XlateGDI->XlateObj.iSrcType) { /* FIXME: must use bitfields */ @@ -112,9 +102,6 @@ ClosestColorMatch(XLATEGDI *XlateGDI, ULONG SourceColor, } } - CCMLastSourceColor = SourceColor; - CCMLastColorMatch = idx; - return idx; } @@ -141,6 +128,10 @@ static VOID STDCALL BitMasksFromPal(USHORT PalType, PPALGDI Palette, PULONG RedMask, PULONG BlueMask, PULONG GreenMask) { + static const union { PALETTEENTRY Color; ULONG Mask; } Red = {{255, 0, 0}}; + static const union { PALETTEENTRY Color; ULONG Mask; } Green = {{0, 255, 0}}; + static const union { PALETTEENTRY Color; ULONG Mask; } Blue = {{0, 0, 255}}; + switch(PalType) { case PAL_RGB: @@ -155,8 +146,13 @@ BitMasksFromPal(USHORT PalType, PPALGDI Palette, break; case PAL_BITFIELDS: *RedMask = Palette->RedMask; - *BlueMask = Palette->BlueMask; *GreenMask = Palette->GreenMask; + *BlueMask = Palette->BlueMask; + break; + case PAL_INDEXED: + *RedMask = Red.Mask; + *GreenMask = Green.Mask; + *BlueMask = Blue.Mask; break; } } @@ -201,185 +197,121 @@ VOID FASTCALL EngDeleteXlate(XLATEOBJ *XlateObj) FreeGDIHandle((ULONG)HXlate); } -XLATEOBJ * STDCALL IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, - HPALETTE PaletteDest, HPALETTE PaletteSource) +XLATEOBJ* STDCALL +IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, + HPALETTE PaletteDest, HPALETTE PaletteSource) { - // FIXME: Add support for BGR conversions + ULONG NewXlate; + XLATEOBJ *XlateObj; + XLATEGDI *XlateGDI; + PALGDI *SourcePalGDI = 0; + PALGDI *DestPalGDI = 0; + ULONG SourceRedMask, SourceGreenMask, SourceBlueMask; + ULONG DestRedMask, DestGreenMask, DestBlueMask; + ULONG i; - HPALETTE NewXlate; - XLATEOBJ *XlateObj; - XLATEGDI *XlateGDI; - PALGDI *SourcePalGDI, *DestPalGDI; - ULONG IndexedColors; - ULONG SourceRedMask, SourceGreenMask, SourceBlueMask; - ULONG DestRedMask, DestGreenMask, DestBlueMask; - UINT i; + NewXlate = CreateGDIHandle(sizeof(XLATEGDI), sizeof(XLATEOBJ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); + if (!ValidEngHandle(NewXlate)) + return NULL; - NewXlate = (HPALETTE)CreateGDIHandle(sizeof( XLATEGDI ), sizeof( XLATEOBJ ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); - if ( !ValidEngHandle ( NewXlate ) ) - return NULL; + if (PaletteSource != NULL) + SourcePalGDI = PALETTE_LockPalette(PaletteSource); + if (PaletteDest == PaletteSource) + DestPalGDI = SourcePalGDI; + else if (PaletteDest != NULL) + DestPalGDI = PALETTE_LockPalette(PaletteDest); - if (NULL != PaletteSource) - { - SourcePalGDI = PALETTE_LockPalette(PaletteSource); - } - if (PaletteDest == PaletteSource) - { - DestPalGDI = SourcePalGDI; - } - else if (NULL != PaletteDest) - { - DestPalGDI = PALETTE_LockPalette(PaletteDest); - } + XlateObj->iSrcType = SourcePalType; + XlateObj->iDstType = DestPalType; + XlateObj->flXlate = 0; - XlateObj->iSrcType = SourcePalType; - XlateObj->iDstType = DestPalType; + /* Store handles of palettes in internal Xlate GDI object (or NULLs) */ + XlateGDI->SourcePal = PaletteSource; + XlateGDI->DestPal = PaletteDest; - // Store handles of palettes in internal Xlate GDI object (or NULLs) - XlateGDI->DestPal = PaletteDest; - XlateGDI->SourcePal = PaletteSource; + XlateGDI->UseShiftAndMask = FALSE; - XlateObj->flXlate = 0; + /* + * Compute bit fiddeling constants unless both palettes are indexed, then + * we don't need them. + */ + if (SourcePalType != PAL_INDEXED || DestPalType != PAL_INDEXED) + { + BitMasksFromPal(SourcePalType, SourcePalGDI, &SourceRedMask, + &SourceBlueMask, &SourceGreenMask); + BitMasksFromPal(DestPalType, DestPalGDI, &DestRedMask, + &DestBlueMask, &DestGreenMask); + XlateGDI->RedShift = CalculateShift(SourceRedMask) - CalculateShift(DestRedMask); + XlateGDI->RedMask = DestRedMask; + XlateGDI->GreenShift = CalculateShift(SourceGreenMask) - CalculateShift(DestGreenMask); + XlateGDI->GreenMask = DestGreenMask; + XlateGDI->BlueShift = CalculateShift(SourceBlueMask) - CalculateShift(DestBlueMask); + XlateGDI->BlueMask = DestBlueMask; + } - XlateGDI->UseShiftAndMask = FALSE; - - /* Compute bit fiddeling constants unless both palettes are indexed, then we don't need them */ - if (PAL_INDEXED != SourcePalType || PAL_INDEXED != DestPalType) - { - BitMasksFromPal(PAL_INDEXED == SourcePalType ? PAL_RGB : SourcePalType, - SourcePalGDI, &SourceRedMask, &SourceBlueMask, &SourceGreenMask); - BitMasksFromPal(PAL_INDEXED == DestPalType ? PAL_RGB : DestPalType, - DestPalGDI, &DestRedMask, &DestBlueMask, &DestGreenMask); - XlateGDI->RedShift = CalculateShift(SourceRedMask) - CalculateShift(DestRedMask); - XlateGDI->RedMask = DestRedMask; - XlateGDI->GreenShift = CalculateShift(SourceGreenMask) - CalculateShift(DestGreenMask); - XlateGDI->GreenMask = DestGreenMask; - XlateGDI->BlueShift = CalculateShift(SourceBlueMask) - CalculateShift(DestBlueMask); - XlateGDI->BlueMask = DestBlueMask; - } - - // If source and destination palettes are the same or if they're RGB/BGR - if( (PaletteDest == PaletteSource) || - ((DestPalType == PAL_RGB) && (SourcePalType == PAL_RGB)) || - ((DestPalType == PAL_BGR) && (SourcePalType == PAL_BGR)) ) - { - XlateObj->flXlate |= XO_TRIVIAL; - if (NULL != PaletteSource) - { - PALETTE_UnlockPalette(PaletteSource); - } - if (NULL != PaletteDest && PaletteDest != PaletteSource) - { - PALETTE_UnlockPalette(PaletteDest); - } - return XlateObj; - } - - /* If source and destination are bitfield based (RGB and BGR are just special bitfields) */ - if ((PAL_RGB == DestPalType || PAL_BGR == DestPalType || PAL_BITFIELDS == DestPalType) && - (PAL_RGB == SourcePalType || PAL_BGR == SourcePalType || PAL_BITFIELDS == SourcePalType)) - { - if (SourceRedMask == DestRedMask && - SourceBlueMask == DestBlueMask && - SourceGreenMask == DestGreenMask) - { + /* If source and destination palettes are the same or if they're RGB/BGR */ + if (PaletteDest == PaletteSource || + (DestPalType == PAL_RGB && SourcePalType == PAL_RGB) || + (DestPalType == PAL_BGR && SourcePalType == PAL_BGR)) + { XlateObj->flXlate |= XO_TRIVIAL; - } - XlateGDI->UseShiftAndMask = TRUE; - if (NULL != PaletteSource) - { - PALETTE_UnlockPalette(PaletteSource); - } - if (NULL != PaletteDest && PaletteDest != PaletteSource) - { - PALETTE_UnlockPalette(PaletteDest); - } - return XlateObj; - } + goto end; + } - // Prepare the translation table - if (PAL_INDEXED == SourcePalType || PAL_RGB == SourcePalType || PAL_BGR == SourcePalType) - { - XlateObj->flXlate |= XO_TABLE; - if ((SourcePalType == PAL_INDEXED) && (DestPalType == PAL_INDEXED)) - { - if(SourcePalGDI->NumColors > DestPalGDI->NumColors) + /* + * If source and destination are bitfield based (RGB and BGR are just + * special bitfields) we can use simple shifting. + */ + if ((DestPalType == PAL_RGB || DestPalType == PAL_BGR || + DestPalType == PAL_BITFIELDS) && + (SourcePalType == PAL_RGB || SourcePalType == PAL_BGR || + SourcePalType == PAL_BITFIELDS)) + { + if (SourceRedMask == DestRedMask && + SourceBlueMask == DestBlueMask && + SourceGreenMask == DestGreenMask) { - IndexedColors = SourcePalGDI->NumColors; - } else - IndexedColors = DestPalGDI->NumColors; - } - else if (SourcePalType == PAL_INDEXED) { IndexedColors = SourcePalGDI->NumColors; } - else if (DestPalType == PAL_INDEXED) { IndexedColors = DestPalGDI->NumColors; } - - XlateGDI->translationTable = EngAllocMem(FL_ZERO_MEMORY, sizeof(ULONG)*IndexedColors, 0); - if (NULL == XlateGDI->translationTable) - { - if (NULL != PaletteSource) - { - PALETTE_UnlockPalette(PaletteSource); - } - if (NULL != PaletteDest && PaletteDest != PaletteSource) - { - PALETTE_UnlockPalette(PaletteDest); - } - EngDeleteXlate(XlateObj); - return NULL; + XlateObj->flXlate |= XO_TRIVIAL; } - } + XlateGDI->UseShiftAndMask = TRUE; + goto end; + } - // Source palette is indexed - if(XlateObj->iSrcType == PAL_INDEXED) - { - if(XlateObj->iDstType == PAL_INDEXED) - { - // Converting from indexed to indexed + /* Indexed -> Indexed */ + if (SourcePalType == PAL_INDEXED && DestPalType == PAL_INDEXED) + { + XlateGDI->translationTable = + EngAllocMem(0, sizeof(ULONG) * SourcePalGDI->NumColors, 0); IndexedToIndexedTranslationTable(XlateGDI, XlateGDI->translationTable, DestPalGDI, SourcePalGDI); - } else - if (PAL_RGB == XlateObj->iDstType || PAL_BITFIELDS == XlateObj->iDstType ) - { - // FIXME: Is this necessary? I think the driver has to call this - // function anyways if pulXlate is NULL and Source is PAL_INDEXED + XlateObj->flXlate |= XO_TABLE; + XlateObj->pulXlate = XlateGDI->translationTable; + goto end; + } - // Converting from indexed to RGB + /* Indexed -> Bitfields/RGB/BGR */ + if (SourcePalType == PAL_INDEXED) + { + XlateGDI->translationTable = + EngAllocMem(0, sizeof(ULONG) * SourcePalGDI->NumColors, 0); + for (i = 0; i < SourcePalGDI->NumColors; i++) + XlateGDI->translationTable[i] = + ShiftAndMask(XlateGDI, *((ULONG *)&SourcePalGDI->IndexedColors[i])); + XlateObj->flXlate |= XO_TABLE; + XlateObj->pulXlate = XlateGDI->translationTable; + goto end; + } - RtlCopyMemory(XlateGDI->translationTable, SourcePalGDI->IndexedColors, sizeof(ULONG) * SourcePalGDI->NumColors); - if (PAL_BITFIELDS == XlateObj->iDstType) - { - for (i = 0; i < SourcePalGDI->NumColors; i++) - { - XlateGDI->translationTable[i] = ShiftAndMask(XlateGDI, XlateGDI->translationTable[i]); - } - } - } + /* + * Last case: Bitfields/RGB/BGR -> Indexed + * isn't handled here yet and all the logic is in XLATEOBJ_iXlate now. + */ - XlateObj->pulXlate = XlateGDI->translationTable; - } - - // Source palette is RGB - if (PAL_RGB == XlateObj->iSrcType || PAL_BGR == XlateObj->iSrcType) - { - if(PAL_INDEXED == XlateObj->iDstType) - { - // FIXME: Is this necessary? I think the driver has to call this - // function anyways if pulXlate is NULL and Dest is PAL_INDEXED - - // Converting from RGB to indexed - RtlCopyMemory(XlateGDI->translationTable, DestPalGDI->IndexedColors, sizeof(ULONG) * DestPalGDI->NumColors); - } - } - - // FIXME: Add support for XO_TO_MONO - if (NULL != PaletteSource) - { - PALETTE_UnlockPalette(PaletteSource); - } - if (NULL != PaletteDest && PaletteDest != PaletteSource) - { - PALETTE_UnlockPalette(PaletteDest); - } - - return XlateObj; +end: + if (PaletteSource != NULL) + PALETTE_UnlockPalette(PaletteSource); + if (PaletteDest != NULL && PaletteDest != PaletteSource) + PALETTE_UnlockPalette(PaletteDest); + return XlateObj; } XLATEOBJ * STDCALL IntEngCreateMonoXlate( @@ -458,6 +390,7 @@ XLATEOBJ_piVector(XLATEOBJ *XlateObj) ULONG STDCALL XLATEOBJ_iXlate(XLATEOBJ *XlateObj, ULONG Color) { + XLATEGDI *XlateGDI; PALGDI *PalGDI; ULONG Closest; @@ -466,41 +399,38 @@ XLATEOBJ_iXlate(XLATEOBJ *XlateObj, ULONG Color) return Color; if (XlateObj->flXlate & XO_TRIVIAL) - { return Color; - } else + + if (XlateObj->flXlate & XO_TABLE) + return XlateObj->pulXlate[Color]; + + XlateGDI = (XLATEGDI *)AccessInternalObjectFromUserObject(XlateObj); + + if (XlateObj->flXlate & XO_TO_MONO) + return Color == XlateGDI->BackgroundColor; + + if (XlateGDI->UseShiftAndMask) + return ShiftAndMask(XlateGDI, Color); + + if (XlateObj->iSrcType == PAL_RGB || XlateObj->iSrcType == PAL_BGR || + XlateObj->iSrcType == PAL_BITFIELDS) { - XLATEGDI *XlateGDI = (XLATEGDI *)AccessInternalObjectFromUserObject(XlateObj); + /* FIXME: should we cache colors used often? */ + /* FIXME: won't work if destination isn't indexed */ - if (XlateObj->flXlate & XO_TO_MONO) - { - return Color == XlateGDI->BackgroundColor; - } else - if (XlateGDI->UseShiftAndMask) - { - return ShiftAndMask(XlateGDI, Color); - } else - if (XlateObj->iSrcType == PAL_RGB || XlateObj->iSrcType == PAL_BGR || - XlateObj->iSrcType == PAL_BITFIELDS) - { - /* FIXME: should we cache colors used often? */ - /* FIXME: won't work if destination isn't indexed */ + /* Extract the destination palette. */ + PalGDI = PALETTE_LockPalette(XlateGDI->DestPal); - /* Extract the destination palette. */ - PalGDI = PALETTE_LockPalette(XlateGDI->DestPal); + /* Convert the source color to the palette RGB format. */ + Color = ShiftAndMask(XlateGDI, Color); - /* Return closest match for the given color. */ - Closest = ClosestColorMatch(XlateGDI, Color, PalGDI->IndexedColors, PalGDI->NumColors); - PALETTE_UnlockPalette(XlateGDI->DestPal); - return Closest; - } else - if (XlateObj->iSrcType == PAL_INDEXED) - { - return XlateGDI->translationTable[Color]; - } - } + /* Return closest match for the given color. */ + Closest = ClosestColorMatch(XlateGDI, Color, PalGDI->IndexedColors, PalGDI->NumColors); + PALETTE_UnlockPalette(XlateGDI->DestPal); + return Closest; + } - return 0; + return 0; } /* From f2e5d4cd25fdc9ce58d517461cdb29e6cea4a844 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 28 Jun 2004 17:03:35 +0000 Subject: [PATCH 118/356] - Fixed more color handling issues (mostly incorrect RGB <-> BGR swapping). svn path=/trunk/; revision=9915 --- reactos/subsys/win32k/eng/xlate.c | 6 ++--- reactos/subsys/win32k/objects/bitmaps.c | 5 ++-- reactos/subsys/win32k/objects/color.c | 34 +++++-------------------- reactos/subsys/win32k/objects/dc.c | 19 +++----------- reactos/subsys/win32k/objects/dib.c | 31 +++------------------- 5 files changed, 20 insertions(+), 75 deletions(-) diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index fe860f22fea..9b60b2abaed 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.36 2004/06/28 15:53:17 navaraf Exp $ +/* $Id: xlate.c,v 1.37 2004/06/28 17:03:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -342,10 +342,10 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( XlateGDI->BackgroundColor = NtGdiGetNearestPaletteIndex( PaletteSource, BackgroundColor); break; - case PAL_RGB: + case PAL_BGR: XlateGDI->BackgroundColor = BackgroundColor; break; - case PAL_BGR: + case PAL_RGB: XlateGDI->BackgroundColor = ((BackgroundColor & 0xFF) << 16) | ((BackgroundColor & 0xFF0000) >> 16) | diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index b897f7dfd25..003815b6471 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmaps.c,v 1.74 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.75 2004/06/28 17:03:35 navaraf Exp $ */ #include #define IN_RECT(r,x,y) \ @@ -193,7 +193,7 @@ NtGdiBitBlt( Colors[0] = DCSrc->w.textColor; Colors[1] = DCSrc->w.backgroundColor; - Mono = EngCreatePalette(PAL_INDEXED, 2, Colors, 0, 0, 0); + Mono = PALETTE_AllocPaletteIndexedRGB(2, (RGBQUAD*)Colors); if (NULL != Mono) { XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); @@ -630,6 +630,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) PalMode = PalGDI->Mode; PALETTE_UnlockPalette(Pal); + /* FIXME: Verify if it shouldn't be PAL_BGR! */ XlateObj = (XLATEOBJ*)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); if ( XlateObj ) { diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 0e53f752d98..2fbbfcbe751 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.43 2004/06/23 15:30:20 weiden Exp $ */ +/* $Id: color.c,v 1.44 2004/06/28 17:03:35 navaraf Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -200,7 +200,7 @@ UINT STDCALL NtGdiGetNearestPaletteIndex(HPALETTE hpal, if (NULL != palGDI) { /* Return closest match for the given RGB color */ - index = COLOR_PaletteLookupPixel((LPPALETTEENTRY)palGDI->IndexedColors, palGDI->NumColors, NULL, Color, FALSE); + index = COLOR_PaletteLookupPixel(palGDI->IndexedColors, palGDI->NumColors, NULL, Color, FALSE); PALETTE_UnlockPalette(hpal); } @@ -233,7 +233,7 @@ UINT STDCALL NtGdiGetPaletteEntries(HPALETTE hpal, PALETTE_UnlockPalette(hpal); return 0; } - memcpy(pe, &palGDI->IndexedColors[StartIndex], Entries * sizeof(PALETTEENTRY)); + memcpy(pe, palGDI->IndexedColors + StartIndex, Entries * sizeof(PALETTEENTRY)); for (numEntries = 0; numEntries < Entries; numEntries++) { if (pe[numEntries].peFlags & 0xF0) @@ -493,7 +493,7 @@ UINT STDCALL NtGdiSetPaletteEntries(HPALETTE hpal, { Entries = numEntries - Start; } - memcpy(&palGDI->IndexedColors[Start], pe, Entries * sizeof(PALETTEENTRY)); + memcpy(palGDI->IndexedColors + Start, pe, Entries * sizeof(PALETTEENTRY)); PALETTE_ValidateFlags(palGDI->IndexedColors, palGDI->NumColors); ExFreePool(palGDI->logicalToSystem); palGDI->logicalToSystem = NULL; @@ -536,8 +536,10 @@ INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, for( i = 0; i < size && diff ; i++ ) { +#if 0 if(!(palPalEntry[i].peFlags & PC_SYS_USED) || (skipReserved && palPalEntry[i].peFlags & PC_SYS_RESERVED)) continue; +#endif r = palPalEntry[i].peRed - GetRValue(col); g = palPalEntry[i].peGreen - GetGValue(col); @@ -556,7 +558,6 @@ INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, COLORREF STDCALL COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color ) { -#if 1 INT index; index = COLOR_PaletteLookupPixel(palPalEntry, size, NULL, color, FALSE); @@ -564,29 +565,6 @@ COLORREF STDCALL COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, palPalEntry[index].peRed, palPalEntry[index].peGreen, palPalEntry[index].peBlue); -#else - unsigned char spec_type = color >> 24; - int i; - PALETTEENTRY *COLOR_sysPal = (PALETTEENTRY*)ReturnSystemPalette(); - - // we need logical palette for PALETTERGB and PALETTEINDEX colorrefs - - if( spec_type == 2 ) /* PALETTERGB */ - color = *(COLORREF*)(palPalEntry + COLOR_PaletteLookupPixel(palPalEntry,size,NULL,color,FALSE)); - - else if( spec_type == 1 ) /* PALETTEINDEX */ - { - if( (i = color & 0x0000ffff) >= size ) - { - DbgPrint("RGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i); - color = *(COLORREF*)palPalEntry; - } - else color = *(COLORREF*)(palPalEntry + i); - } - - color &= 0x00ffffff; - return (0x00ffffff & *(COLORREF*)(COLOR_sysPal + COLOR_PaletteLookupPixel(COLOR_sysPal, 256, NULL, color, FALSE))); -#endif } int STDCALL COLOR_PaletteLookupExactIndex( PALETTEENTRY* palPalEntry, int size, diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 74dfc9ca076..b2d994e29f7 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.139 2004/06/20 00:45:37 navaraf Exp $ +/* $Id: dc.c,v 1.140 2004/06/28 17:03:35 navaraf Exp $ * * DC.C - Device context functions * @@ -1749,9 +1749,8 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) XLATEOBJ *XlateObj; PPALGDI PalGDI; DWORD objectType; - COLORREF *ColorMap; COLORREF MonoColorMap[2]; - ULONG NumColors, Index; + ULONG NumColors; HRGN hVisRgn; USHORT Mode; @@ -1903,17 +1902,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) if(pb->dib->dsBmih.biBitCount == 1) { NumColors = 2; } else if(pb->dib->dsBmih.biBitCount == 4) { NumColors = 16; } else if(pb->dib->dsBmih.biBitCount == 8) { NumColors = 256; } - - ColorMap = ExAllocatePoolWithTag(PagedPool, sizeof(COLORREF) * NumColors, TAG_DC); - ASSERT(ColorMap); - for (Index = 0; Index < NumColors; Index++) - { - ColorMap[Index] = RGB(pb->ColorMap[Index].rgbRed, - pb->ColorMap[Index].rgbGreen, - pb->ColorMap[Index].rgbBlue); - } - dc->w.hPalette = PALETTE_AllocPalette(PAL_INDEXED, NumColors, (ULONG *) ColorMap, 0, 0, 0); - ExFreePool(ColorMap); + dc->w.hPalette = PALETTE_AllocPaletteIndexedRGB(NumColors, pb->ColorMap); } else if ( 16 == pb->dib->dsBmih.biBitCount ) { @@ -1931,7 +1920,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) { MonoColorMap[0] = RGB(0, 0, 0); MonoColorMap[1] = RGB(255, 255, 255); - dc->w.hPalette = PALETTE_AllocPalette(PAL_INDEXED, 2, MonoColorMap, 0, 0, 0); + dc->w.hPalette = PALETTE_AllocPaletteIndexedRGB(2, (RGBQUAD*)MonoColorMap); } else { diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index d966f1c31be..1be558bf67e 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.53 2004/06/23 07:31:22 gvg Exp $ + * $Id: dib.c,v 1.54 2004/06/28 17:03:35 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -1350,27 +1350,6 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi) return lpRGB; } -PPALETTEENTRY STDCALL -DIBColorTableToPaletteEntries ( - PPALETTEENTRY palEntries, - const RGBQUAD *DIBColorTable, - ULONG ColorCount - ) -{ - ULONG i; - - for (i = 0; i < ColorCount; i++) - { - palEntries->peRed = DIBColorTable->rgbRed; - palEntries->peGreen = DIBColorTable->rgbGreen; - palEntries->peBlue = DIBColorTable->rgbBlue; - palEntries++; - DIBColorTable++; - } - - return palEntries; -} - HPALETTE FASTCALL BuildDIBPalette (PBITMAPINFO bmi, PINT paletteType) { @@ -1407,13 +1386,11 @@ BuildDIBPalette (PBITMAPINFO bmi, PINT paletteType) if (PAL_INDEXED == *paletteType) { - palEntries = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY)*ColorCount, TAG_COLORMAP); - DIBColorTableToPaletteEntries(palEntries, bmi->bmiColors, ColorCount); + hPal = PALETTE_AllocPaletteIndexedRGB(ColorCount, (RGBQUAD*)bmi->bmiColors); } - hPal = PALETTE_AllocPalette( *paletteType, ColorCount, (ULONG*)palEntries, 0, 0, 0 ); - if (NULL != palEntries) + else { - ExFreePool(palEntries); + hPal = PALETTE_AllocPalette( *paletteType, ColorCount, (ULONG*)palEntries, 0, 0, 0 ); } return hPal; From d9f6abff670b701cee5193d07c4024c6beb61d77 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 28 Jun 2004 17:03:46 +0000 Subject: [PATCH 119/356] - Removed ReactOS specific hack in ImageList_DrawIndirect since the color conversions in Win32K are fixed now. svn path=/trunk/; revision=9916 --- reactos/lib/comctl32/imagelist.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/lib/comctl32/imagelist.c b/reactos/lib/comctl32/imagelist.c index 8ed4b6d0260..d0fff569d6f 100644 --- a/reactos/lib/comctl32/imagelist.c +++ b/reactos/lib/comctl32/imagelist.c @@ -1146,13 +1146,11 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp) PatBlt(hBlendMaskDC, 0, 0, cx, cy, PATCOPY); SelectObject(hBlendMaskDC, hOldBrush); -#if 0 /* Modify the blend mask if an Image Mask exist */ if(himl->hbmMask) { BitBlt(hBlendMaskDC, 0, 0, cx, cy, hMaskListDC, lx, ly, 0x220326); /* NOTSRCAND */ BitBlt(hBlendMaskDC, 0, 0, cx, cy, hBlendMaskDC, 0, 0, NOTSRCCOPY); } -#endif /* now apply blend to the current image given the BlendMask */ if (clrBlend == CLR_DEFAULT) clrBlend = GetSysColor (COLOR_HIGHLIGHT); From 06b882daa5e57efbad744fa9ac68da2957161e32 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 28 Jun 2004 19:46:17 +0000 Subject: [PATCH 120/356] - Copied implementation of GetShortPathName[AW] from Wine. svn path=/trunk/; revision=9918 --- reactos/lib/kernel32/file/dir.c | 152 ++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 19 deletions(-) diff --git a/reactos/lib/kernel32/file/dir.c b/reactos/lib/kernel32/file/dir.c index 36b63751ad4..fe69e74ce61 100644 --- a/reactos/lib/kernel32/file/dir.c +++ b/reactos/lib/kernel32/file/dir.c @@ -1,4 +1,4 @@ -/* $Id: dir.c,v 1.45 2004/06/02 18:26:57 gvg Exp $ +/* $Id: dir.c,v 1.46 2004/06/28 19:46:17 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -433,43 +433,157 @@ GetFullPathNameW ( /* - * @unimplemented + * NOTE: Copied from Wine. + * @implemented */ DWORD STDCALL GetShortPathNameA ( - LPCSTR lpszLongPath, - LPSTR lpszShortPath, - DWORD cchBuffer + LPCSTR longpath, + LPSTR shortpath, + DWORD shortlen ) { - //1 remove unicode chars and spaces - //2 remove preceding and trailing periods. - //3 remove embedded periods except the last one - - //4 Split the string in two parts before and after the period - // truncate the part before the period to 6 chars and add ~1 - // truncate the part after the period to 3 chars - //3 Put the new name in uppercase - - //4 Increment the ~1 string if the resulting name allready exists + UNICODE_STRING longpathW; + WCHAR shortpathW[MAX_PATH]; + DWORD ret, retW; + if (!longpath) + { + SetLastError(ERROR_INVALID_PARAMETER); return 0; + } + + if (!RtlCreateUnicodeStringFromAsciiz(&longpathW, longpath)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + retW = GetShortPathNameW(longpathW.Buffer, shortpathW, MAX_PATH); + + if (!retW) + ret = 0; + else if (retW > PATH_MAX) + { + SetLastError(ERROR_FILENAME_EXCED_RANGE); + ret = 0; + } + else + { + ret = WideCharToMultiByte(CP_ACP, 0, shortpathW, -1, NULL, 0, NULL, NULL); + if (ret <= shortlen) + { + WideCharToMultiByte(CP_ACP, 0, shortpathW, -1, shortpath, shortlen, NULL, NULL); + ret--; /* length without 0 */ + } + } + + RtlFreeUnicodeString(&longpathW); + return ret; } /* - * @unimplemented + * NOTE: Copied from Wine. + * @implemented */ DWORD STDCALL GetShortPathNameW ( - LPCWSTR lpszLongPath, - LPWSTR lpszShortPath, - DWORD cchBuffer + LPCWSTR longpath, + LPWSTR shortpath, + DWORD shortlen ) { + WCHAR tmpshortpath[PATH_MAX]; + LPCWSTR p; + DWORD sp = 0, lp = 0; + DWORD tmplen; + WIN32_FIND_DATAW wfd; + HANDLE goit; + UNICODE_STRING ustr; + WCHAR ustr_buf[8+1+3+1]; + + if (!longpath) + { + SetLastError(ERROR_INVALID_PARAMETER); return 0; + } + if (!longpath[0]) + { + SetLastError(ERROR_BAD_PATHNAME); + return 0; + } + + /* check for drive letter */ + if (longpath[1] == ':' ) + { + tmpshortpath[0] = longpath[0]; + tmpshortpath[1] = ':'; + sp = lp = 2; + } + + ustr.Buffer = ustr_buf; + ustr.Length = 0; + ustr.MaximumLength = sizeof(ustr_buf); + + while (longpath[lp]) + { + /* check for path delimiters and reproduce them */ + if (longpath[lp] == '\\' || longpath[lp] == '/') + { + if (!sp || tmpshortpath[sp-1] != '\\') + { + /* strip double "\\" */ + tmpshortpath[sp] = '\\'; + sp++; + } + tmpshortpath[sp] = 0; /* terminate string */ + lp++; + continue; + } + + for (p = longpath + lp; *p && *p != '/' && *p != '\\'; p++); + tmplen = p - (longpath + lp); + lstrcpynW(tmpshortpath + sp, longpath + lp, tmplen + 1); + /* Check, if the current element is a valid dos name */ + if (tmplen <= 8+1+3+1) + { + BOOLEAN spaces; + memcpy(ustr_buf, longpath + lp, tmplen * sizeof(WCHAR)); + ustr_buf[tmplen] = '\0'; + ustr.Length = tmplen * sizeof(WCHAR); + if (RtlIsNameLegalDOS8Dot3(&ustr, NULL, &spaces) && !spaces) + { + sp += tmplen; + lp += tmplen; + continue; + } + } + + /* Check if the file exists and use the existing short file name */ + goit = FindFirstFileW(tmpshortpath, &wfd); + if (goit == INVALID_HANDLE_VALUE) goto notfound; + FindClose(goit); + lstrcpyW(tmpshortpath + sp, wfd.cAlternateFileName); + sp += lstrlenW(tmpshortpath + sp); + lp += tmplen; + } + tmpshortpath[sp] = 0; + + tmplen = lstrlenW(tmpshortpath) + 1; + if (tmplen <= shortlen) + { + lstrcpyW(shortpath, tmpshortpath); + tmplen--; /* length without 0 */ + } + + return tmplen; + + notfound: + SetLastError ( ERROR_FILE_NOT_FOUND ); + return 0; } From d5f50bdad51b945116f2216cafb0a35c0d94e193 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Mon, 28 Jun 2004 20:38:42 +0000 Subject: [PATCH 121/356] - compatibility to expat version < 1.95.7 - handle missing XML encoding parameter svn path=/trunk/; revision=9919 --- .../system/explorer/utility/xmlstorage.cpp | 8 +- .../system/explorer/utility/xmlstorage.h | 80 ++++++++++++++++++- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index 28f41780997..da863514833 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -87,10 +87,11 @@ void XMLCALL XMLReaderBase::XML_XmlDeclHandler(void* userData, const XML_Char* v { XMLReaderBase* pReader = (XMLReaderBase*) userData; - if (version) { + if (version) pReader->_xml_version = version; + + if (encoding) pReader->_encoding = encoding; - } } /// notifications about XML start tag @@ -217,11 +218,14 @@ std::string XMLReaderBase::get_error_string() const case XML_ERROR_FEATURE_REQUIRES_XML_DTD: return "XML_ERROR_FEATURE_REQUIRES_XML_DTD"; case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING: return "XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING"; case XML_ERROR_UNBOUND_PREFIX: return "XML_ERROR_UNBOUND_PREFIX"; + // EXPAT version >= 1.95.8 +#if XML_MAJOR_VERSION>1 || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION>95) || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION==95 && XML_MICRO_VERSION>7) case XML_ERROR_SUSPENDED: return "XML_ERROR_SUSPENDED"; case XML_ERROR_NOT_SUSPENDED: return "XML_ERROR_NOT_SUSPENDED"; case XML_ERROR_ABORTED: return "XML_ERROR_ABORTED"; case XML_ERROR_FINISHED: return "XML_ERROR_FINISHED"; case XML_ERROR_SUSPEND_PE: return "XML_ERROR_SUSPEND_PE"; +#endif } std::ostringstream out; diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 1ec305c2ef3..686e6b30515 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -1205,7 +1205,7 @@ protected: int _value; private: - void operator=(const XMLBool&); // disallow assignment operations + void operator=(const XMLInt&); // disallow assignment operations }; struct XMLIntRef @@ -1242,6 +1242,84 @@ protected: }; +struct XMLString +{ + XMLString(const String& value) + : _value(value) + { + } + + XMLString(LPCTSTR value, LPCTSTR def=TEXT("")) + { + if (value && *value) + _value = value; + else + _value = def; + } + + XMLString(const XMLNode* node, const String& attr_name, LPCTSTR def=TEXT("")) + { + const String& value = node->get(attr_name); + + if (!value.empty()) + _value = value; + else + _value = def; + } + + XMLString(const XMLNode* node, const String& name, const String& attr_name, LPCTSTR def=TEXT("")) + { + const String& value = node->value(name, attr_name); + + if (!value.empty()) + _value = value; + else + _value = def; + } + + operator const String&() const + { + return _value; + } + +protected: + String _value; + +private: + void operator=(const XMLString&); // disallow assignment operations +}; + +struct XMStringRef +{ + XMStringRef(XMLNode* node, const String& name, const String& attr_name, LPCTSTR def=TEXT("")) + : _ref(node->value(name, attr_name)) + { + if (_ref.empty()) + assign(def); + } + + XMStringRef& operator=(const String& value) + { + assign(value); + + return *this; + } + + operator const String&() const + { + return _ref; + } + + void assign(const String& value) + { + _ref.assign(value); + } + +protected: + String& _ref; +}; + + #ifdef _MSC_VER #pragma warning(disable: 4355) #endif From cffc8dfe096e5b75436ae2faacac6a8068af4b34 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 28 Jun 2004 21:02:49 +0000 Subject: [PATCH 122/356] - Import RtlImageDirectoryEntryToData from ntoskrnl and don't duplicate it. svn path=/trunk/; revision=9920 --- reactos/subsys/win32k/ldr/loader.c | 54 +++--------------------------- 1 file changed, 4 insertions(+), 50 deletions(-) diff --git a/reactos/subsys/win32k/ldr/loader.c b/reactos/subsys/win32k/ldr/loader.c index 42522861329..fb34704143a 100644 --- a/reactos/subsys/win32k/ldr/loader.c +++ b/reactos/subsys/win32k/ldr/loader.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: loader.c,v 1.16 2004/04/11 09:09:38 gvg Exp $ +/* $Id: loader.c,v 1.17 2004/06/28 21:02:49 navaraf Exp $ * */ @@ -29,57 +29,11 @@ #ifdef __USE_W32API PIMAGE_NT_HEADERS STDCALL -RtlImageNtHeader(IN PVOID BaseAddress); +RtlImageNtHeader(PVOID); +PVOID STDCALL +RtlImageDirectoryEntryToData(PVOID,BOOLEAN,ULONG,PULONG); #endif -/* - * This is copied from ntdll... It's needed for loading keyboard dlls. - */ - -PVOID -STDCALL -RtlImageDirectoryEntryToData ( - PVOID BaseAddress, - BOOLEAN bFlag, - ULONG Directory, - PULONG Size - ) -{ - PIMAGE_NT_HEADERS NtHeader; - PIMAGE_SECTION_HEADER SectionHeader; - ULONG Va; - ULONG Count; - - NtHeader = RtlImageNtHeader (BaseAddress); - if (NtHeader == NULL) - return NULL; - - if (Directory >= NtHeader->OptionalHeader.NumberOfRvaAndSizes) - return NULL; - - Va = NtHeader->OptionalHeader.DataDirectory[Directory].VirtualAddress; - if (Va == 0) - return NULL; - - if (Size) - *Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size; - - if (bFlag) - return (PVOID)(BaseAddress + Va); - - /* image mapped as ordinary file, we must find raw pointer */ - SectionHeader = (PIMAGE_SECTION_HEADER)(NtHeader + 1); - Count = NtHeader->FileHeader.NumberOfSections; - while (Count--) - { - if (SectionHeader->VirtualAddress == Va) - return (PVOID)(BaseAddress + SectionHeader->PointerToRawData); - SectionHeader++; - } - - return NULL; -} - /* * Blatantly stolen from ldr/utils.c in ntdll. I can't link ntdll from * here, though. From e834678a62ed97d4a488d645846ca4b893f5a160 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 28 Jun 2004 21:03:08 +0000 Subject: [PATCH 123/356] - We don't need to have BuiltInRect member in the ROSRGNDATA structure. Since regions with only one rectangle have this rectange identical to the bounding one, we can use rdh.rcBounds instead and save 16 bytes. svn path=/trunk/; revision=9921 --- reactos/include/win32k/region.h | 3 --- reactos/subsys/win32k/objects/region.c | 36 +++++++++++++++----------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index 0b3acd22d0b..1a96f5b0a71 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -8,9 +8,6 @@ typedef struct _ROSRGNDATA { RGNDATAHEADER rdh; PRECT Buffer; - RECT BuiltInRect; /* Testing shows that > 95% of all regions have only 1 rect. - Including that here saves us from having to do another - allocation */ } ROSRGNDATA, *PROSRGNDATA, *LPROSRGNDATA; diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index add1ce02ed0..397de6c10ec 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -/* $Id: region.c,v 1.57 2004/05/18 22:32:48 weiden Exp $ */ +/* $Id: region.c,v 1.58 2004/06/28 21:03:08 navaraf Exp $ */ #include #include @@ -400,7 +400,7 @@ static inline int xmemcheck(ROSRGNDATA *reg, PRECT *rect, PRECT *firstrect ) { return 0; RtlCopyMemory( temp, *firstrect, reg->rdh.nRgnSize ); reg->rdh.nRgnSize *= 2; - if (*firstrect != ®->BuiltInRect) + if (*firstrect != ®->rdh.rcBound) ExFreePool( *firstrect ); *firstrect = temp; *rect = (*firstrect)+reg->rdh.nCount; @@ -466,7 +466,7 @@ static BOOL FASTCALL REGION_CopyRegion(PROSRGNDATA dst, PROSRGNDATA src) if( !temp ) return FALSE; - if( dst->Buffer && dst->Buffer != &dst->BuiltInRect ) + if( dst->Buffer && dst->Buffer != &dst->rdh.rcBound ) ExFreePool( dst->Buffer ); //free the old buffer dst->Buffer = temp; dst->rdh.nRgnSize = src->rdh.nCount * sizeof(RECT); //size of region buffer @@ -541,7 +541,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re } else{ xrect = ExAllocatePoolWithTag(PagedPool, rgnSrc->rdh.nCount * sizeof(RECT), TAG_REGION); - if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->BuiltInRect ) + if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->rdh.rcBound ) ExFreePool( rgnDst->Buffer ); //free the old buffer. will be assigned to xrect below. } @@ -604,7 +604,7 @@ static BOOL FASTCALL REGION_CropAndOffsetRegion(const PPOINT off, const PRECT re if(!temp) return FALSE; - if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->BuiltInRect ) + if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->rdh.rcBound ) ExFreePool( rgnDst->Buffer ); //free the old buffer rgnDst->Buffer = temp; rgnDst->rdh.nCount = i; @@ -1142,7 +1142,7 @@ REGION_RegionOp( else{ newReg->rdh.nRgnSize = newReg->rdh.nCount*sizeof(RECT); RtlCopyMemory( newReg->Buffer, prev_rects, newReg->rdh.nRgnSize ); - if (prev_rects != &newReg->BuiltInRect) + if (prev_rects != &newReg->rdh.rcBound) ExFreePool( prev_rects ); } } @@ -1153,7 +1153,7 @@ REGION_RegionOp( * the region is empty */ newReg->rdh.nRgnSize = sizeof(RECT); - if (newReg->Buffer != &newReg->BuiltInRect) + if (newReg->Buffer != &newReg->rdh.rcBound) ExFreePool( newReg->Buffer ); newReg->Buffer = ExAllocatePoolWithTag( PagedPool, sizeof(RECT), TAG_REGION ); ASSERT( newReg->Buffer ); @@ -1165,7 +1165,7 @@ REGION_RegionOp( else newReg->rdh.iType = (newReg->rdh.nCount > 1)? COMPLEXREGION : SIMPLEREGION; - if (oldRects != &newReg->BuiltInRect) + if (oldRects != &newReg->rdh.rcBound) ExFreePool( oldRects ); return; } @@ -1900,7 +1900,10 @@ HRGN FASTCALL RGNDATA_AllocRgn(INT n) { if (1 == n) { - pReg->Buffer = &pReg->BuiltInRect; + /* Testing shows that > 95% of all regions have only 1 rect. + Including that here saves us from having to do another + allocation */ + pReg->Buffer = &pReg->rdh.rcBound; } else { @@ -1931,7 +1934,7 @@ HRGN FASTCALL RGNDATA_AllocRgn(INT n) BOOL FASTCALL RGNDATA_InternalDelete( PROSRGNDATA pRgn ) { ASSERT(pRgn); - if(pRgn->Buffer && pRgn->Buffer != &pRgn->BuiltInRect) + if(pRgn->Buffer && pRgn->Buffer != &pRgn->rdh.rcBound) ExFreePool(pRgn->Buffer); return TRUE; } @@ -2383,10 +2386,13 @@ NtGdiOffsetRgn(HRGN hRgn, pbox->bottom += YOffset; pbox++; } - rgn->rdh.rcBound.left += XOffset; - rgn->rdh.rcBound.right += XOffset; - rgn->rdh.rcBound.top += YOffset; - rgn->rdh.rcBound.bottom += YOffset; + if (rgn->Buffer != &rgn->rdh.rcBound) + { + rgn->rdh.rcBound.left += XOffset; + rgn->rdh.rcBound.right += XOffset; + rgn->rdh.rcBound.top += YOffset; + rgn->rdh.rcBound.bottom += YOffset; + } } } ret = rgn->rdh.iType; @@ -2877,7 +2883,7 @@ static int FASTCALL REGION_PtsToRegion(int numFullPtBlocks, int iCurPtBlock, if(reg->Buffer != NULL) { RtlCopyMemory(temp, reg->Buffer, reg->rdh.nCount * sizeof(RECT)); - if(reg->Buffer != ®->BuiltInRect) + if(reg->Buffer != ®->rdh.rcBound) ExFreePool(reg->Buffer); } reg->Buffer = temp; From c2f6de9e7bf30264f03f095fd66c762096c19a8e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 06:08:54 +0000 Subject: [PATCH 124/356] - Improved implementation of REGION_CreateFrameRgn that gives more correct results. svn path=/trunk/; revision=9923 --- reactos/subsys/win32k/objects/region.c | 156 ++++++++++++------------- 1 file changed, 75 insertions(+), 81 deletions(-) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 397de6c10ec..6dd6ec4baeb 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -/* $Id: region.c,v 1.58 2004/06/28 21:03:08 navaraf Exp $ */ +/* $Id: region.c,v 1.59 2004/06/29 06:08:54 navaraf Exp $ */ #include #include @@ -1736,96 +1736,90 @@ void FASTCALL REGION_UnionRectWithRegion(const RECT *rect, ROSRGNDATA *rgn) REGION_UnionRegion(rgn, rgn, ®ion); } - BOOL FASTCALL REGION_CreateFrameRgn(HRGN hDest, HRGN hSrc, INT x, INT y) { - PROSRGNDATA srcObj, destObj; - PRECT rc; - INT dx, dy; - ULONG i; + PROSRGNDATA srcObj, destObj; + PRECT rc; + ULONG i; - if(!(srcObj = (PROSRGNDATA)RGNDATA_LockRgn(hSrc))) - { - return FALSE; - } - if(!REGION_NOT_EMPTY(srcObj)) - { - RGNDATA_UnlockRgn(hSrc); - return FALSE; - } - if(!(destObj = (PROSRGNDATA)RGNDATA_LockRgn(hDest))) - { - RGNDATA_UnlockRgn(hSrc); - return FALSE; - } + if (!(srcObj = (PROSRGNDATA)RGNDATA_LockRgn(hSrc))) + { + return FALSE; + } + if (!REGION_NOT_EMPTY(srcObj)) + { + RGNDATA_UnlockRgn(hSrc); + return FALSE; + } + if (!(destObj = (PROSRGNDATA)RGNDATA_LockRgn(hDest))) + { + RGNDATA_UnlockRgn(hSrc); + return FALSE; + } - EMPTY_REGION(destObj); - if(!REGION_CopyRegion(destObj, srcObj)) - { - RGNDATA_UnlockRgn(hDest); - RGNDATA_UnlockRgn(hSrc); - return FALSE; - } + EMPTY_REGION(destObj); + if (!REGION_CopyRegion(destObj, srcObj)) + { + RGNDATA_UnlockRgn(hDest); + RGNDATA_UnlockRgn(hSrc); + return FALSE; + } - /* left-top */ - dx = x * 2; - dy = y * 2; - rc = (PRECT)srcObj->Buffer; - for(i = 0; i < srcObj->rdh.nCount; i++) - { - rc->left += x; - rc->top += y; - rc->right += x; - rc->bottom += y; - rc++; - } - REGION_IntersectRegion(destObj, destObj, srcObj); + /* Original region moved to right */ + rc = (PRECT)srcObj->Buffer; + for (i = 0; i < srcObj->rdh.nCount; i++) + { + rc->left += x; + rc->right += x; + rc++; + } + REGION_IntersectRegion(destObj, destObj, srcObj); - /* right-top */ - rc = (PRECT)srcObj->Buffer; - for(i = 0; i < srcObj->rdh.nCount; i++) - { - rc->left -= dx; - rc->right -= dx; - rc++; - } - REGION_IntersectRegion(destObj, destObj, srcObj); + /* Original region moved to left */ + rc = (PRECT)srcObj->Buffer; + for (i = 0; i < srcObj->rdh.nCount; i++) + { + rc->left -= 2 * x; + rc->right -= 2 * x; + rc++; + } + REGION_IntersectRegion(destObj, destObj, srcObj); - /* right-bottom */ - rc = (PRECT)srcObj->Buffer; - for(i = 0; i < srcObj->rdh.nCount; i++) - { - rc->top -= dy; - rc->bottom -= dy; - rc++; - } - REGION_IntersectRegion(destObj, destObj, srcObj); + /* Original region moved down */ + rc = (PRECT)srcObj->Buffer; + for (i = 0; i < srcObj->rdh.nCount; i++) + { + rc->left += x; + rc->right += x; + rc->top += y; + rc->bottom += y; + rc++; + } + REGION_IntersectRegion(destObj, destObj, srcObj); - /* left-bottom */ - rc = (PRECT)srcObj->Buffer; - for(i = 0; i < srcObj->rdh.nCount; i++) - { - rc->left += dx; - rc->right += dx; - rc++; - } - REGION_IntersectRegion(destObj, destObj, srcObj); + /* Original region moved up */ + rc = (PRECT)srcObj->Buffer; + for (i = 0; i < srcObj->rdh.nCount; i++) + { + rc->top -= 2 * y; + rc->bottom -= 2 * y; + rc++; + } + REGION_IntersectRegion(destObj, destObj, srcObj); + /* Restore the original region */ + rc = (PRECT)srcObj->Buffer; + for (i = 0; i < srcObj->rdh.nCount; i++) + { + rc->top += y; + rc->bottom += y; + rc++; + } + REGION_SubtractRegion(destObj, srcObj, destObj); - rc = (PRECT)srcObj->Buffer; - for(i = 0; i < srcObj->rdh.nCount; i++) - { - rc->left -= x; - rc->top += y; - rc->right -= x; - rc->bottom += y; - rc++; - } - REGION_SubtractRegion(destObj, srcObj, destObj); - - RGNDATA_UnlockRgn(hDest); - RGNDATA_UnlockRgn(hSrc); - return TRUE; + RGNDATA_UnlockRgn(hDest); + RGNDATA_UnlockRgn(hSrc); + return TRUE; } From 56df203d1b8183396d14cea33669ba831fa7a3d6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 29 Jun 2004 12:03:56 +0000 Subject: [PATCH 125/356] - Load 16x16 and 32x32 icons. - Use masked image lists. - Clean-up menu IDs. svn path=/trunk/; revision=9924 --- reactos/lib/cpl/control/Makefile | 6 ++---- reactos/lib/cpl/control/control.c | 24 +++++++++++++----------- reactos/lib/cpl/control/control.rc | 12 ++++++------ reactos/lib/cpl/control/resource.h | 22 +++++++++------------- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/reactos/lib/cpl/control/Makefile b/reactos/lib/cpl/control/Makefile index e804c38e468..7a70cb49e6e 100644 --- a/reactos/lib/cpl/control/Makefile +++ b/reactos/lib/cpl/control/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/06/18 20:43:44 kuehng Exp $ +# $Id: Makefile,v 1.2 2004/06/29 12:03:56 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -10,9 +10,7 @@ TARGET_INSTALLDIR = system32 TARGET_APPTYPE = windows -MK_CFLAGS = -D_UNICODE -DUNICODE -MK_CPPFLAGS = -D_UNICODE -DUNICODE -MK_RCFLAGS = -D_UNICODE -DUNICODE +TARGET_CFLAGS = -D_UNICODE -DUNICODE TARGET_SDKLIBS = kernel32.a user32.a comctl32.a diff --git a/reactos/lib/cpl/control/control.c b/reactos/lib/cpl/control/control.c index a12395454d3..3b35fd6abc6 100644 --- a/reactos/lib/cpl/control/control.c +++ b/reactos/lib/cpl/control/control.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: control.c,v 1.2 2004/06/28 12:05:16 ekohl Exp $ +/* $Id: control.c,v 1.3 2004/06/29 12:03:56 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/control.c @@ -86,8 +86,8 @@ void PopulateCPLList(HWND hLisCtrl) GetSystemDirectory(pszSearchPath,MAX_PATH); _tcscat(pszSearchPath,_T("\\*.cpl")); hFind = FindFirstFile(pszSearchPath,&fd); - hImgListSmall = ImageList_Create(16,16,ILC_COLOR,256,1000); - hImgListLarge = ImageList_Create(32,32,ILC_COLOR,256,1000); + hImgListSmall = ImageList_Create(16,16,ILC_COLOR | ILC_MASK,256,1000); + hImgListLarge = ImageList_Create(32,32,ILC_COLOR | ILC_MASK,256,1000); while(hFind != INVALID_HANDLE_VALUE) { CPLLISTENTRY *pEntry; @@ -114,11 +114,13 @@ void PopulateCPLList(HWND hLisCtrl) int index; pEntry->pFunc(hLisCtrl,CPL_INQUIRE,0,(LPARAM)&pEntry->CPLInfo); - hIcon = LoadIcon(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon)); + hIcon = LoadImage(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); index = ImageList_AddIcon(hImgListSmall,hIcon); + DestroyIcon(hIcon); + hIcon = LoadImage(pEntry->hDLL,MAKEINTRESOURCE(pEntry->CPLInfo.idIcon),IMAGE_ICON,32,32,LR_DEFAULTCOLOR); ImageList_AddIcon(hImgListLarge,hIcon); + DestroyIcon(hIcon); - LoadString(pEntry->hDLL,pEntry->CPLInfo.idName,Name,MAX_PATH); if(_tcslen(Name)) { @@ -221,22 +223,22 @@ LRESULT CALLBACK MyWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) case WM_COMMAND: switch(LOWORD(wParam)) { - case CM_LARGEICONS: + case IDM_LARGEICONS: SetWindowLong(hListView,GWL_STYLE,LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); break; - case CM_SMALLICONS: + case IDM_SMALLICONS: SetWindowLong(hListView,GWL_STYLE,LVS_SMALLICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); break; - case CM_LIST: + case IDM_LIST: SetWindowLong(hListView,GWL_STYLE,LVS_LIST | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); break; - case CM_DETAILS: + case IDM_DETAILS: SetWindowLong(hListView,GWL_STYLE,LVS_REPORT | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD|WS_BORDER|WS_TABSTOP); break; - case CM_CLOSE: + case IDM_CLOSE: DestroyWindow(hWnd); break; - case CM_ABOUT: + case IDM_ABOUT: MessageBox(hWnd,_T("Simple Control Panel (not Shell-namespace based)\rCopyright 2004 GkWare e.K.\rhttp://www.gkware.com\rReleased under the GPL"),_T("About the Control Panel"),MB_OK | MB_ICONINFORMATION); break; } diff --git a/reactos/lib/cpl/control/control.rc b/reactos/lib/cpl/control/control.rc index 292af968d2d..bc7d94eda54 100644 --- a/reactos/lib/cpl/control/control.rc +++ b/reactos/lib/cpl/control/control.rc @@ -21,18 +21,18 @@ IDM_MAINMENU MENU DISCARDABLE BEGIN POPUP "&File" BEGIN - MENUITEM "&Close", CM_CLOSE + MENUITEM "&Close", IDM_CLOSE END POPUP "&View" BEGIN - MENUITEM "Large Icons", CM_LARGEICONS - MENUITEM "Small Icons", CM_SMALLICONS - MENUITEM "List", CM_LIST - MENUITEM "Details", CM_DETAILS + MENUITEM "Large Icons", IDM_LARGEICONS + MENUITEM "Small Icons", IDM_SMALLICONS + MENUITEM "List", IDM_LIST + MENUITEM "Details", IDM_DETAILS END POPUP "Help" BEGIN - MENUITEM "About", CM_ABOUT + MENUITEM "About", IDM_ABOUT END END diff --git a/reactos/lib/cpl/control/resource.h b/reactos/lib/cpl/control/resource.h index 053c1da5f2c..8cce795056c 100644 --- a/reactos/lib/cpl/control/resource.h +++ b/reactos/lib/cpl/control/resource.h @@ -2,25 +2,21 @@ // Microsoft Developer Studio generated include file. // Used by control.rc // -#define IDR_MENU1 101 +#define IDI_MAINICON 100 #define IDM_MAINMENU 101 -#define IDI_MAINICON 104 -#define ID_VIEW_LARGEICONS 40002 -#define CM_LARGEICONS 40002 -#define ID_VIEW_SMALLICONS 40003 -#define CM_SMALLICONS 40003 -#define ID_HELP_ABOUT 40007 -#define CM_ABOUT 40007 -#define CM_CLOSE 40008 -#define CM_LIST 40009 -#define CM_DETAILS 40010 +#define IDM_LARGEICONS 40000 +#define IDM_SMALLICONS 40001 +#define IDM_LIST 40002 +#define IDM_DETAILS 40003 +#define IDM_ABOUT 40004 +#define IDM_CLOSE 40005 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 105 -#define _APS_NEXT_COMMAND_VALUE 40011 +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40006 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif From 2a6745d9d4fa42e08d8d0106ff195f56f1d9a5b6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 29 Jun 2004 12:04:42 +0000 Subject: [PATCH 126/356] Install control panel app and control panels. svn path=/trunk/; revision=9925 --- reactos/bootdata/packages/reactos.dff | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 6f33636d262..6efcbfde4ba 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -51,6 +51,9 @@ drivers\net\wshtcpip\wshtcpip.dll 1 drivers\net\dd\ne2000\ne2000.sys 2 lib\advapi32\advapi32.dll 1 lib\cards\cards.dll 1 +lib\cpl\appwiz\appwiz.cpl 1 +lib\cpl\control\control.exe 1 +lib\cpl\sysdm\sysdm.cpl 1 lib\comctl32\comctl32.dll 1 lib\comdlg32\comdlg32.dll 1 lib\crtdll\crtdll.dll 1 From b031cfa71751a1e415bf9a55c60fa03180f4ea6a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 29 Jun 2004 12:06:01 +0000 Subject: [PATCH 127/356] Set short path names for 'temp' and 'tmp' environment variables. svn path=/trunk/; revision=9926 --- reactos/lib/userenv/environment.c | 36 +++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/reactos/lib/userenv/environment.c b/reactos/lib/userenv/environment.c index 08c369552d6..7a44fa5d4f7 100644 --- a/reactos/lib/userenv/environment.c +++ b/reactos/lib/userenv/environment.c @@ -1,4 +1,4 @@ -/* $Id: environment.c,v 1.4 2004/06/25 11:42:00 ekohl Exp $ +/* $Id: environment.c,v 1.5 2004/06/29 12:06:01 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -21,6 +21,7 @@ SetUserEnvironmentVariable (LPVOID *Environment, LPWSTR lpValue, BOOL bExpand) { + WCHAR ShortName[MAX_PATH]; UNICODE_STRING Name; UNICODE_STRING SrcValue; UNICODE_STRING DstValue; @@ -36,8 +37,8 @@ SetUserEnvironmentVariable (LPVOID *Environment, DstValue.Length = 0; DstValue.MaximumLength = Length; - DstValue.Buffer = LocalAlloc (LPTR, - Length); + DstValue.Buffer = LocalAlloc(LPTR, + Length); if (DstValue.Buffer == NULL) { DPRINT1("LocalAlloc() failed\n"); @@ -50,8 +51,8 @@ SetUserEnvironmentVariable (LPVOID *Environment, &Length); if (!NT_SUCCESS(Status)) { - DPRINT1 ("RtlExpandEnvironmentStrings_U() failed (Status %lx)\n", Status); - DPRINT1 ("Length %lu\n", Length); + DPRINT1("RtlExpandEnvironmentStrings_U() failed (Status %lx)\n", Status); + DPRINT1("Length %lu\n", Length); return FALSE; } } @@ -61,14 +62,27 @@ SetUserEnvironmentVariable (LPVOID *Environment, lpValue); } - RtlInitUnicodeString (&Name, - lpName); + if (!_wcsicmp (lpName, L"temp") || !_wcsicmp (lpName, L"tmp")) + { + if (!GetShortPathNameW(DstValue.Buffer, ShortName, MAX_PATH)) + { + DPRINT1("GetShortPathNameW() failed (Error %lu)\n", GetLastError()); + return FALSE; + } + + DPRINT("Buffer: %S\n", ShortName); + RtlInitUnicodeString(&DstValue, + ShortName); + } + + RtlInitUnicodeString(&Name, + lpName); DPRINT("Value: %wZ\n", &DstValue); - Status = RtlSetEnvironmentVariable ((PWSTR*)Environment, - &Name, - &DstValue); + Status = RtlSetEnvironmentVariable((PWSTR*)Environment, + &Name, + &DstValue); if (bExpand) { @@ -77,7 +91,7 @@ SetUserEnvironmentVariable (LPVOID *Environment, if (!NT_SUCCESS(Status)) { - DPRINT1 ("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); + DPRINT1("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); return FALSE; } From f1a2c7a2d58081abc47a1e7536d92d925679f0bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 29 Jun 2004 13:40:40 +0000 Subject: [PATCH 128/356] Minimize Wine porting headers svn path=/trunk/; revision=9927 --- reactos/include/wine/shlguid.h | 86 +- reactos/include/wine/shlobj.h | 909 +----- reactos/include/wine/shobjidl.h | 4258 +--------------------------- reactos/include/wine/winnetwk.h | 388 +-- reactos/lib/shell32/pidl.c | 2 +- reactos/lib/shell32/shell32_main.c | 2 +- reactos/lib/shell32/shellole.c | 2 +- reactos/lib/shell32/shellord.c | 17 +- reactos/lib/shell32/shlfileop.c | 6 +- reactos/w32api/include/shlguid.h | 6 + reactos/w32api/include/shlobj.h | 251 +- reactos/w32api/include/winnetwk.h | 2 +- 12 files changed, 322 insertions(+), 5607 deletions(-) diff --git a/reactos/include/wine/shlguid.h b/reactos/include/wine/shlguid.h index 59cab255527..2d3efc7f330 100644 --- a/reactos/include/wine/shlguid.h +++ b/reactos/include/wine/shlguid.h @@ -1,62 +1,24 @@ -/* - * Copyright (C) 1999 Juergen Schmied +/* $Id: shlguid.h,v 1.4 2004/06/29 13:40:40 gvg Exp $ * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * Compatibility header * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This header is wrapper to allow compilation of Wine DLLs under ReactOS + * build system. It contains definitions commonly refered to as Wineisms + * and definitions that are missing in w32api. */ +#include_next + #ifndef __WINE_SHLGUID_H #define __WINE_SHLGUID_H -#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2) - DEFINE_SHLGUID(CLSID_ShellDesktop, 0x00021400L, 0, 0); DEFINE_SHLGUID(CLSID_ShellLink, 0x00021401L, 0, 0); -DEFINE_SHLGUID(CATID_BrowsableShellExt, 0x00021490L, 0, 0); -DEFINE_SHLGUID(CATID_BrowseInPlace, 0x00021491L, 0, 0); -DEFINE_SHLGUID(CATID_DeskBand, 0x00021492L, 0, 0); -DEFINE_SHLGUID(CATID_InfoBand, 0x00021493L, 0, 0); -DEFINE_SHLGUID(CATID_CommBand, 0x00021494L, 0, 0); - -/* shell32 formatids */ -DEFINE_SHLGUID(FMTID_Intshcut, 0x000214A0L, 0, 0); -DEFINE_SHLGUID(FMTID_InternetSite, 0x000214A1L, 0, 0); - /* command group ids */ DEFINE_SHLGUID(CGID_Explorer, 0x000214D0L, 0, 0); DEFINE_SHLGUID(CGID_ShellDocView, 0x000214D1L, 0, 0); -DEFINE_SHLGUID(CGID_ShellServiceObject, 0x000214D2L, 0, 0); -DEFINE_SHLGUID(CGID_ExplorerBarDoc, 0x000214D3L, 0, 0); -DEFINE_SHLGUID(IID_INewShortcutHookA, 0x000214E1L, 0, 0); -DEFINE_SHLGUID(IID_IShellIcon, 0x000214E5L, 0, 0); -DEFINE_SHLGUID(IID_IShellPropSheetExt, 0x000214E9L, 0, 0); -DEFINE_SHLGUID(IID_IShellDetails, 0x000214ECL, 0, 0); -DEFINE_SHLGUID(IID_IDelayedRelease, 0x000214EDL, 0, 0); -DEFINE_SHLGUID(IID_IShellCopyHookA, 0x000214EFL, 0, 0); -DEFINE_SHLGUID(IID_IFileViewerA, 0x000214F0L, 0, 0); -DEFINE_SHLGUID(IID_IFileViewerSite, 0x000214F3L, 0, 0); -DEFINE_SHLGUID(IID_IPropSheetPage, 0x000214F6L, 0, 0); -DEFINE_SHLGUID(IID_INewShortcutHookW, 0x000214F7L, 0, 0); -DEFINE_SHLGUID(IID_IFileViewerW, 0x000214F8L, 0, 0); -DEFINE_SHLGUID(IID_IShellCopyHookW, 0x000214FCL, 0, 0); -DEFINE_SHLGUID(IID_IRemoteComputer, 0x000214FEL, 0, 0); -DEFINE_SHLGUID(IID_IQueryInfo, 0x00021500L, 0, 0); - -/* avoid duplicate definitions with shobjidl.h (FIXME) */ -#ifdef __REACTOS__ DEFINE_SHLGUID(IID_IExtractIconA, 0x000214EBL, 0, 0); DEFINE_SHLGUID(IID_IExtractIconW, 0x000214FAL, 0, 0); DEFINE_SHLGUID(IID_IContextMenu, 0x000214E4L, 0, 0); @@ -70,48 +32,20 @@ DEFINE_SHLGUID(IID_IPersistFolder, 0x000214EAL, 0, 0); DEFINE_SHLGUID(IID_IShellLinkA, 0x000214EEL, 0, 0); DEFINE_SHLGUID(IID_IEnumIDList, 0x000214F2L, 0, 0); DEFINE_SHLGUID(IID_IShellLinkW, 0x000214F9L, 0, 0); -#endif -/* DEFINE_SHLGUID(IID_IShellExecuteHookA, 0x000214F5L, 0, 0); */ -/* DEFINE_SHLGUID(IID_IShellExecuteHookW, 0x000214FBL, 0, 0); */ +DEFINE_SHLGUID(IID_IShellExecuteHookA, 0x000214F5L, 0, 0); +DEFINE_SHLGUID(IID_IShellExecuteHookW, 0x000214FBL, 0, 0); DEFINE_GUID(SID_STopLevelBrowser, 0x4C96BE40L, 0x915C, 0x11CF, 0x99, 0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37); -#define SID_SShellBrowser IID_IShellBrowser - -#define IID_IFileViewer WINELIB_NAME_AW(IID_IFileViewer) -#define IID_IShellLink WINELIB_NAME_AW(IID_IShellLink) -#define IID_IExtractIcon WINELIB_NAME_AW(IID_IExtractIcon) -#define IID_IShellCopyHook WINELIB_NAME_AW(IID_IShellCopyHook) -#define IID_IShellExecuteHook WINELIB_NAME_AW(IID_IShellExecuteHook) -#define IID_INewShortcutHook WINELIB_NAME_AW(IID_INewShortcutHook) - -DEFINE_GUID (IID_IDockingWindow, 0x012dd920L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); -DEFINE_GUID (IID_IDockingWindowSite, 0x2A342FC2L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); - -/**************************************************************************** - * the next IID's are the namespace elements of the pidls - */ DEFINE_GUID(CLSID_NetworkPlaces, 0x208D2C60, 0x3AEA, 0x1069, 0xA2, 0xD7, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D); -DEFINE_GUID(CLSID_NetworkDomain, 0x46e06680, 0x4bf0, 0x11d1, 0x83, 0xee, 0x00, 0xa0, 0xc9, 0x0d, 0xc8, 0x49); -DEFINE_GUID(CLSID_NetworkServer, 0xc0542a90, 0x4bf0, 0x11d1, 0x83, 0xee, 0x00, 0xa0, 0xc9, 0x0d, 0xc8, 0x49); -DEFINE_GUID(CLSID_NetworkShare, 0x54a754c0, 0x4bf0, 0x11d1, 0x83, 0xee, 0x00, 0xa0, 0xc9, 0x0d, 0xc8, 0x49); DEFINE_GUID(CLSID_MyComputer, 0x20D04FE0, 0x3AEA, 0x1069, 0xA2, 0xD8, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D); DEFINE_GUID(CLSID_Internet, 0x871C5380, 0x42A0, 0x1069, 0xA2, 0xEA, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D); DEFINE_GUID(CLSID_ShellFSFolder, 0xF3364BA0, 0x65B9, 0x11CE, 0xA9, 0xBA, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37); DEFINE_GUID(CLSID_RecycleBin, 0x645FF040, 0x5081, 0x101B, 0x9F, 0x08, 0x00, 0xAA, 0x00, 0x2F, 0x95, 0x4E); DEFINE_GUID(CLSID_ControlPanel, 0x21EC2020, 0x3AEA, 0x1069, 0xA2, 0xDD, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D); -DEFINE_GUID(CLSID_Printers, 0x2227A280, 0x3AEA, 0x1069, 0xA2, 0xDE, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D); -DEFINE_GUID(CLSID_MyDocuments, 0x450d8fba, 0xad25, 0x11d0, 0x98, 0xa8, 0x08, 0x00, 0x36, 0x1b, 0x11, 0x03); DEFINE_GUID(IID_IQueryAssociations, 0xc46ca590, 0x3c3f, 0x11d2, 0xbe, 0xe6, 0x00, 0x00, 0xf8, 0x05, 0xca, 0x57); DEFINE_GUID(CLSID_DragDropHelper, 0x4657278a, 0x411b, 0x11d2, 0x83, 0x9a, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0); -#define PID_FINDDATA 0 -#define PID_NETRESOURCE 1 -#define PID_DESCRIPTIONID 2 -#define PID_WHICHFOLDER 3 -#define PID_NETWORKLOCATION 4 -#define PID_COMPUTERNAME 5 - -#endif /* __WINE_SHLGUID_H */ +#endif /* __WINE_SHLOBJ_H */ diff --git a/reactos/include/wine/shlobj.h b/reactos/include/wine/shlobj.h index 5a3714800a8..21670e32857 100644 --- a/reactos/include/wine/shlobj.h +++ b/reactos/include/wine/shlobj.h @@ -1,129 +1,24 @@ -/* - * Copyright (C) the Wine project +/* $Id: shlobj.h,v 1.4 2004/06/29 13:40:40 gvg Exp $ * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * Compatibility header * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This header is wrapper to allow compilation of Wine DLLs under ReactOS + * build system. It contains definitions commonly refered to as Wineisms + * and definitions that are missing in w32api. */ +#include + +#include_next + +#include +#include + #ifndef __WINE_SHLOBJ_H #define __WINE_SHLOBJ_H -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* defined(__cplusplus) */ - -#include - -#include -#include - - -LPVOID WINAPI SHAlloc(ULONG); -HRESULT WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,IUnknown*,REFIID,LPVOID*); -HRESULT WINAPI SHCreateStdEnumFmtEtc(DWORD,const FORMATETC *,IEnumFORMATETC**); -BOOL WINAPI SHFindFiles(LPCITEMIDLIST,LPCITEMIDLIST); -void WINAPI SHFree(LPVOID); -BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl,LPSTR pszPath); -BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl,LPWSTR pszPath); -#define SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList) -HRESULT WINAPI SHILCreateFromPath(LPCWSTR,LPITEMIDLIST*,DWORD*); -LPITEMIDLIST WINAPI SHSimpleIDListFromPath(LPCWSTR); -int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder*,LPCITEMIDLIST,int*); - -LPITEMIDLIST WINAPI ILAppendID(LPITEMIDLIST,LPCSHITEMID,BOOL); -LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST); -LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST); -LPITEMIDLIST WINAPI ILCreateFromPathA(LPCSTR); -LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR); -#define ILCreateFromPath WINELIB_NAME_AW(ILCreateFromPath) -LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST,LPCITEMIDLIST); -LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST,LPCITEMIDLIST); -LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST); -void WINAPI ILFree(LPITEMIDLIST); -LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST); -UINT WINAPI ILGetSize(LPCITEMIDLIST); -BOOL WINAPI ILIsEqual(LPCITEMIDLIST,LPCITEMIDLIST); -BOOL WINAPI ILIsParent(LPCITEMIDLIST,LPCITEMIDLIST,BOOL); -BOOL WINAPI ILRemoveLastID(LPCITEMIDLIST); - -HRESULT WINAPI SHCoCreateInstance(LPCWSTR, const CLSID*, LPUNKNOWN, REFIID, LPVOID*); - -BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath); -BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath); -#define SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList) - -/***************************************************************************** - * Predeclare interfaces - */ -typedef struct IShellIcon IShellIcon, *LPSHELLICON; - - -/***************************************************************************** - * IContextMenu interface - */ - - -/* DATAOBJECT_InitShellIDList*/ -#define CFSTR_SHELLIDLIST "Shell IDList Array" /* CF_IDLIST */ - -extern UINT cfShellIDList; - -typedef struct -{ UINT cidl; - UINT aoffset[1]; -} CIDA, *LPIDA; - -#define CFSTR_SHELLIDLISTOFFSET "Shell Object Offsets" /* CF_OBJECTPOSITIONS */ -#define CFSTR_NETRESOURCES "Net Resource" /* CF_NETRESOURCE */ - -/* DATAOBJECT_InitFileGroupDesc */ -#define CFSTR_FILEDESCRIPTORA "FileGroupDescriptor" /* CF_FILEGROUPDESCRIPTORA */ -extern UINT cfFileGroupDesc; - -#define CFSTR_FILEDESCRIPTORW "FileGroupDescriptorW" /* CF_FILEGROUPDESCRIPTORW */ - -/* DATAOBJECT_InitFileContents*/ -#define CFSTR_FILECONTENTS "FileContents" /* CF_FILECONTENTS */ -extern UINT cfFileContents; - -#define CFSTR_FILENAMEA "FileName" /* CF_FILENAMEA */ -#define CFSTR_FILENAMEW "FileNameW" /* CF_FILENAMEW */ -#define CFSTR_PRINTERGROUP "PrinterFriendlyName" /* CF_PRINTERS */ -#define CFSTR_FILENAMEMAPA "FileNameMap" /* CF_FILENAMEMAPA */ -#define CFSTR_FILENAMEMAPW "FileNameMapW" /* CF_FILENAMEMAPW */ -#define CFSTR_SHELLURL "UniformResourceLocator" -#define CFSTR_PREFERREDDROPEFFECT "Preferred DropEffect" -#define CFSTR_PERFORMEDDROPEFFECT "Performed DropEffect" -#define CFSTR_PASTESUCCEEDED "Paste Succeeded" -#define CFSTR_INDRAGLOOP "InShellDragLoop" - -#define CFSTR_FILENAME WINELIB_NAME_AW(CFSTR_FILENAME) - - -/************************************************************************ -* IShellView interface -*/ - -typedef GUID SHELLVIEWID; #define SV_CLASS_NAME ("SHELLDLL_DefView") -#define FCIDM_SHVIEWFIRST 0x0000 /* undocumented */ #define FCIDM_SHVIEW_ARRANGE 0x7001 #define FCIDM_SHVIEW_DELETE 0x7011 @@ -154,8 +49,6 @@ typedef GUID SHELLVIEWID; #define FCIDM_SHVIEW_EXPLORE 0x7101 /* FIXME */ #define FCIDM_SHVIEW_OPEN 0x7102 /* FIXME */ -#define FCIDM_SHVIEWLAST 0x7fff -#define FCIDM_BROWSERFIRST 0xA000 /* undocumented toolbar items from stddlg's*/ #define FCIDM_TB_UPFOLDER 0xA001 #define FCIDM_TB_NEWFOLDER 0xA002 @@ -163,719 +56,16 @@ typedef GUID SHELLVIEWID; #define FCIDM_TB_REPORTVIEW 0xA004 #define FCIDM_TB_DESKTOP 0xA005 /* FIXME */ -#define FCIDM_BROWSERLAST 0xbf00 -#define FCIDM_GLOBALFIRST 0x8000 -#define FCIDM_GLOBALLAST 0x9fff - -/* -* Global submenu IDs and separator IDs -*/ -#define FCIDM_MENU_FILE (FCIDM_GLOBALFIRST+0x0000) -#define FCIDM_MENU_EDIT (FCIDM_GLOBALFIRST+0x0040) -#define FCIDM_MENU_VIEW (FCIDM_GLOBALFIRST+0x0080) -#define FCIDM_MENU_VIEW_SEP_OPTIONS (FCIDM_GLOBALFIRST+0x0081) -#define FCIDM_MENU_TOOLS (FCIDM_GLOBALFIRST+0x00c0) -#define FCIDM_MENU_TOOLS_SEP_GOTO (FCIDM_GLOBALFIRST+0x00c1) -#define FCIDM_MENU_HELP (FCIDM_GLOBALFIRST+0x0100) -#define FCIDM_MENU_FIND (FCIDM_GLOBALFIRST+0x0140) -#define FCIDM_MENU_EXPLORE (FCIDM_GLOBALFIRST+0x0150) -#define FCIDM_MENU_FAVORITES (FCIDM_GLOBALFIRST+0x0170) - -/* control IDs known to the view */ -#define FCIDM_TOOLBAR (FCIDM_BROWSERFIRST + 0) -#define FCIDM_STATUS (FCIDM_BROWSERFIRST + 1) - - -/**************************************************************************** - * IShellIcon interface - */ - -#define INTERFACE IShellIcon -#define IShellIcon_METHODS \ - IUnknown_METHODS \ - STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST pidl, UINT flags, LPINT lpIconIndex) PURE; -ICOM_DEFINE(IShellIcon, IUnknown) -#undef INTERFACE - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IShellIcon_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellIcon_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellIcon_Release(p) (p)->lpVtbl->Release(p) -/*** IShellIcon methods ***/ -#define IShellIcon_GetIconOf(p,a,b,c) (p)->lpVtbl->GetIconOf(p,a,b,c) -#endif - -/**************************************************************************** -* SHAddToRecentDocs API -*/ -#define SHARD_PIDL 0x00000001L -#define SHARD_PATHA 0x00000002L -#define SHARD_PATHW 0x00000003L -#define SHARD_PATH WINELIB_NAME_AW(SHARD_PATH) - -DWORD WINAPI SHAddToRecentDocs(UINT uFlags, LPCVOID pv); - -/**************************************************************************** - * SHBrowseForFolder API - */ -typedef INT (CALLBACK *BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); - -typedef struct tagBROWSEINFOA { - HWND hwndOwner; - LPCITEMIDLIST pidlRoot; - LPSTR pszDisplayName; - LPCSTR lpszTitle; - UINT ulFlags; - BFFCALLBACK lpfn; - LPARAM lParam; - INT iImage; -} BROWSEINFOA, *PBROWSEINFOA, *LPBROWSEINFOA; - -typedef struct tagBROWSEINFOW { - HWND hwndOwner; - LPCITEMIDLIST pidlRoot; - LPWSTR pszDisplayName; - LPCWSTR lpszTitle; - UINT ulFlags; - BFFCALLBACK lpfn; - LPARAM lParam; - INT iImage; -} BROWSEINFOW, *PBROWSEINFOW, *LPBROWSEINFOW; - -#define BROWSEINFO WINELIB_NAME_AW(BROWSEINFO) -#define PBROWSEINFO WINELIB_NAME_AW(PBROWSEINFO) -#define LPBROWSEINFO WINELIB_NAME_AW(LPBROWSEINFO) - -/* Browsing for directory. */ -#define BIF_RETURNONLYFSDIRS 0x0001 -#define BIF_DONTGOBELOWDOMAIN 0x0002 -#define BIF_STATUSTEXT 0x0004 -#define BIF_RETURNFSANCESTORS 0x0008 -#define BIF_EDITBOX 0x0010 -#define BIF_VALIDATE 0x0020 -#define BIF_NEWDIALOGSTYLE 0x0040 - -#define BIF_BROWSEFORCOMPUTER 0x1000 -#define BIF_BROWSEFORPRINTER 0x2000 -#define BIF_BROWSEINCLUDEFILES 0x4000 - -/* message from browser */ -#define BFFM_INITIALIZED 1 -#define BFFM_SELCHANGED 2 -#define BFFM_VALIDATEFAILEDA 3 /* lParam:szPath ret:1(cont),0(EndDialog) */ -#define BFFM_VALIDATEFAILEDW 4 /* lParam:wzPath ret:1(cont),0(EndDialog) */ - -/* messages to browser */ -#define BFFM_SETSTATUSTEXTA (WM_USER+100) -#define BFFM_ENABLEOK (WM_USER+101) -#define BFFM_SETSELECTIONA (WM_USER+102) -#define BFFM_SETSELECTIONW (WM_USER+103) -#define BFFM_SETSTATUSTEXTW (WM_USER+104) -#define BFFM_SETOKTEXT (WM_USER+105) -#define BFFM_SETEXPANDED (WM_USER+106) - -LPITEMIDLIST WINAPI SHBrowseForFolderA(LPBROWSEINFOA lpbi); -LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi); -#define SHBrowseForFolder WINELIB_NAME_AW(SHBrowseForFolder) -#define BFFM_SETSTATUSTEXT WINELIB_NAME_AW(BFFM_SETSTATUSTEXT) -#define BFFM_SETSELECTION WINELIB_NAME_AW(BFFM_SETSELECTION) -#define BFFM_VALIDATEFAILED WINELIB_NAME_AW(BFFM_VALIDATEFAILED) - -/**************************************************************************** -* SHGetDataFromIDList API -*/ -#define SHGDFIL_FINDDATA 1 -#define SHGDFIL_NETRESOURCE 2 -#define SHGDFIL_DESCRIPTIONID 3 - -#define SHDID_ROOT_REGITEM 1 -#define SHDID_FS_FILE 2 -#define SHDID_FS_DIRECTORY 3 -#define SHDID_FS_OTHER 4 -#define SHDID_COMPUTER_DRIVE35 5 -#define SHDID_COMPUTER_DRIVE525 6 -#define SHDID_COMPUTER_REMOVABLE 7 -#define SHDID_COMPUTER_FIXED 8 -#define SHDID_COMPUTER_NETDRIVE 9 -#define SHDID_COMPUTER_CDROM 10 -#define SHDID_COMPUTER_RAMDISK 11 -#define SHDID_COMPUTER_OTHER 12 -#define SHDID_NET_DOMAIN 13 -#define SHDID_NET_SERVER 14 -#define SHDID_NET_SHARE 15 -#define SHDID_NET_RESTOFNET 16 -#define SHDID_NET_OTHER 17 -#define SHDID_COMPUTER_IMAGING 18 -#define SHDID_COMPUTER_AUDIO 19 -#define SHDID_COMPUTER_SHAREDDOCS 20 - -typedef struct _SHDESCRIPTIONID -{ DWORD dwDescriptionId; - CLSID clsid; -} SHDESCRIPTIONID, *LPSHDESCRIPTIONID; - -HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID pv, int cb); -HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID pv, int cb); -#define SHGetDataFromIDList WINELIB_NAME_AW(SHGetDataFromIDList) - -BOOL WINAPI SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR szPath, int nFolder, BOOL bCreate); -BOOL WINAPI SHGetSpecialFolderPathW (HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate); -#define SHGetSpecialFolderPath WINELIB_NAME_AW(SHGetSpecialFolderPath) - -/**************************************************************************** -* shlview structures -*/ - -/* -* IShellFolderViewCallback Callback -* This "callback" is called by the shells default IShellView implementation (that -* we got using SHCreateShellViewEx()), to notify us of the various things that -* are happening to the shellview (and ask for things too). -* -* You don't have to support anything here - anything you don't want to -* handle, the shell will do itself if you just return E_NOTIMPL. This parameters -* that the shell passes to this function are entirely undocumented. -* -* HOWEVER, as the cabview sample as originally written used this callback, the -* writers implemented the callback mechanism on top of their own IShellView. -* Look there for some clues on what to do here. -*/ - -typedef HRESULT (CALLBACK *SHELLVIEWPROC)(DWORD dwUserParam,LPSHELLFOLDER psf, - HWND hwnd,UINT uMsg,UINT wParam,LPARAM lParam); - -/* NF valid values for the "viewmode" item of the SHELLTEMPLATE*/ -#define NF_INHERITVIEW 0x0000 -#define NF_LOCALVIEW 0x0001 - -typedef struct _SHELLVIEWDATA /* idl */ -{ DWORD dwSize; - LPSHELLFOLDER pShellFolder; - DWORD dwUserParam; - LPCITEMIDLIST pidl; - DWORD v3; /* always 0 */ - SHELLVIEWPROC pCallBack; - DWORD viewmode; /* NF_* enum */ -} SHELLVIEWDATA, * LPSHELLVIEWDATA; - -HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) ; - -/********************************************************************** - * SHGetSetSettings () - */ - -typedef struct -{ - BOOL fShowAllObjects : 1; - BOOL fShowExtensions : 1; - BOOL fNoConfirmRecycle : 1; - - BOOL fShowSysFiles : 1; - BOOL fShowCompColor : 1; - BOOL fDoubleClickInWebView : 1; - BOOL fDesktopHTML : 1; - BOOL fWin95Classic : 1; - BOOL fDontPrettyPath : 1; - BOOL fShowAttribCol : 1; - BOOL fMapNetDrvBtn : 1; - BOOL fShowInfoTip : 1; - BOOL fHideIcons : 1; - BOOL fWebView : 1; - BOOL fFilter : 1; - BOOL fShowSuperHidden : 1; - BOOL fNoNetCrawling : 1; - - DWORD dwWin95Unused; - UINT uWin95Unused; - LONG lParamSort; - int iSortDirection; - UINT version; - UINT uNotUsed; - BOOL fSepProcess: 1; - BOOL fStartPanelOn: 1; - BOOL fShowStartPage: 1; - UINT fSpareFlags : 13; -} SHELLSTATE, *LPSHELLSTATE; - -/********************************************************************** - * SHGetSettings () - */ -typedef struct -{ BOOL fShowAllObjects : 1; - BOOL fShowExtensions : 1; - BOOL fNoConfirmRecycle : 1; - BOOL fShowSysFiles : 1; - - BOOL fShowCompColor : 1; - BOOL fDoubleClickInWebView : 1; - BOOL fDesktopHTML : 1; - BOOL fWin95Classic : 1; - - BOOL fDontPrettyPath : 1; - BOOL fShowAttribCol : 1; - BOOL fMapNetDrvBtn : 1; - BOOL fShowInfoTip : 1; - - BOOL fHideIcons : 1; - UINT fRestFlags : 3; -} SHELLFLAGSTATE, * LPSHELLFLAGSTATE; - -VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask); - -#define SSF_SHOWALLOBJECTS 0x0001 -#define SSF_SHOWEXTENSIONS 0x0002 -#define SSF_SHOWCOMPCOLOR 0x0008 -#define SSF_SHOWSYSFILES 0x0020 -#define SSF_DOUBLECLICKINWEBVIEW 0x0080 -#define SSF_SHOWATTRIBCOL 0x0100 -#define SSF_DESKTOPHTML 0x0200 -#define SSF_WIN95CLASSIC 0x0400 -#define SSF_DONTPRETTYPATH 0x0800 -#define SSF_SHOWINFOTIP 0x2000 -#define SSF_MAPNETDRVBUTTON 0x1000 -#define SSF_NOCONFIRMRECYCLE 0x8000 -#define SSF_HIDEICONS 0x4000 - -/**************************************************************************** -* SHRestricted API -*/ -typedef enum RESTRICTIONS -{ - REST_NONE = 0x00000000, - REST_NORUN = 0x00000001, - REST_NOCLOSE = 0x00000002, - REST_NOSAVESET = 0x00000004, - REST_NOFILEMENU = 0x00000008, - REST_NOSETFOLDERS = 0x00000010, - REST_NOSETTASKBAR = 0x00000020, - REST_NODESKTOP = 0x00000040, - REST_NOFIND = 0x00000080, - REST_NODRIVES = 0x00000100, - REST_NODRIVEAUTORUN = 0x00000200, - REST_NODRIVETYPEAUTORUN = 0x00000400, - REST_NONETHOOD = 0x00000800, - REST_STARTBANNER = 0x00001000, - REST_RESTRICTRUN = 0x00002000, - REST_NOPRINTERTABS = 0x00004000, - REST_NOPRINTERDELETE = 0x00008000, - REST_NOPRINTERADD = 0x00010000, - REST_NOSTARTMENUSUBFOLDERS = 0x00020000, - REST_MYDOCSONNET = 0x00040000, - REST_NOEXITTODOS = 0x00080000, - REST_ENFORCESHELLEXTSECURITY = 0x00100000, - REST_LINKRESOLVEIGNORELINKINFO = 0x00200000, - REST_NOCOMMONGROUPS = 0x00400000, - REST_SEPARATEDESKTOPPROCESS = 0x00800000, - REST_NOWEB = 0x01000000, - REST_NOTRAYCONTEXTMENU = 0x02000000, - REST_NOVIEWCONTEXTMENU = 0x04000000, - REST_NONETCONNECTDISCONNECT = 0x08000000, - REST_STARTMENULOGOFF = 0x10000000, - REST_NOSETTINGSASSIST = 0x20000000, - REST_NOINTERNETICON = 0x40000001, - REST_NORECENTDOCSHISTORY, - REST_NORECENTDOCSMENU, - REST_NOACTIVEDESKTOP, - REST_NOACTIVEDESKTOPCHANGES, - REST_NOFAVORITESMENU, - REST_CLEARRECENTDOCSONEXIT, - REST_CLASSICSHELL, - REST_NOCUSTOMIZEWEBVIEW, - - REST_NOHTMLWALLPAPER = 0x40000010, - REST_NOCHANGINGWALLPAPER, - REST_NODESKCOMP, - REST_NOADDDESKCOMP, - REST_NODELDESKCOMP, - REST_NOCLOSEDESKCOMP, - REST_NOCLOSE_DRAGDROPBAND, - REST_NOMOVINGBAND, - REST_NOEDITDESKCOMP, - REST_NORESOLVESEARCH, - REST_NORESOLVETRACK, - REST_FORCECOPYACLWITHFILE, - REST_NOLOGO3CHANNELNOTIFY, - REST_NOFORGETSOFTWAREUPDATE, - REST_NOSETACTIVEDESKTOP, - REST_NOUPDATEWINDOWS, - REST_NOCHANGESTARMENU, /* 0x40000020 */ - REST_NOFOLDEROPTIONS, - REST_HASFINDCOMPUTERS, - REST_INTELLIMENUS, - REST_RUNDLGMEMCHECKBOX, - REST_ARP_ShowPostSetup, - REST_NOCSC, - REST_NOCONTROLPANEL, - REST_ENUMWORKGROUP, - REST_ARP_NOARP, - REST_ARP_NOREMOVEPAGE, - REST_ARP_NOADDPAGE, - REST_ARP_NOWINSETUPPAGE, - REST_GREYMSIADS, - REST_NOCHANGEMAPPEDDRIVELABEL, - REST_NOCHANGEMAPPEDDRIVECOMMENT, - REST_MaxRecentDocs, /* 0x40000030 */ - REST_NONETWORKCONNECTIONS, - REST_FORCESTARTMENULOGOFF, - REST_NOWEBVIEW, - REST_NOCUSTOMIZETHISFOLDER, - REST_NOENCRYPTION, - - REST_ALLOWFRENCHENCRYPTION, /* not documented */ - - REST_DONTSHOWSUPERHIDDEN, - REST_NOSHELLSEARCHBUTTON, - REST_NOHARDWARETAB, - REST_NORUNASINSTALLPROMPT, - REST_PROMPTRUNASINSTALLNETPATH, - REST_NOMANAGEMYCOMPUTERVERB, - REST_NORECENTDOCSNETHOOD, - REST_DISALLOWRUN, - REST_NOWELCOMESCREEN, - REST_RESTRICTCPL, /* 0x40000040 */ - REST_DISALLOWCPL, - REST_NOSMBALLOONTIP, - REST_NOSMHELP, - REST_NOWINKEYS, - REST_NOENCRYPTONMOVE, - REST_NOLOCALMACHINERUN, - REST_NOCURRENTUSERRUN, - REST_NOLOCALMACHINERUNONCE, - REST_NOCURRENTUSERRUNONCE, - REST_FORCEACTIVEDESKTOPON, - REST_NOCOMPUTERSNEARME, - REST_NOVIEWONDRIVE, - REST_NONETCRAWL, - REST_NOSHAREDDOCUMENTS, - REST_NOSMMYDOCS, - REST_NOSMMYPICS, /* 0x40000050 */ - REST_ALLOWBITBUCKDRIVES, - REST_NONLEGACYSHELLMODE, - REST_NOCONTROLPANELBARRICADE, - REST_NOSTARTPAGE, - REST_NOAUTOTRAYNOTIFY, - REST_NOTASKGROUPING, - REST_NOCDBURNING, - REST_MYCOMPNOPROP, - REST_MYDOCSNOPROP, - REST_NOSTARTPANEL, - REST_NODISPLAYAPPEARANCEPAGE, - REST_NOTHEMESTAB, - REST_NOVISUALSTYLECHOICE, - REST_NOSIZECHOICE, - REST_NOCOLORCHOICE, - REST_SETVISUALSTYLE, /* 0x40000060 */ - REST_STARTRUNNOHOMEPATH, - REST_NOUSERNAMEINSTARTPANEL, - REST_NOMYCOMPUTERICON, - REST_NOSMNETWORKPLACES, - REST_NOSMPINNEDLIST, - REST_NOSMMYMUSIC, - REST_NOSMEJECTPC, - REST_NOSMMOREPROGRAMS, - REST_NOSMMFUPROGRAMS, - REST_NOTRAYITEMSDISPLAY, - REST_NOTOOLBARSONTASKBAR, - /* 0x4000006C - 0x4000006D - 0x4000006E */ - REST_NOSMCONFIGUREPROGRAMS = 0x4000006F, - REST_HIDECLOCK, /* 0x40000070 */ - REST_NOLOWDISKSPACECHECKS, - REST_NOENTIRENETWORK, - REST_NODESKTOPCLEANUP, - REST_BITBUCKNUKEONDELETE, - REST_BITBUCKCONFIRMDELETE, - REST_BITBUCKNOPROP, - REST_NODISPBACKGROUND, - REST_NODISPSCREENSAVEPG, - REST_NODISPSETTINGSPG, - REST_NODISPSCREENSAVEPREVIEW, - REST_NODISPLAYCPL, - REST_HIDERUNASVERB, - REST_NOTHUMBNAILCACHE, - REST_NOSTRCMPLOGICAL, - REST_NOPUBLISHWIZARD, - REST_NOONLINEPRINTSWIZARD, /* 0x40000080 */ - REST_NOWEBSERVICES, - REST_ALLOWUNHASHEDWEBVIEW, - REST_ALLOWLEGACYWEBVIEW, - REST_REVERTWEBVIEWSECURITY, - - REST_INHERITCONSOLEHANDLES = 0x40000086, - - REST_NODISCONNECT = 0x41000001, - REST_NOSECURITY, - REST_NOFILEASSOCIATE, /* 0x41000003 */ -} RESTRICTIONS; - -DWORD WINAPI SHRestricted(RESTRICTIONS rest); - -/**************************************************************************** -* SHChangeNotify API -*/ -typedef struct _SHChangeNotifyEntry -{ - LPCITEMIDLIST pidl; - BOOL fRecursive; -} SHChangeNotifyEntry; - -#define SHCNE_RENAMEITEM 0x00000001 -#define SHCNE_CREATE 0x00000002 -#define SHCNE_DELETE 0x00000004 -#define SHCNE_MKDIR 0x00000008 -#define SHCNE_RMDIR 0x00000010 -#define SHCNE_MEDIAINSERTED 0x00000020 -#define SHCNE_MEDIAREMOVED 0x00000040 -#define SHCNE_DRIVEREMOVED 0x00000080 -#define SHCNE_DRIVEADD 0x00000100 -#define SHCNE_NETSHARE 0x00000200 -#define SHCNE_NETUNSHARE 0x00000400 -#define SHCNE_ATTRIBUTES 0x00000800 -#define SHCNE_UPDATEDIR 0x00001000 -#define SHCNE_UPDATEITEM 0x00002000 -#define SHCNE_SERVERDISCONNECT 0x00004000 -#define SHCNE_UPDATEIMAGE 0x00008000 -#define SHCNE_DRIVEADDGUI 0x00010000 -#define SHCNE_RENAMEFOLDER 0x00020000 -#define SHCNE_FREESPACE 0x00040000 - -#define SHCNE_EXTENDED_EVENT 0x04000000 -#define SHCNE_ASSOCCHANGED 0x08000000 -#define SHCNE_DISKEVENTS 0x0002381F -#define SHCNE_GLOBALEVENTS 0x0C0581E0 -#define SHCNE_ALLEVENTS 0x7FFFFFFF -#define SHCNE_INTERRUPT 0x80000000 - -#define SHCNEE_ORDERCHANGED 0x0002L -#define SHCNEE_MSI_CHANGE 0x0004L -#define SHCNEE_MSI_UNINSTALL 0x0005L - -#define SHCNF_IDLIST 0x0000 -#define SHCNF_PATHA 0x0001 -#define SHCNF_PRINTERA 0x0002 -#define SHCNF_DWORD 0x0003 -#define SHCNF_PATHW 0x0005 -#define SHCNF_PRINTERW 0x0006 -#define SHCNF_TYPE 0x00FF -#define SHCNF_FLUSH 0x1000 -#define SHCNF_FLUSHNOWAIT 0x2000 - -#define SHCNF_PATH WINELIB_NAME_AW(SHCNF_PATH) -#define SHCNF_PRINTER WINELIB_NAME_AW(SHCNF_PRINTER) - -void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2); - -/* - * IShellChangeNotify - */ -typedef struct IShellChangeNotify IShellChangeNotify, *LPSHELLCHANGENOTIFY; - -#define INTERFACE IShellChangeNotify -#define IShellChangeNotify_METHODS \ - IUnknown_METHODS \ - STDMETHOD(OnChange)(THIS_ LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; - -ICOM_DEFINE(IShellChangeNotify, IUnknown) -#undef INTERFACE - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IShellChangeNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellChangeNotify_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellChangeNotify_Release(p) (p)->lpVtbl->Release(p) -/*** IShellChangeNotify methods ***/ -#define IShellChangeNotify_OnChange(p,a,b,c) (p)->lpVtbl->OnChange(p,a,b,c) -#endif - -typedef struct _SHChangeDWORDAsIDList { - USHORT cb; - DWORD dwItem1; - DWORD dwItem2; - USHORT cbZero; -} SHChangeDWORDAsIDList, *LPSHChangeDWORDAsIDList; - -typedef struct _SHChangeProductKeyAsIDList { - USHORT cb; - WCHAR wszProductKey[39]; - USHORT cbZero; -} SHChangeProductKeyAsIDList, *LPSHChangeProductKeyAsIDList; - -ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, int fSources, LONG fEvents, UINT wMsg, - int cEntries, SHChangeNotifyEntry *pshcne); -BOOL WINAPI SHChangeNotifyDeregister(ULONG ulID); -HANDLE WINAPI SHChangeNotification_Lock(HANDLE hChangeNotification, DWORD dwProcessId, - LPITEMIDLIST **pppidl, LONG *plEvent); -BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock); - -HRESULT WINAPI SHGetRealIDL(IShellFolder *psf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST * ppidlReal); - -/**************************************************************************** -* SHCreateDirectory API -*/ -DWORD WINAPI SHCreateDirectory(HWND, LPCVOID); -DWORD WINAPI SHCreateDirectoryExA(HWND, LPCSTR, LPSECURITY_ATTRIBUTES); -DWORD WINAPI SHCreateDirectoryExW(HWND, LPCWSTR, LPSECURITY_ATTRIBUTES); - -/**************************************************************************** -* SHGetSpecialFolderLocation API -*/ -HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, int nFolder, LPITEMIDLIST * ppidl); -HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl); - -#define CSIDL_DESKTOP 0x0000 -#define CSIDL_INTERNET 0x0001 -#define CSIDL_PROGRAMS 0x0002 -#define CSIDL_CONTROLS 0x0003 -#define CSIDL_PRINTERS 0x0004 -#define CSIDL_PERSONAL 0x0005 -#define CSIDL_FAVORITES 0x0006 -#define CSIDL_STARTUP 0x0007 -#define CSIDL_RECENT 0x0008 -#define CSIDL_SENDTO 0x0009 -#define CSIDL_BITBUCKET 0x000a -#define CSIDL_STARTMENU 0x000b -#define CSIDL_MYDOCUMENTS 0x000c -#define CSIDL_MYMUSIC 0x000d -#define CSIDL_MYVIDEO 0x000e -#define CSIDL_DESKTOPDIRECTORY 0x0010 -#define CSIDL_DRIVES 0x0011 -#define CSIDL_NETWORK 0x0012 -#define CSIDL_NETHOOD 0x0013 -#define CSIDL_FONTS 0x0014 -#define CSIDL_TEMPLATES 0x0015 -#define CSIDL_COMMON_STARTMENU 0x0016 -#define CSIDL_COMMON_PROGRAMS 0X0017 -#define CSIDL_COMMON_STARTUP 0x0018 -#define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 -#define CSIDL_APPDATA 0x001a -#define CSIDL_PRINTHOOD 0x001b -#define CSIDL_LOCAL_APPDATA 0x001c -#define CSIDL_ALTSTARTUP 0x001d -#define CSIDL_COMMON_ALTSTARTUP 0x001e -#define CSIDL_COMMON_FAVORITES 0x001f -#define CSIDL_INTERNET_CACHE 0x0020 -#define CSIDL_COOKIES 0x0021 -#define CSIDL_HISTORY 0x0022 -#define CSIDL_COMMON_APPDATA 0x0023 -#define CSIDL_WINDOWS 0x0024 -#define CSIDL_SYSTEM 0x0025 -#define CSIDL_PROGRAM_FILES 0x0026 -#define CSIDL_MYPICTURES 0x0027 -#define CSIDL_PROFILE 0x0028 -#define CSIDL_SYSTEMX86 0x0029 -#define CSIDL_PROGRAM_FILESX86 0x002a -#define CSIDL_PROGRAM_FILES_COMMON 0x002b -#define CSIDL_PROGRAM_FILES_COMMONX86 0x002c -#define CSIDL_COMMON_TEMPLATES 0x002d -#define CSIDL_COMMON_DOCUMENTS 0x002e -#define CSIDL_COMMON_ADMINTOOLS 0x002f -#define CSIDL_ADMINTOOLS 0x0030 -#define CSIDL_CONNECTIONS 0x0031 -#define CSIDL_COMMON_MUSIC 0x0035 -#define CSIDL_COMMON_PICTURES 0x0036 -#define CSIDL_COMMON_VIDEO 0x0037 -#define CSIDL_RESOURCES 0x0038 -#define CSIDL_RESOURCES_LOCALIZED 0x0039 -#define CSIDL_COMMON_OEM_LINKS 0x003a -#define CSIDL_CDBURN_AREA 0x003b -#define CSIDL_COMPUTERSNEARME 0x003d -#define CSIDL_PROFILES 0x003e #define CSIDL_FOLDER_MASK 0x00ff -#define CSIDL_FLAG_PER_USER_INIT 0x0800 -#define CSIDL_FLAG_NO_ALIAS 0x1000 -#define CSIDL_FLAG_DONT_VERIFY 0x4000 -#define CSIDL_FLAG_CREATE 0x8000 -#define CSIDL_FLAG_MASK 0xff00 - -/**************************************************************************** - * SHGetDesktopFolder API - */ -DWORD WINAPI SHGetDesktopFolder(IShellFolder * *); - -/**************************************************************************** - * SHBindToParent API - */ -HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast); - -/**************************************************************************** -* SHDefExtractIcon API -*/ -HRESULT WINAPI SHDefExtractIconA(LPCSTR pszIconFile, int iIndex, UINT uFlags, - HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize); -HRESULT WINAPI SHDefExtractIconW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, - HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize); -#define SHDefExtractIcon WINELIB_NAME_AW(SHDefExtractIcon) - -/* - * DROPFILES for CF_HDROP and CF_PRINTERS - */ -typedef struct _DROPFILES -{ - DWORD pFiles; - POINT pt; - BOOL fNC; - BOOL fWide; -} DROPFILES, *LPDROPFILES; - -#include +LPVOID WINAPI SHAlloc(ULONG); +void WINAPI SHFree(LPVOID); +int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder*,LPCITEMIDLIST,int*); /***************************************************************************** * IFileSystemBindData interface */ -#ifndef __IFileSystemBindData_FWD_DEFINED__ -#define __IFileSystemBindData_FWD_DEFINED__ -typedef struct IFileSystemBindData IFileSystemBindData; -#endif - -typedef IFileSystemBindData *LPFILESYSTEMBINDDATA; - -#ifndef __IFileSystemBindData_INTERFACE_DEFINED__ -#define __IFileSystemBindData_INTERFACE_DEFINED__ - DEFINE_GUID(IID_IFileSystemBindData, 0x01e18d10, 0x4d8b, 0x11d2, 0x85,0x5d, 0x00,0x60,0x08,0x05,0x93,0x67); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IFileSystemBindData : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE GetFindData( - WIN32_FIND_DATAW* pfd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFindData( - const WIN32_FIND_DATAW* pfd) = 0; - -}; -#else -typedef struct IFileSystemBindDataVtbl IFileSystemBindDataVtbl; -struct IFileSystemBindData { - const IFileSystemBindDataVtbl* lpVtbl; -}; -struct IFileSystemBindDataVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IFileSystemBindData* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IFileSystemBindData* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IFileSystemBindData* This); - - /*** IFileSystemBindData methods ***/ - HRESULT (STDMETHODCALLTYPE *GetFindData)( - IFileSystemBindData* This, - WIN32_FIND_DATAW* pfd); - - HRESULT (STDMETHODCALLTYPE *SetFindData)( - IFileSystemBindData* This, - const WIN32_FIND_DATAW* pfd); - -}; /*** IUnknown methods ***/ #define IFileSystemBindData_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) @@ -885,73 +75,4 @@ struct IFileSystemBindDataVtbl { #define IFileSystemBindData_GetFindData(p,a) (p)->lpVtbl->GetFindData(p,a) #define IFileSystemBindData_SetFindData(p,a) (p)->lpVtbl->SetFindData(p,a) -#endif - -#define IFileSystemBindData_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IFileSystemBindData methods ***/ \ - STDMETHOD_(HRESULT,GetFindData)(THIS_ WIN32_FIND_DATAW* pfd) PURE; \ - STDMETHOD_(HRESULT,SetFindData)(THIS_ const WIN32_FIND_DATAW* pfd) PURE; - -#endif /* __IFileSystemBindData_INTERFACE_DEFINED__ */ - - -/**************************************************************************** - * Drag And Drop Routines - */ - -/* DAD_AutoScroll sample structure */ -#define NUM_POINTS 3 -typedef struct -{ - int iNextSample; - DWORD dwLastScroll; - BOOL bFull; - POINT pts[NUM_POINTS]; - DWORD dwTimes[NUM_POINTS]; -} AUTO_SCROLL_DATA; - -BOOL WINAPI DAD_SetDragImage(HIMAGELIST,LPPOINT); -BOOL WINAPI DAD_DragEnterEx(HWND,POINT); -BOOL WINAPI DAD_DragEnterEx2(HWND,POINT,IDataObject*); -BOOL WINAPI DAD_DragMove(POINT); -BOOL WINAPI DAD_DragLeave(void); -BOOL WINAPI DAD_AutoScroll(HWND,AUTO_SCROLL_DATA*,LPPOINT); -HRESULT WINAPI SHDoDragDrop(HWND,IDataObject*,IDropSource*,DWORD,LPDWORD); - - -/**************************************************************************** - * Cabinet functions - */ - -typedef struct { - WORD cLength; - WORD nVersion; - BOOL fFullPathTitle:1; - BOOL fSaveLocalView:1; - BOOL fNotShell:1; - BOOL fSimpleDefault:1; - BOOL fDontShowDescBar:1; - BOOL fNewWindowMode:1; - BOOL fShowCompColor:1; - BOOL fDontPrettyNames:1; - BOOL fAdminsCreateCommonGroups:1; - UINT fUnusedFlags:7; - UINT fMenuEnumFilter; -} CABINETSTATE, *LPCABINETSTATE; - -#define CABINETSTATE_VERSION 2 - -BOOL WINAPI ReadCabinetState(CABINETSTATE *, int); -BOOL WINAPI WriteCabinetState(CABINETSTATE *); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* defined(__cplusplus) */ - #endif /* __WINE_SHLOBJ_H */ diff --git a/reactos/include/wine/shobjidl.h b/reactos/include/wine/shobjidl.h index 77a741bbcd0..874711f7457 100644 --- a/reactos/include/wine/shobjidl.h +++ b/reactos/include/wine/shobjidl.h @@ -1,4240 +1,41 @@ -/*** Autogenerated by WIDL 0.1 from shobjidl.idl - Do not edit ***/ -#include -#include - -#ifndef __WIDL_SHOBJIDL_H -#define __WIDL_SHOBJIDL_H -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#include -#include -#include -#ifndef __IPersistFolder_FWD_DEFINED__ -#define __IPersistFolder_FWD_DEFINED__ -typedef struct IPersistFolder IPersistFolder; -#endif - -typedef IPersistFolder *LPPERSISTFOLDER; - -/***************************************************************************** - * IPersistFolder interface +/* $Id: shobjidl.h,v 1.4 2004/06/29 13:40:40 gvg Exp $ + * + * Compatibility header + * + * This header is wrapper to allow compilation of Wine DLLs under ReactOS + * build system. It contains definitions commonly refered to as Wineisms + * and definitions that are missing in w32api. */ -#ifndef __IPersistFolder_INTERFACE_DEFINED__ -#define __IPersistFolder_INTERFACE_DEFINED__ -DEFINE_GUID(IID_IPersistFolder, 0x000214ea, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IPersistFolder : public IPersist -{ - virtual HRESULT STDMETHODCALLTYPE Initialize( - LPCITEMIDLIST pidl) = 0; -}; -#else -typedef struct IPersistFolderVtbl IPersistFolderVtbl; -struct IPersistFolder { - const IPersistFolderVtbl* lpVtbl; -}; -struct IPersistFolderVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS +#ifndef __WINE_SHOBJIDL_H +#define __WINE_SHOBJIDL_H - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IPersistFolder* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IPersistFolder* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IPersistFolder* This); - - /*** IPersist methods ***/ - HRESULT (STDMETHODCALLTYPE *GetClassID)( - IPersistFolder* This, - CLSID* pClassID); - - /*** IPersistFolder methods ***/ - HRESULT (STDMETHODCALLTYPE *Initialize)( - IPersistFolder* This, - LPCITEMIDLIST pidl); - -}; - -/*** IUnknown methods ***/ -#define IPersistFolder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IPersistFolder_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IPersistFolder_Release(p) (p)->lpVtbl->Release(p) -/*** IPersist methods ***/ -#define IPersistFolder_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a) -/*** IPersistFolder methods ***/ -#define IPersistFolder_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) - -#endif - -#define IPersistFolder_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IPersist methods ***/ \ - STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \ - /*** IPersistFolder methods ***/ \ - STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidl) PURE; - -HRESULT CALLBACK IPersistFolder_Initialize_Proxy( - IPersistFolder* This, - LPCITEMIDLIST pidl); -void __RPC_STUB IPersistFolder_Initialize_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IPersistFolder_INTERFACE_DEFINED__ */ - -#ifndef __IPersistFolder2_FWD_DEFINED__ -#define __IPersistFolder2_FWD_DEFINED__ -typedef struct IPersistFolder2 IPersistFolder2; -#endif - -typedef IPersistFolder2 *LPPERSISTFOLDER2; - -/***************************************************************************** - * IPersistFolder2 interface - */ -#ifndef __IPersistFolder2_INTERFACE_DEFINED__ -#define __IPersistFolder2_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IPersistFolder2, 0x1ac3d9f0, 0x175c, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IPersistFolder2 : public IPersistFolder -{ - virtual HRESULT STDMETHODCALLTYPE GetCurFolder( - LPITEMIDLIST* ppidl) = 0; - -}; -#else -typedef struct IPersistFolder2Vtbl IPersistFolder2Vtbl; -struct IPersistFolder2 { - const IPersistFolder2Vtbl* lpVtbl; -}; -struct IPersistFolder2Vtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IPersistFolder2* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IPersistFolder2* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IPersistFolder2* This); - - /*** IPersist methods ***/ - HRESULT (STDMETHODCALLTYPE *GetClassID)( - IPersistFolder2* This, - CLSID* pClassID); - - /*** IPersistFolder methods ***/ - HRESULT (STDMETHODCALLTYPE *Initialize)( - IPersistFolder2* This, - LPCITEMIDLIST pidl); - - /*** IPersistFolder2 methods ***/ - HRESULT (STDMETHODCALLTYPE *GetCurFolder)( - IPersistFolder2* This, - LPITEMIDLIST* ppidl); - -}; - -/*** IUnknown methods ***/ -#define IPersistFolder2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IPersistFolder2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IPersistFolder2_Release(p) (p)->lpVtbl->Release(p) -/*** IPersist methods ***/ -#define IPersistFolder2_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a) -/*** IPersistFolder methods ***/ -#define IPersistFolder2_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -/*** IPersistFolder2 methods ***/ -#define IPersistFolder2_GetCurFolder(p,a) (p)->lpVtbl->GetCurFolder(p,a) - -#endif - -#define IPersistFolder2_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IPersist methods ***/ \ - STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \ - /*** IPersistFolder methods ***/ \ - STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidl) PURE; \ - /*** IPersistFolder2 methods ***/ \ - STDMETHOD_(HRESULT,GetCurFolder)(THIS_ LPITEMIDLIST* ppidl) PURE; - -HRESULT CALLBACK IPersistFolder2_GetCurFolder_Proxy( - IPersistFolder2* This, - LPITEMIDLIST* ppidl); -void __RPC_STUB IPersistFolder2_GetCurFolder_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IPersistFolder2_INTERFACE_DEFINED__ */ - -#ifndef __IEnumIDList_FWD_DEFINED__ -#define __IEnumIDList_FWD_DEFINED__ -typedef struct IEnumIDList IEnumIDList; -#endif - -typedef IEnumIDList *LPENUMIDLIST; - -/***************************************************************************** - * IEnumIDList interface - */ -#ifndef __IEnumIDList_INTERFACE_DEFINED__ -#define __IEnumIDList_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IEnumIDList, 0x000214f2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IEnumIDList : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE Next( - ULONG celt, - LPITEMIDLIST* rgelt, - ULONG* pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( - ) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - IEnumIDList** ppenum) = 0; - -}; -#else -typedef struct IEnumIDListVtbl IEnumIDListVtbl; -struct IEnumIDList { - const IEnumIDListVtbl* lpVtbl; -}; -struct IEnumIDListVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IEnumIDList* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IEnumIDList* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IEnumIDList* This); - - /*** IEnumIDList methods ***/ - HRESULT (STDMETHODCALLTYPE *Next)( - IEnumIDList* This, - ULONG celt, - LPITEMIDLIST* rgelt, - ULONG* pceltFetched); - - HRESULT (STDMETHODCALLTYPE *Skip)( - IEnumIDList* This, - ULONG celt); - - HRESULT (STDMETHODCALLTYPE *Reset)( - IEnumIDList* This); - - HRESULT (STDMETHODCALLTYPE *Clone)( - IEnumIDList* This, - IEnumIDList** ppenum); - -}; - -/*** IUnknown methods ***/ -#define IEnumIDList_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IEnumIDList_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IEnumIDList_Release(p) (p)->lpVtbl->Release(p) -/*** IEnumIDList methods ***/ -#define IEnumIDList_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c) -#define IEnumIDList_Skip(p,a) (p)->lpVtbl->Skip(p,a) -#define IEnumIDList_Reset(p) (p)->lpVtbl->Reset(p) -#define IEnumIDList_Clone(p,a) (p)->lpVtbl->Clone(p,a) - -#endif - -#define IEnumIDList_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IEnumIDList methods ***/ \ - STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, LPITEMIDLIST* rgelt, ULONG* pceltFetched) PURE; \ - STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \ - STDMETHOD_(HRESULT,Reset)(THIS) PURE; \ - STDMETHOD_(HRESULT,Clone)(THIS_ IEnumIDList** ppenum) PURE; - -HRESULT CALLBACK IEnumIDList_Next_Proxy( - IEnumIDList* This, - ULONG celt, - LPITEMIDLIST* rgelt, - ULONG* pceltFetched); -void __RPC_STUB IEnumIDList_Next_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IEnumIDList_Skip_Proxy( - IEnumIDList* This, - ULONG celt); -void __RPC_STUB IEnumIDList_Skip_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IEnumIDList_Reset_Proxy( - IEnumIDList* This); -void __RPC_STUB IEnumIDList_Reset_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IEnumIDList_Clone_Proxy( - IEnumIDList* This, - IEnumIDList** ppenum); -void __RPC_STUB IEnumIDList_Clone_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IEnumIDList_INTERFACE_DEFINED__ */ - -#ifndef __IShellFolder_FWD_DEFINED__ -#define __IShellFolder_FWD_DEFINED__ -typedef struct IShellFolder IShellFolder; -#endif - -typedef IShellFolder *LPSHELLFOLDER; - -typedef enum tagSHGDN { - SHGDN_NORMAL = 0, - SHGDN_INFOLDER = 1, - SHGDN_FOREDITING = 0x1000, - SHGDN_INCLUDE_NONFILESYS = 0x2000, - SHGDN_FORADDRESSBAR = 0x4000, - SHGDN_FORPARSING = 0x8000 -} SHGNO; - -typedef DWORD SHGDNF; - -enum tagSHCONTF { - SHCONTF_FOLDERS = 32, - SHCONTF_NONFOLDERS = 64, - SHCONTF_INCLUDEHIDDEN = 128, - SHCONTF_INIT_ON_FIRST_NEXT = 256, - SHCONTF_NETPRINTERSRCH = 512, - SHCONTF_SHAREABLE = 1024, - SHCONTF_STORAGE = 2048 -}; - -typedef DWORD SHCONTF; - -#define SFGAO_CANCOPY DROPEFFECT_COPY -#define SFGAO_CANMOVE DROPEFFECT_MOVE -#define SFGAO_CANLINK DROPEFFECT_LINK -#define SFGAO_CANRENAME 0x00000010L -#define SFGAO_CANDELETE 0x00000020L -#define SFGAO_HASPROPSHEET 0x00000040L -#define SFGAO_DROPTARGET 0x00000100L -#define SFGAO_CAPABILITYMASK 0x00000177L -#define SFGAO_LINK 0x00010000L -#define SFGAO_SHARE 0x00020000L -#define SFGAO_READONLY 0x00040000L -#define SFGAO_GHOSTED 0x00080000L -#define SFGAO_HIDDEN 0x00080000L -#define SFGAO_DISPLAYATTRMASK 0x000F0000L -#define SFGAO_FILESYSANCESTOR 0x10000000L -#define SFGAO_FOLDER 0x20000000L -#define SFGAO_FILESYSTEM 0x40000000L -#define SFGAO_HASSUBFOLDER 0x80000000L -#define SFGAO_CONTENTSMASK 0x80000000L -#define SFGAO_VALIDATE 0x01000000L -#define SFGAO_REMOVABLE 0x02000000L -#define SFGAO_COMPRESSED 0x04000000L -#define SFGAO_BROWSABLE 0x08000000L -#define SFGAO_NONENUMERATED 0x00100000L -#define SFGAO_NEWCONTENT 0x00200000L -typedef ULONG SFGAOF; - -/***************************************************************************** - * IShellFolder interface - */ -#ifndef __IShellFolder_INTERFACE_DEFINED__ -#define __IShellFolder_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellFolder, 0x000214e6, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellFolder : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE ParseDisplayName( - HWND hwndOwner, - LPBC pbcReserved, - LPOLESTR lpszDisplayName, - ULONG* pchEaten, - LPITEMIDLIST* ppidl, - ULONG* pdwAttributes) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumObjects( - HWND hwndOwner, - SHCONTF grfFlags, - IEnumIDList** ppenumIDList) = 0; - - virtual HRESULT STDMETHODCALLTYPE BindToObject( - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE BindToStorage( - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvObj) = 0; - - virtual HRESULT STDMETHODCALLTYPE CompareIDs( - LPARAM lParam, - LPCITEMIDLIST pidl1, - LPCITEMIDLIST pidl2) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateViewObject( - HWND hwndOwner, - REFIID riid, - void** ppvOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAttributesOf( - UINT cidl, - LPCITEMIDLIST* apidl, - SFGAOF* rgfInOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetUIObjectOf( - HWND hwndOwner, - UINT cidl, - LPCITEMIDLIST* apidl, - REFIID riid, - UINT* prgfInOut, - void** ppvOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayNameOf( - LPCITEMIDLIST pidl, - SHGDNF uFlags, - STRRET* lpName) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetNameOf( - HWND hwnd, - LPCITEMIDLIST pidl, - LPCOLESTR lpszName, - SHGDNF uFlags, - LPITEMIDLIST* ppidlOut) = 0; - -}; -#else -typedef struct IShellFolderVtbl IShellFolderVtbl; -struct IShellFolder { - const IShellFolderVtbl* lpVtbl; -}; -struct IShellFolderVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellFolder* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellFolder* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellFolder* This); - - /*** IShellFolder methods ***/ - HRESULT (STDMETHODCALLTYPE *ParseDisplayName)( - IShellFolder* This, - HWND hwndOwner, - LPBC pbcReserved, - LPOLESTR lpszDisplayName, - ULONG* pchEaten, - LPITEMIDLIST* ppidl, - ULONG* pdwAttributes); - - HRESULT (STDMETHODCALLTYPE *EnumObjects)( - IShellFolder* This, - HWND hwndOwner, - SHCONTF grfFlags, - IEnumIDList** ppenumIDList); - - HRESULT (STDMETHODCALLTYPE *BindToObject)( - IShellFolder* This, - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvOut); - - HRESULT (STDMETHODCALLTYPE *BindToStorage)( - IShellFolder* This, - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvObj); - - HRESULT (STDMETHODCALLTYPE *CompareIDs)( - IShellFolder* This, - LPARAM lParam, - LPCITEMIDLIST pidl1, - LPCITEMIDLIST pidl2); - - HRESULT (STDMETHODCALLTYPE *CreateViewObject)( - IShellFolder* This, - HWND hwndOwner, - REFIID riid, - void** ppvOut); - - HRESULT (STDMETHODCALLTYPE *GetAttributesOf)( - IShellFolder* This, - UINT cidl, - LPCITEMIDLIST* apidl, - SFGAOF* rgfInOut); - - HRESULT (STDMETHODCALLTYPE *GetUIObjectOf)( - IShellFolder* This, - HWND hwndOwner, - UINT cidl, - LPCITEMIDLIST* apidl, - REFIID riid, - UINT* prgfInOut, - void** ppvOut); - - HRESULT (STDMETHODCALLTYPE *GetDisplayNameOf)( - IShellFolder* This, - LPCITEMIDLIST pidl, - SHGDNF uFlags, - STRRET* lpName); - - HRESULT (STDMETHODCALLTYPE *SetNameOf)( - IShellFolder* This, - HWND hwnd, - LPCITEMIDLIST pidl, - LPCOLESTR lpszName, - SHGDNF uFlags, - LPITEMIDLIST* ppidlOut); - -}; - -/*** IUnknown methods ***/ -#define IShellFolder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellFolder_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellFolder_Release(p) (p)->lpVtbl->Release(p) -/*** IShellFolder methods ***/ -#define IShellFolder_ParseDisplayName(p,a,b,c,d,e,f) (p)->lpVtbl->ParseDisplayName(p,a,b,c,d,e,f) -#define IShellFolder_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) -#define IShellFolder_BindToObject(p,a,b,c,d) (p)->lpVtbl->BindToObject(p,a,b,c,d) -#define IShellFolder_BindToStorage(p,a,b,c,d) (p)->lpVtbl->BindToStorage(p,a,b,c,d) -#define IShellFolder_CompareIDs(p,a,b,c) (p)->lpVtbl->CompareIDs(p,a,b,c) -#define IShellFolder_CreateViewObject(p,a,b,c) (p)->lpVtbl->CreateViewObject(p,a,b,c) -#define IShellFolder_GetAttributesOf(p,a,b,c) (p)->lpVtbl->GetAttributesOf(p,a,b,c) -#define IShellFolder_GetUIObjectOf(p,a,b,c,d,e,f) (p)->lpVtbl->GetUIObjectOf(p,a,b,c,d,e,f) -#define IShellFolder_GetDisplayNameOf(p,a,b,c) (p)->lpVtbl->GetDisplayNameOf(p,a,b,c) -#define IShellFolder_SetNameOf(p,a,b,c,d,e) (p)->lpVtbl->SetNameOf(p,a,b,c,d,e) - -#endif - -#define IShellFolder_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellFolder methods ***/ \ - STDMETHOD_(HRESULT,ParseDisplayName)(THIS_ HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, ULONG* pchEaten, LPITEMIDLIST* ppidl, ULONG* pdwAttributes) PURE; \ - STDMETHOD_(HRESULT,EnumObjects)(THIS_ HWND hwndOwner, SHCONTF grfFlags, IEnumIDList** ppenumIDList) PURE; \ - STDMETHOD_(HRESULT,BindToObject)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvOut) PURE; \ - STDMETHOD_(HRESULT,BindToStorage)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvObj) PURE; \ - STDMETHOD_(HRESULT,CompareIDs)(THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; \ - STDMETHOD_(HRESULT,CreateViewObject)(THIS_ HWND hwndOwner, REFIID riid, void** ppvOut) PURE; \ - STDMETHOD_(HRESULT,GetAttributesOf)(THIS_ UINT cidl, LPCITEMIDLIST* apidl, SFGAOF* rgfInOut) PURE; \ - STDMETHOD_(HRESULT,GetUIObjectOf)(THIS_ HWND hwndOwner, UINT cidl, LPCITEMIDLIST* apidl, REFIID riid, UINT* prgfInOut, void** ppvOut) PURE; \ - STDMETHOD_(HRESULT,GetDisplayNameOf)(THIS_ LPCITEMIDLIST pidl, SHGDNF uFlags, STRRET* lpName) PURE; \ - STDMETHOD_(HRESULT,SetNameOf)(THIS_ HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR lpszName, SHGDNF uFlags, LPITEMIDLIST* ppidlOut) PURE; - -HRESULT CALLBACK IShellFolder_ParseDisplayName_Proxy( - IShellFolder* This, - HWND hwndOwner, - LPBC pbcReserved, - LPOLESTR lpszDisplayName, - ULONG* pchEaten, - LPITEMIDLIST* ppidl, - ULONG* pdwAttributes); -void __RPC_STUB IShellFolder_ParseDisplayName_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_EnumObjects_Proxy( - IShellFolder* This, - HWND hwndOwner, - SHCONTF grfFlags, - IEnumIDList** ppenumIDList); -void __RPC_STUB IShellFolder_EnumObjects_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_BindToObject_Proxy( - IShellFolder* This, - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvOut); -void __RPC_STUB IShellFolder_BindToObject_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_BindToStorage_Proxy( - IShellFolder* This, - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvObj); -void __RPC_STUB IShellFolder_BindToStorage_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_CompareIDs_Proxy( - IShellFolder* This, - LPARAM lParam, - LPCITEMIDLIST pidl1, - LPCITEMIDLIST pidl2); -void __RPC_STUB IShellFolder_CompareIDs_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_CreateViewObject_Proxy( - IShellFolder* This, - HWND hwndOwner, - REFIID riid, - void** ppvOut); -void __RPC_STUB IShellFolder_CreateViewObject_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_GetAttributesOf_Proxy( - IShellFolder* This, - UINT cidl, - LPCITEMIDLIST* apidl, - SFGAOF* rgfInOut); -void __RPC_STUB IShellFolder_GetAttributesOf_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_GetUIObjectOf_Proxy( - IShellFolder* This, - HWND hwndOwner, - UINT cidl, - LPCITEMIDLIST* apidl, - REFIID riid, - UINT* prgfInOut, - void** ppvOut); -void __RPC_STUB IShellFolder_GetUIObjectOf_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_GetDisplayNameOf_Proxy( - IShellFolder* This, - LPCITEMIDLIST pidl, - SHGDNF uFlags, - STRRET* lpName); -void __RPC_STUB IShellFolder_GetDisplayNameOf_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder_SetNameOf_Proxy( - IShellFolder* This, - HWND hwnd, - LPCITEMIDLIST pidl, - LPCOLESTR lpszName, - SHGDNF uFlags, - LPITEMIDLIST* ppidlOut); -void __RPC_STUB IShellFolder_SetNameOf_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellFolder_INTERFACE_DEFINED__ */ - -#ifndef __IEnumExtraSearch_FWD_DEFINED__ -#define __IEnumExtraSearch_FWD_DEFINED__ -typedef struct IEnumExtraSearch IEnumExtraSearch; -#endif - -typedef IEnumExtraSearch *LPENUMEXTRASEARCH; - -typedef struct { - GUID guidSearch; - WCHAR wszFriendlyName[80]; - WCHAR wszUrl[2084]; -} EXTRASEARCH, *LPEXTRASEARCH; - -/***************************************************************************** - * IEnumExtraSearch interface - */ -#ifndef __IEnumExtraSearch_INTERFACE_DEFINED__ -#define __IEnumExtraSearch_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IEnumExtraSearch, 0x0e700be1, 0x9db6, 0x11d1, 0xa1,0xce, 0x00,0xc0,0x4f,0xd7,0x5d,0x13); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IEnumExtraSearch : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE Next( - ULONG celt, - EXTRASEARCH* rgelt, - ULONG* pceltFetched) = 0; - - virtual HRESULT STDMETHODCALLTYPE Skip( - ULONG celt) = 0; - - virtual HRESULT STDMETHODCALLTYPE Reset( - ) = 0; - - virtual HRESULT STDMETHODCALLTYPE Clone( - IEnumExtraSearch** ppenum) = 0; - -}; -#else -typedef struct IEnumExtraSearchVtbl IEnumExtraSearchVtbl; -struct IEnumExtraSearch { - const IEnumExtraSearchVtbl* lpVtbl; -}; -struct IEnumExtraSearchVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IEnumExtraSearch* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IEnumExtraSearch* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IEnumExtraSearch* This); - - /*** IEnumExtraSearch methods ***/ - HRESULT (STDMETHODCALLTYPE *Next)( - IEnumExtraSearch* This, - ULONG celt, - EXTRASEARCH* rgelt, - ULONG* pceltFetched); - - HRESULT (STDMETHODCALLTYPE *Skip)( - IEnumExtraSearch* This, - ULONG celt); - - HRESULT (STDMETHODCALLTYPE *Reset)( - IEnumExtraSearch* This); - - HRESULT (STDMETHODCALLTYPE *Clone)( - IEnumExtraSearch* This, - IEnumExtraSearch** ppenum); - -}; - -/*** IUnknown methods ***/ -#define IEnumExtraSearch_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IEnumExtraSearch_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IEnumExtraSearch_Release(p) (p)->lpVtbl->Release(p) -/*** IEnumExtraSearch methods ***/ -#define IEnumExtraSearch_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c) -#define IEnumExtraSearch_Skip(p,a) (p)->lpVtbl->Skip(p,a) -#define IEnumExtraSearch_Reset(p) (p)->lpVtbl->Reset(p) -#define IEnumExtraSearch_Clone(p,a) (p)->lpVtbl->Clone(p,a) - -#endif - -#define IEnumExtraSearch_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IEnumExtraSearch methods ***/ \ - STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, EXTRASEARCH* rgelt, ULONG* pceltFetched) PURE; \ - STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE; \ - STDMETHOD_(HRESULT,Reset)(THIS) PURE; \ - STDMETHOD_(HRESULT,Clone)(THIS_ IEnumExtraSearch** ppenum) PURE; - -HRESULT CALLBACK IEnumExtraSearch_Next_Proxy( - IEnumExtraSearch* This, - ULONG celt, - EXTRASEARCH* rgelt, - ULONG* pceltFetched); -void __RPC_STUB IEnumExtraSearch_Next_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IEnumExtraSearch_Skip_Proxy( - IEnumExtraSearch* This, - ULONG celt); -void __RPC_STUB IEnumExtraSearch_Skip_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IEnumExtraSearch_Reset_Proxy( - IEnumExtraSearch* This); -void __RPC_STUB IEnumExtraSearch_Reset_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IEnumExtraSearch_Clone_Proxy( - IEnumExtraSearch* This, - IEnumExtraSearch** ppenum); -void __RPC_STUB IEnumExtraSearch_Clone_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IEnumExtraSearch_INTERFACE_DEFINED__ */ - -#ifndef __IShellFolder2_FWD_DEFINED__ -#define __IShellFolder2_FWD_DEFINED__ -typedef struct IShellFolder2 IShellFolder2; -#endif - -typedef enum { - SHCOLSTATE_TYPE_STR = 0x1, - SHCOLSTATE_TYPE_INT = 0x2, - SHCOLSTATE_TYPE_DATE = 0x3, - SHCOLSTATE_TYPEMASK = 0xf, - SHCOLSTATE_ONBYDEFAULT = 0x10, - SHCOLSTATE_SLOW = 0x20, - SHCOLSTATE_EXTENDED = 0x40, - SHCOLSTATE_SECONDARYUI = 0x80, - SHCOLSTATE_HIDDEN = 0x100, - SHCOLSTATE_PREFER_VARCMP = 0x200 -} SHCOLSTATE; - -typedef DWORD SHCOLSTATEF; - -typedef struct { - GUID fmtid; - DWORD pid; -} SHCOLUMNID, *LPSHCOLUMNID; - -typedef const SHCOLUMNID *LPCSHCOLUMNID; - -/***************************************************************************** - * IShellFolder2 interface - */ -#ifndef __IShellFolder2_INTERFACE_DEFINED__ -#define __IShellFolder2_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3,0x0e, 0x00,0xc0,0x4f,0x79,0xab,0xd1); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellFolder2 : public IShellFolder -{ - virtual HRESULT STDMETHODCALLTYPE GetDefaultSearchGUID( - GUID* lpguid) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumSearches( - IEnumExtraSearch** ppenum) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultColumn( - DWORD dwReserved, - ULONG* pSort, - ULONG* pDisplay) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDefaultColumnState( - UINT iColumn, - SHCOLSTATEF* pcsFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDetailsEx( - LPCITEMIDLIST pidl, - const SHCOLUMNID* pscid, - VARIANT* pv) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDetailsOf( - LPCITEMIDLIST pidl, - UINT iColumn, - SHELLDETAILS* psd) = 0; - - virtual HRESULT STDMETHODCALLTYPE MapColumnToSCID( - UINT iColumn, - SHCOLUMNID* pscid) = 0; - -}; -#else -typedef struct IShellFolder2Vtbl IShellFolder2Vtbl; -struct IShellFolder2 { - const IShellFolder2Vtbl* lpVtbl; -}; -struct IShellFolder2Vtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellFolder2* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellFolder2* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellFolder2* This); - - /*** IShellFolder methods ***/ - HRESULT (STDMETHODCALLTYPE *ParseDisplayName)( - IShellFolder2* This, - HWND hwndOwner, - LPBC pbcReserved, - LPOLESTR lpszDisplayName, - ULONG* pchEaten, - LPITEMIDLIST* ppidl, - ULONG* pdwAttributes); - - HRESULT (STDMETHODCALLTYPE *EnumObjects)( - IShellFolder2* This, - HWND hwndOwner, - SHCONTF grfFlags, - IEnumIDList** ppenumIDList); - - HRESULT (STDMETHODCALLTYPE *BindToObject)( - IShellFolder2* This, - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvOut); - - HRESULT (STDMETHODCALLTYPE *BindToStorage)( - IShellFolder2* This, - LPCITEMIDLIST pidl, - LPBC pbcReserved, - REFIID riid, - void** ppvObj); - - HRESULT (STDMETHODCALLTYPE *CompareIDs)( - IShellFolder2* This, - LPARAM lParam, - LPCITEMIDLIST pidl1, - LPCITEMIDLIST pidl2); - - HRESULT (STDMETHODCALLTYPE *CreateViewObject)( - IShellFolder2* This, - HWND hwndOwner, - REFIID riid, - void** ppvOut); - - HRESULT (STDMETHODCALLTYPE *GetAttributesOf)( - IShellFolder2* This, - UINT cidl, - LPCITEMIDLIST* apidl, - SFGAOF* rgfInOut); - - HRESULT (STDMETHODCALLTYPE *GetUIObjectOf)( - IShellFolder2* This, - HWND hwndOwner, - UINT cidl, - LPCITEMIDLIST* apidl, - REFIID riid, - UINT* prgfInOut, - void** ppvOut); - - HRESULT (STDMETHODCALLTYPE *GetDisplayNameOf)( - IShellFolder2* This, - LPCITEMIDLIST pidl, - SHGDNF uFlags, - STRRET* lpName); - - HRESULT (STDMETHODCALLTYPE *SetNameOf)( - IShellFolder2* This, - HWND hwnd, - LPCITEMIDLIST pidl, - LPCOLESTR lpszName, - SHGDNF uFlags, - LPITEMIDLIST* ppidlOut); - - /*** IShellFolder2 methods ***/ - HRESULT (STDMETHODCALLTYPE *GetDefaultSearchGUID)( - IShellFolder2* This, - GUID* lpguid); - - HRESULT (STDMETHODCALLTYPE *EnumSearches)( - IShellFolder2* This, - IEnumExtraSearch** ppenum); - - HRESULT (STDMETHODCALLTYPE *GetDefaultColumn)( - IShellFolder2* This, - DWORD dwReserved, - ULONG* pSort, - ULONG* pDisplay); - - HRESULT (STDMETHODCALLTYPE *GetDefaultColumnState)( - IShellFolder2* This, - UINT iColumn, - SHCOLSTATEF* pcsFlags); - - HRESULT (STDMETHODCALLTYPE *GetDetailsEx)( - IShellFolder2* This, - LPCITEMIDLIST pidl, - const SHCOLUMNID* pscid, - VARIANT* pv); - - HRESULT (STDMETHODCALLTYPE *GetDetailsOf)( - IShellFolder2* This, - LPCITEMIDLIST pidl, - UINT iColumn, - SHELLDETAILS* psd); - - HRESULT (STDMETHODCALLTYPE *MapColumnToSCID)( - IShellFolder2* This, - UINT iColumn, - SHCOLUMNID* pscid); - -}; - -/*** IUnknown methods ***/ -#define IShellFolder2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellFolder2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellFolder2_Release(p) (p)->lpVtbl->Release(p) -/*** IShellFolder methods ***/ -#define IShellFolder2_ParseDisplayName(p,a,b,c,d,e,f) (p)->lpVtbl->ParseDisplayName(p,a,b,c,d,e,f) -#define IShellFolder2_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c) -#define IShellFolder2_BindToObject(p,a,b,c,d) (p)->lpVtbl->BindToObject(p,a,b,c,d) -#define IShellFolder2_BindToStorage(p,a,b,c,d) (p)->lpVtbl->BindToStorage(p,a,b,c,d) -#define IShellFolder2_CompareIDs(p,a,b,c) (p)->lpVtbl->CompareIDs(p,a,b,c) -#define IShellFolder2_CreateViewObject(p,a,b,c) (p)->lpVtbl->CreateViewObject(p,a,b,c) -#define IShellFolder2_GetAttributesOf(p,a,b,c) (p)->lpVtbl->GetAttributesOf(p,a,b,c) -#define IShellFolder2_GetUIObjectOf(p,a,b,c,d,e,f) (p)->lpVtbl->GetUIObjectOf(p,a,b,c,d,e,f) -#define IShellFolder2_GetDisplayNameOf(p,a,b,c) (p)->lpVtbl->GetDisplayNameOf(p,a,b,c) -#define IShellFolder2_SetNameOf(p,a,b,c,d,e) (p)->lpVtbl->SetNameOf(p,a,b,c,d,e) -/*** IShellFolder2 methods ***/ -#define IShellFolder2_GetDefaultSearchGUID(p,a) (p)->lpVtbl->GetDefaultSearchGUID(p,a) -#define IShellFolder2_EnumSearches(p,a) (p)->lpVtbl->EnumSearches(p,a) -#define IShellFolder2_GetDefaultColumn(p,a,b,c) (p)->lpVtbl->GetDefaultColumn(p,a,b,c) -#define IShellFolder2_GetDefaultColumnState(p,a,b) (p)->lpVtbl->GetDefaultColumnState(p,a,b) -#define IShellFolder2_GetDetailsEx(p,a,b,c) (p)->lpVtbl->GetDetailsEx(p,a,b,c) -#define IShellFolder2_GetDetailsOf(p,a,b,c) (p)->lpVtbl->GetDetailsOf(p,a,b,c) -#define IShellFolder2_MapColumnToSCID(p,a,b) (p)->lpVtbl->MapColumnToSCID(p,a,b) - -#endif - -#define IShellFolder2_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellFolder methods ***/ \ - STDMETHOD_(HRESULT,ParseDisplayName)(THIS_ HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, ULONG* pchEaten, LPITEMIDLIST* ppidl, ULONG* pdwAttributes) PURE; \ - STDMETHOD_(HRESULT,EnumObjects)(THIS_ HWND hwndOwner, SHCONTF grfFlags, IEnumIDList** ppenumIDList) PURE; \ - STDMETHOD_(HRESULT,BindToObject)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvOut) PURE; \ - STDMETHOD_(HRESULT,BindToStorage)(THIS_ LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, void** ppvObj) PURE; \ - STDMETHOD_(HRESULT,CompareIDs)(THIS_ LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE; \ - STDMETHOD_(HRESULT,CreateViewObject)(THIS_ HWND hwndOwner, REFIID riid, void** ppvOut) PURE; \ - STDMETHOD_(HRESULT,GetAttributesOf)(THIS_ UINT cidl, LPCITEMIDLIST* apidl, SFGAOF* rgfInOut) PURE; \ - STDMETHOD_(HRESULT,GetUIObjectOf)(THIS_ HWND hwndOwner, UINT cidl, LPCITEMIDLIST* apidl, REFIID riid, UINT* prgfInOut, void** ppvOut) PURE; \ - STDMETHOD_(HRESULT,GetDisplayNameOf)(THIS_ LPCITEMIDLIST pidl, SHGDNF uFlags, STRRET* lpName) PURE; \ - STDMETHOD_(HRESULT,SetNameOf)(THIS_ HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR lpszName, SHGDNF uFlags, LPITEMIDLIST* ppidlOut) PURE; \ - /*** IShellFolder2 methods ***/ \ - STDMETHOD_(HRESULT,GetDefaultSearchGUID)(THIS_ GUID* lpguid) PURE; \ - STDMETHOD_(HRESULT,EnumSearches)(THIS_ IEnumExtraSearch** ppenum) PURE; \ - STDMETHOD_(HRESULT,GetDefaultColumn)(THIS_ DWORD dwReserved, ULONG* pSort, ULONG* pDisplay) PURE; \ - STDMETHOD_(HRESULT,GetDefaultColumnState)(THIS_ UINT iColumn, SHCOLSTATEF* pcsFlags) PURE; \ - STDMETHOD_(HRESULT,GetDetailsEx)(THIS_ LPCITEMIDLIST pidl, const SHCOLUMNID* pscid, VARIANT* pv) PURE; \ - STDMETHOD_(HRESULT,GetDetailsOf)(THIS_ LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS* psd) PURE; \ - STDMETHOD_(HRESULT,MapColumnToSCID)(THIS_ UINT iColumn, SHCOLUMNID* pscid) PURE; - -HRESULT CALLBACK IShellFolder2_GetDefaultSearchGUID_Proxy( - IShellFolder2* This, - GUID* lpguid); -void __RPC_STUB IShellFolder2_GetDefaultSearchGUID_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder2_EnumSearches_Proxy( - IShellFolder2* This, - IEnumExtraSearch** ppenum); -void __RPC_STUB IShellFolder2_EnumSearches_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder2_GetDefaultColumn_Proxy( - IShellFolder2* This, - DWORD dwReserved, - ULONG* pSort, - ULONG* pDisplay); -void __RPC_STUB IShellFolder2_GetDefaultColumn_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder2_GetDefaultColumnState_Proxy( - IShellFolder2* This, - UINT iColumn, - SHCOLSTATEF* pcsFlags); -void __RPC_STUB IShellFolder2_GetDefaultColumnState_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder2_GetDetailsEx_Proxy( - IShellFolder2* This, - LPCITEMIDLIST pidl, - const SHCOLUMNID* pscid, - VARIANT* pv); -void __RPC_STUB IShellFolder2_GetDetailsEx_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder2_GetDetailsOf_Proxy( - IShellFolder2* This, - LPCITEMIDLIST pidl, - UINT iColumn, - SHELLDETAILS* psd); -void __RPC_STUB IShellFolder2_GetDetailsOf_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellFolder2_MapColumnToSCID_Proxy( - IShellFolder2* This, - UINT iColumn, - SHCOLUMNID* pscid); -void __RPC_STUB IShellFolder2_MapColumnToSCID_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellFolder2_INTERFACE_DEFINED__ */ - -typedef char *LPVIEWSETTINGS; - -typedef enum { - FWF_AUTOARRANGE = 0x1, - FWF_ABBREVIATEDNAMES = 0x2, - FWF_SNAPTOGRID = 0x4, - FWF_OWNERDATA = 0x8, - FWF_BESTFITWINDOW = 0x10, - FWF_DESKTOP = 0x20, - FWF_SINGLESEL = 0x40, - FWF_NOSUBFOLDERS = 0x80, - FWF_TRANSPARENT = 0x100, - FWF_NOCLIENTEDGE = 0x200, - FWF_NOSCROLL = 0x400, - FWF_ALIGNLEFT = 0x800, - FWF_NOICONS = 0x1000, - FWF_SHOWSELALWAYS = 0x2000, - FWF_NOVISIBLE = 0x4000, - FWF_SINGLECLICKACTIVATE = 0x8000, - FWF_NOWEBVIEW = 0x10000, - FWF_HIDEFILENAMES = 0x20000, - FWF_CHECKSELECT = 0x40000 -} FOLDERFLAGS; - -typedef enum { - FVM_ICON = 1, - FVM_FIRST = FVM_ICON, - FVM_SMALLICON = 2, - FVM_LIST = 3, - FVM_DETAILS = 4, - FVM_THUMBNAIL = 5, - FVM_TILE = 6, - FVM_THUMBSTRIP = 7, - FVM_LAST = FVM_THUMBSTRIP -} FOLDERVIEWMODE; - -typedef struct { - UINT ViewMode; - UINT fFlags; -} FOLDERSETTINGS, *PFOLDERSETTINGS, *LPFOLDERSETTINGS; - -typedef const FOLDERSETTINGS *LPCFOLDERSETTINGS; - -#ifndef __IShellBrowser_FWD_DEFINED__ -#define __IShellBrowser_FWD_DEFINED__ -typedef struct IShellBrowser IShellBrowser; -#endif - -#ifndef __IShellView_FWD_DEFINED__ -#define __IShellView_FWD_DEFINED__ -typedef struct IShellView IShellView; -#endif - -typedef IShellView *LPSHELLVIEW; - -#define SVSI_DESELECT 0x00000000 -#define SVSI_SELECT 0x00000001 -#define SVSI_EDIT 0x00000003 -#define SVSI_DESELECTOTHERS 0x00000004 -#define SVSI_ENSUREVISIBLE 0x00000008 -#define SVSI_FOCUSED 0x00000010 -#define SVSI_TRANSLATEPT 0x00000020 -#define SVSI_SELECTIONMARK 0x00000040 -#define SVSI_POSITIONITEM 0x00000080 -#define SVSI_CHECK 0x00000100 -#define SVSI_NOSTATECHANGE 0x80000000 -typedef UINT SVSIF; - -typedef enum { - SVGIO_BACKGROUND = 0x0, - SVGIO_SELECTION = 0x1, - SVGIO_ALLVIEW = 0x2, - SVGIO_CHECKED = 0x3, - SVGIO_TYPE_MASK = 0xf, - SVGIO_FLAG_VIEWORDER = 0x80000000 -} SVGIO; - -typedef enum { - SVUIA_DEACTIVATE = 0, - SVUIA_ACTIVATE_NOFOCUS = 1, - SVUIA_ACTIVATE_FOCUS = 2, - SVUIA_INPLACEACTIVATE = 3 -} SVUIA_STATUS; - -#if 0 -typedef LPARAM LPFNSVADDPROPSHEETPAGE; - -#else -#include -typedef LPFNADDPROPSHEETPAGE LPFNSVADDPROPSHEETPAGE; -#endif -/***************************************************************************** - * IShellView interface - */ -#ifndef __IShellView_INTERFACE_DEFINED__ -#define __IShellView_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellView, 0x000214e3, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellView : public IOleWindow -{ - virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( - MSG* pmsg) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableModeless( - BOOL fEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE UIActivate( - UINT uState) = 0; - - virtual HRESULT STDMETHODCALLTYPE Refresh( - ) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateViewWindow( - IShellView* psvPrevious, - LPCFOLDERSETTINGS lpfs, - IShellBrowser* psb, - RECT* prcView, - HWND* phWnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE DestroyViewWindow( - ) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentInfo( - LPFOLDERSETTINGS lpfs) = 0; - - virtual HRESULT STDMETHODCALLTYPE AddPropertySheetPages( - DWORD dwReserved, - LPFNSVADDPROPSHEETPAGE pfn, - LPARAM lparam) = 0; - - virtual HRESULT STDMETHODCALLTYPE SaveViewState( - ) = 0; - - virtual HRESULT STDMETHODCALLTYPE SelectItem( - LPCITEMIDLIST pidlItem, - SVSIF uFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetItemObject( - UINT uItem, - REFIID riid, - void** ppv) = 0; - -}; -#else -typedef struct IShellViewVtbl IShellViewVtbl; -struct IShellView { - const IShellViewVtbl* lpVtbl; -}; -struct IShellViewVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellView* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellView* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellView* This); - - /*** IOleWindow methods ***/ - HRESULT (STDMETHODCALLTYPE *GetWindow)( - IShellView* This, - HWND* phwnd); - - HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)( - IShellView* This, - BOOL fEnterMode); - - /*** IShellView methods ***/ - HRESULT (STDMETHODCALLTYPE *TranslateAccelerator)( - IShellView* This, - MSG* pmsg); - - HRESULT (STDMETHODCALLTYPE *EnableModeless)( - IShellView* This, - BOOL fEnable); - - HRESULT (STDMETHODCALLTYPE *UIActivate)( - IShellView* This, - UINT uState); - - HRESULT (STDMETHODCALLTYPE *Refresh)( - IShellView* This); - - HRESULT (STDMETHODCALLTYPE *CreateViewWindow)( - IShellView* This, - IShellView* psvPrevious, - LPCFOLDERSETTINGS lpfs, - IShellBrowser* psb, - RECT* prcView, - HWND* phWnd); - - HRESULT (STDMETHODCALLTYPE *DestroyViewWindow)( - IShellView* This); - - HRESULT (STDMETHODCALLTYPE *GetCurrentInfo)( - IShellView* This, - LPFOLDERSETTINGS lpfs); - - HRESULT (STDMETHODCALLTYPE *AddPropertySheetPages)( - IShellView* This, - DWORD dwReserved, - LPFNSVADDPROPSHEETPAGE pfn, - LPARAM lparam); - - HRESULT (STDMETHODCALLTYPE *SaveViewState)( - IShellView* This); - - HRESULT (STDMETHODCALLTYPE *SelectItem)( - IShellView* This, - LPCITEMIDLIST pidlItem, - SVSIF uFlags); - - HRESULT (STDMETHODCALLTYPE *GetItemObject)( - IShellView* This, - UINT uItem, - REFIID riid, - void** ppv); - -}; - -/*** IUnknown methods ***/ -#define IShellView_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellView_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellView_Release(p) (p)->lpVtbl->Release(p) -/*** IOleWindow methods ***/ -#define IShellView_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a) -#define IShellView_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a) -/*** IShellView methods ***/ -#define IShellView_TranslateAccelerator(p,a) (p)->lpVtbl->TranslateAccelerator(p,a) -#define IShellView_EnableModeless(p,a) (p)->lpVtbl->EnableModeless(p,a) -#define IShellView_UIActivate(p,a) (p)->lpVtbl->UIActivate(p,a) -#define IShellView_Refresh(p) (p)->lpVtbl->Refresh(p) -#define IShellView_CreateViewWindow(p,a,b,c,d,e) (p)->lpVtbl->CreateViewWindow(p,a,b,c,d,e) -#define IShellView_DestroyViewWindow(p) (p)->lpVtbl->DestroyViewWindow(p) -#define IShellView_GetCurrentInfo(p,a) (p)->lpVtbl->GetCurrentInfo(p,a) -#define IShellView_AddPropertySheetPages(p,a,b,c) (p)->lpVtbl->AddPropertySheetPages(p,a,b,c) -#define IShellView_SaveViewState(p) (p)->lpVtbl->SaveViewState(p) -#define IShellView_SelectItem(p,a,b) (p)->lpVtbl->SelectItem(p,a,b) -#define IShellView_GetItemObject(p,a,b,c) (p)->lpVtbl->GetItemObject(p,a,b,c) - -#endif - -#define IShellView_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IOleWindow methods ***/ \ - STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \ - STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; \ - /*** IShellView methods ***/ \ - STDMETHOD_(HRESULT,TranslateAccelerator)(THIS_ MSG* pmsg) PURE; \ - STDMETHOD_(HRESULT,EnableModeless)(THIS_ BOOL fEnable) PURE; \ - STDMETHOD_(HRESULT,UIActivate)(THIS_ UINT uState) PURE; \ - STDMETHOD_(HRESULT,Refresh)(THIS) PURE; \ - STDMETHOD_(HRESULT,CreateViewWindow)(THIS_ IShellView* psvPrevious, LPCFOLDERSETTINGS lpfs, IShellBrowser* psb, RECT* prcView, HWND* phWnd) PURE; \ - STDMETHOD_(HRESULT,DestroyViewWindow)(THIS) PURE; \ - STDMETHOD_(HRESULT,GetCurrentInfo)(THIS_ LPFOLDERSETTINGS lpfs) PURE; \ - STDMETHOD_(HRESULT,AddPropertySheetPages)(THIS_ DWORD dwReserved, LPFNSVADDPROPSHEETPAGE pfn, LPARAM lparam) PURE; \ - STDMETHOD_(HRESULT,SaveViewState)(THIS) PURE; \ - STDMETHOD_(HRESULT,SelectItem)(THIS_ LPCITEMIDLIST pidlItem, SVSIF uFlags) PURE; \ - STDMETHOD_(HRESULT,GetItemObject)(THIS_ UINT uItem, REFIID riid, void** ppv) PURE; - -HRESULT CALLBACK IShellView_TranslateAccelerator_Proxy( - IShellView* This, - MSG* pmsg); -void __RPC_STUB IShellView_TranslateAccelerator_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_EnableModeless_Proxy( - IShellView* This, - BOOL fEnable); -void __RPC_STUB IShellView_EnableModeless_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_UIActivate_Proxy( - IShellView* This, - UINT uState); -void __RPC_STUB IShellView_UIActivate_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_Refresh_Proxy( - IShellView* This); -void __RPC_STUB IShellView_Refresh_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_CreateViewWindow_Proxy( - IShellView* This, - IShellView* psvPrevious, - LPCFOLDERSETTINGS lpfs, - IShellBrowser* psb, - RECT* prcView, - HWND* phWnd); -void __RPC_STUB IShellView_CreateViewWindow_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_DestroyViewWindow_Proxy( - IShellView* This); -void __RPC_STUB IShellView_DestroyViewWindow_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_GetCurrentInfo_Proxy( - IShellView* This, - LPFOLDERSETTINGS lpfs); -void __RPC_STUB IShellView_GetCurrentInfo_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_SaveViewState_Proxy( - IShellView* This); -void __RPC_STUB IShellView_SaveViewState_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_SelectItem_Proxy( - IShellView* This, - LPCITEMIDLIST pidlItem, - SVSIF uFlags); -void __RPC_STUB IShellView_SelectItem_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellView_GetItemObject_Proxy( - IShellView* This, - UINT uItem, - REFIID riid, - void** ppv); -void __RPC_STUB IShellView_GetItemObject_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellView_INTERFACE_DEFINED__ */ - -typedef IShellBrowser *LPSHELLBROWSER; - -#define SBSP_DEFBROWSER 0x00000000 -#define SBSP_SAMEBROWSER 0x00000001 -#define SBSP_NEWBROWSER 0x00000002 -#define SBSP_DEFMODE 0x00000000 -#define SBSP_OPENMODE 0x00000010 -#define SBSP_EXPLOREMODE 0x00000020 -#define SBSP_HELPMODE 0x00000040 -#define SBSP_NOTRANSFERHIST 0x00000080 -#define SBSP_ABSOLUTE 0x00000000 -#define SBSP_RELATIVE 0x00001000 -#define SBSP_PARENT 0x00002000 -#define SBSP_NAVIGATEBACK 0x00004000 -#define SBSP_NAVIGATEFORWARD 0x00008000 -#define SBSP_ALLOW_AUTONAVIGATE 0x00010000 -#define SBSP_NOAUTOSELECT 0x04000000 -#define SBSP_WRITENOHISTORY 0x08000000 -#define SBSP_REDIRECT 0x40000000 -#define SBSP_INITIATEDBYHLINKFRAME 0x80000000 -#define FCW_STATUS 0x0001 -#define FCW_TOOLBAR 0x0002 -#define FCW_TREE 0x0003 -#define FCW_INTERNETBAR 0x0006 -#define FCW_PROGRESS 0x0008 -#define FCT_MERGE 0x0001 -#define FCT_CONFIGABLE 0x0002 -#define FCT_ADDTOEND 0x0004 -#if 0 -typedef LPARAM LPTBBUTTONSB; - -#else -#include -typedef LPTBBUTTON LPTBBUTTONSB; -#endif -/***************************************************************************** - * IShellBrowser interface - */ -#ifndef __IShellBrowser_INTERFACE_DEFINED__ -#define __IShellBrowser_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellBrowser, 0x000214e2, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellBrowser : public IOleWindow -{ - virtual HRESULT STDMETHODCALLTYPE InsertMenusSB( - HMENU hmenuShared, - LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMenuSB( - HMENU hmenuShared, - HOLEMENU holemenuReserved, - HWND hwndActiveObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB( - HMENU hmenuShared) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB( - LPCOLESTR pszStatusText) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableModelessSB( - BOOL fEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB( - MSG* pmsg, - WORD wID) = 0; - - virtual HRESULT STDMETHODCALLTYPE BrowseObject( - LPCITEMIDLIST pidl, - UINT wFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetViewStateStream( - DWORD grfMode, - IStream** ppStrm) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetControlWindow( - UINT id, - HWND* phwnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SendControlMsg( - UINT id, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT* pret) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView( - IShellView** ppshv) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive( - IShellView* pshv) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetToolbarItems( - LPTBBUTTONSB lpButtons, - UINT nButtons, - UINT uFlags) = 0; - -}; -#else -typedef struct IShellBrowserVtbl IShellBrowserVtbl; -struct IShellBrowser { - const IShellBrowserVtbl* lpVtbl; -}; -struct IShellBrowserVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellBrowser* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellBrowser* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellBrowser* This); - - /*** IOleWindow methods ***/ - HRESULT (STDMETHODCALLTYPE *GetWindow)( - IShellBrowser* This, - HWND* phwnd); - - HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)( - IShellBrowser* This, - BOOL fEnterMode); - - /*** IShellBrowser methods ***/ - HRESULT (STDMETHODCALLTYPE *InsertMenusSB)( - IShellBrowser* This, - HMENU hmenuShared, - LPOLEMENUGROUPWIDTHS lpMenuWidths); - - HRESULT (STDMETHODCALLTYPE *SetMenuSB)( - IShellBrowser* This, - HMENU hmenuShared, - HOLEMENU holemenuReserved, - HWND hwndActiveObject); - - HRESULT (STDMETHODCALLTYPE *RemoveMenusSB)( - IShellBrowser* This, - HMENU hmenuShared); - - HRESULT (STDMETHODCALLTYPE *SetStatusTextSB)( - IShellBrowser* This, - LPCOLESTR pszStatusText); - - HRESULT (STDMETHODCALLTYPE *EnableModelessSB)( - IShellBrowser* This, - BOOL fEnable); - - HRESULT (STDMETHODCALLTYPE *TranslateAcceleratorSB)( - IShellBrowser* This, - MSG* pmsg, - WORD wID); - - HRESULT (STDMETHODCALLTYPE *BrowseObject)( - IShellBrowser* This, - LPCITEMIDLIST pidl, - UINT wFlags); - - HRESULT (STDMETHODCALLTYPE *GetViewStateStream)( - IShellBrowser* This, - DWORD grfMode, - IStream** ppStrm); - - HRESULT (STDMETHODCALLTYPE *GetControlWindow)( - IShellBrowser* This, - UINT id, - HWND* phwnd); - - HRESULT (STDMETHODCALLTYPE *SendControlMsg)( - IShellBrowser* This, - UINT id, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT* pret); - - HRESULT (STDMETHODCALLTYPE *QueryActiveShellView)( - IShellBrowser* This, - IShellView** ppshv); - - HRESULT (STDMETHODCALLTYPE *OnViewWindowActive)( - IShellBrowser* This, - IShellView* pshv); - - HRESULT (STDMETHODCALLTYPE *SetToolbarItems)( - IShellBrowser* This, - LPTBBUTTONSB lpButtons, - UINT nButtons, - UINT uFlags); - -}; - -/*** IUnknown methods ***/ -#define IShellBrowser_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellBrowser_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellBrowser_Release(p) (p)->lpVtbl->Release(p) -/*** IOleWindow methods ***/ -#define IShellBrowser_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a) -#define IShellBrowser_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a) -/*** IShellBrowser methods ***/ -#define IShellBrowser_InsertMenusSB(p,a,b) (p)->lpVtbl->InsertMenusSB(p,a,b) -#define IShellBrowser_SetMenuSB(p,a,b,c) (p)->lpVtbl->SetMenuSB(p,a,b,c) -#define IShellBrowser_RemoveMenusSB(p,a) (p)->lpVtbl->RemoveMenusSB(p,a) -#define IShellBrowser_SetStatusTextSB(p,a) (p)->lpVtbl->SetStatusTextSB(p,a) -#define IShellBrowser_EnableModelessSB(p,a) (p)->lpVtbl->EnableModelessSB(p,a) -#define IShellBrowser_TranslateAcceleratorSB(p,a,b) (p)->lpVtbl->TranslateAcceleratorSB(p,a,b) -#define IShellBrowser_BrowseObject(p,a,b) (p)->lpVtbl->BrowseObject(p,a,b) -#define IShellBrowser_GetViewStateStream(p,a,b) (p)->lpVtbl->GetViewStateStream(p,a,b) -#define IShellBrowser_GetControlWindow(p,a,b) (p)->lpVtbl->GetControlWindow(p,a,b) -#define IShellBrowser_SendControlMsg(p,a,b,c,d,e) (p)->lpVtbl->SendControlMsg(p,a,b,c,d,e) -#define IShellBrowser_QueryActiveShellView(p,a) (p)->lpVtbl->QueryActiveShellView(p,a) -#define IShellBrowser_OnViewWindowActive(p,a) (p)->lpVtbl->OnViewWindowActive(p,a) -#define IShellBrowser_SetToolbarItems(p,a,b,c) (p)->lpVtbl->SetToolbarItems(p,a,b,c) - -#endif - -#define IShellBrowser_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IOleWindow methods ***/ \ - STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \ - STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; \ - /*** IShellBrowser methods ***/ \ - STDMETHOD_(HRESULT,InsertMenusSB)(THIS_ HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) PURE; \ - STDMETHOD_(HRESULT,SetMenuSB)(THIS_ HMENU hmenuShared, HOLEMENU holemenuReserved, HWND hwndActiveObject) PURE; \ - STDMETHOD_(HRESULT,RemoveMenusSB)(THIS_ HMENU hmenuShared) PURE; \ - STDMETHOD_(HRESULT,SetStatusTextSB)(THIS_ LPCOLESTR pszStatusText) PURE; \ - STDMETHOD_(HRESULT,EnableModelessSB)(THIS_ BOOL fEnable) PURE; \ - STDMETHOD_(HRESULT,TranslateAcceleratorSB)(THIS_ MSG* pmsg, WORD wID) PURE; \ - STDMETHOD_(HRESULT,BrowseObject)(THIS_ LPCITEMIDLIST pidl, UINT wFlags) PURE; \ - STDMETHOD_(HRESULT,GetViewStateStream)(THIS_ DWORD grfMode, IStream** ppStrm) PURE; \ - STDMETHOD_(HRESULT,GetControlWindow)(THIS_ UINT id, HWND* phwnd) PURE; \ - STDMETHOD_(HRESULT,SendControlMsg)(THIS_ UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret) PURE; \ - STDMETHOD_(HRESULT,QueryActiveShellView)(THIS_ IShellView** ppshv) PURE; \ - STDMETHOD_(HRESULT,OnViewWindowActive)(THIS_ IShellView* pshv) PURE; \ - STDMETHOD_(HRESULT,SetToolbarItems)(THIS_ LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags) PURE; - -HRESULT CALLBACK IShellBrowser_InsertMenusSB_Proxy( - IShellBrowser* This, - HMENU hmenuShared, - LPOLEMENUGROUPWIDTHS lpMenuWidths); -void __RPC_STUB IShellBrowser_InsertMenusSB_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_SetMenuSB_Proxy( - IShellBrowser* This, - HMENU hmenuShared, - HOLEMENU holemenuReserved, - HWND hwndActiveObject); -void __RPC_STUB IShellBrowser_SetMenuSB_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_RemoveMenusSB_Proxy( - IShellBrowser* This, - HMENU hmenuShared); -void __RPC_STUB IShellBrowser_RemoveMenusSB_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_SetStatusTextSB_Proxy( - IShellBrowser* This, - LPCOLESTR pszStatusText); -void __RPC_STUB IShellBrowser_SetStatusTextSB_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_EnableModelessSB_Proxy( - IShellBrowser* This, - BOOL fEnable); -void __RPC_STUB IShellBrowser_EnableModelessSB_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_TranslateAcceleratorSB_Proxy( - IShellBrowser* This, - MSG* pmsg, - WORD wID); -void __RPC_STUB IShellBrowser_TranslateAcceleratorSB_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_BrowseObject_Proxy( - IShellBrowser* This, - LPCITEMIDLIST pidl, - UINT wFlags); -void __RPC_STUB IShellBrowser_BrowseObject_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_GetViewStateStream_Proxy( - IShellBrowser* This, - DWORD grfMode, - IStream** ppStrm); -void __RPC_STUB IShellBrowser_GetViewStateStream_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_GetControlWindow_Proxy( - IShellBrowser* This, - UINT id, - HWND* phwnd); -void __RPC_STUB IShellBrowser_GetControlWindow_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_QueryActiveShellView_Proxy( - IShellBrowser* This, - IShellView** ppshv); -void __RPC_STUB IShellBrowser_QueryActiveShellView_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellBrowser_OnViewWindowActive_Proxy( - IShellBrowser* This, - IShellView* pshv); -void __RPC_STUB IShellBrowser_OnViewWindowActive_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellBrowser_INTERFACE_DEFINED__ */ - -#ifndef __IShellLinkA_FWD_DEFINED__ -#define __IShellLinkA_FWD_DEFINED__ -typedef struct IShellLinkA IShellLinkA; -#endif - -typedef enum { - SLR_NO_UI = 0x1, - SLR_ANY_MATCH = 0x2, - SLR_UPDATE = 0x4, - SLR_NOUPDATE = 0x8, - SLR_NOSEARCH = 0x10, - SLR_NOTRACK = 0x20, - SLR_NOLINKINFO = 0x40, - SLR_INVOKE_MSI = 0x80, - SLR_NO_UI_WITH_MSG_PUMP = 0x101 -} SLR_FLAGS; - -typedef enum { - SLGP_SHORTPATH = 0x1, - SLGP_UNCPRIORITY = 0x2, - SLGP_RAWPATH = 0x4 -} SLGP_FLAGS; - -/***************************************************************************** - * IShellLinkA interface - */ -#ifndef __IShellLinkA_INTERFACE_DEFINED__ -#define __IShellLinkA_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellLinkA, 0x000214ee, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellLinkA : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE GetPath( - LPSTR pszFile, - int cch, - WIN32_FIND_DATAA* pfd, - DWORD fFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIDList( - LPITEMIDLIST* ppidl) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetIDList( - LPCITEMIDLIST pidl) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDescription( - LPSTR pszName, - int cch) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDescription( - LPCSTR pszName) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory( - LPSTR pszDir, - int cch) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory( - LPCSTR pszDir) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetArguments( - LPSTR pszArgs, - int cch) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetArguments( - LPCSTR pszArgs) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHotkey( - WORD* pwHotkey) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetHotkey( - WORD wHotkey) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetShowCmd( - int* piShowCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetShowCmd( - int iShowCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIconLocation( - LPSTR pszIconPath, - int cch, - int* piIcon) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetIconLocation( - LPCSTR pszIconPath, - int iIcon) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRelativePath( - LPCSTR pszPathRel, - DWORD dwReserved) = 0; - - virtual HRESULT STDMETHODCALLTYPE Resolve( - HWND hwnd, - DWORD fFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPath( - LPCSTR pszFile) = 0; - -}; -#else -typedef struct IShellLinkAVtbl IShellLinkAVtbl; -struct IShellLinkA { - const IShellLinkAVtbl* lpVtbl; -}; -struct IShellLinkAVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellLinkA* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellLinkA* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellLinkA* This); - - /*** IShellLinkA methods ***/ - HRESULT (STDMETHODCALLTYPE *GetPath)( - IShellLinkA* This, - LPSTR pszFile, - int cch, - WIN32_FIND_DATAA* pfd, - DWORD fFlags); - - HRESULT (STDMETHODCALLTYPE *GetIDList)( - IShellLinkA* This, - LPITEMIDLIST* ppidl); - - HRESULT (STDMETHODCALLTYPE *SetIDList)( - IShellLinkA* This, - LPCITEMIDLIST pidl); - - HRESULT (STDMETHODCALLTYPE *GetDescription)( - IShellLinkA* This, - LPSTR pszName, - int cch); - - HRESULT (STDMETHODCALLTYPE *SetDescription)( - IShellLinkA* This, - LPCSTR pszName); - - HRESULT (STDMETHODCALLTYPE *GetWorkingDirectory)( - IShellLinkA* This, - LPSTR pszDir, - int cch); - - HRESULT (STDMETHODCALLTYPE *SetWorkingDirectory)( - IShellLinkA* This, - LPCSTR pszDir); - - HRESULT (STDMETHODCALLTYPE *GetArguments)( - IShellLinkA* This, - LPSTR pszArgs, - int cch); - - HRESULT (STDMETHODCALLTYPE *SetArguments)( - IShellLinkA* This, - LPCSTR pszArgs); - - HRESULT (STDMETHODCALLTYPE *GetHotkey)( - IShellLinkA* This, - WORD* pwHotkey); - - HRESULT (STDMETHODCALLTYPE *SetHotkey)( - IShellLinkA* This, - WORD wHotkey); - - HRESULT (STDMETHODCALLTYPE *GetShowCmd)( - IShellLinkA* This, - int* piShowCmd); - - HRESULT (STDMETHODCALLTYPE *SetShowCmd)( - IShellLinkA* This, - int iShowCmd); - - HRESULT (STDMETHODCALLTYPE *GetIconLocation)( - IShellLinkA* This, - LPSTR pszIconPath, - int cch, - int* piIcon); - - HRESULT (STDMETHODCALLTYPE *SetIconLocation)( - IShellLinkA* This, - LPCSTR pszIconPath, - int iIcon); - - HRESULT (STDMETHODCALLTYPE *SetRelativePath)( - IShellLinkA* This, - LPCSTR pszPathRel, - DWORD dwReserved); - - HRESULT (STDMETHODCALLTYPE *Resolve)( - IShellLinkA* This, - HWND hwnd, - DWORD fFlags); - - HRESULT (STDMETHODCALLTYPE *SetPath)( - IShellLinkA* This, - LPCSTR pszFile); - -}; - -/*** IUnknown methods ***/ -#define IShellLinkA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellLinkA_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellLinkA_Release(p) (p)->lpVtbl->Release(p) -/*** IShellLinkA methods ***/ -#define IShellLinkA_GetPath(p,a,b,c,d) (p)->lpVtbl->GetPath(p,a,b,c,d) -#define IShellLinkA_GetIDList(p,a) (p)->lpVtbl->GetIDList(p,a) -#define IShellLinkA_SetIDList(p,a) (p)->lpVtbl->SetIDList(p,a) -#define IShellLinkA_GetDescription(p,a,b) (p)->lpVtbl->GetDescription(p,a,b) -#define IShellLinkA_SetDescription(p,a) (p)->lpVtbl->SetDescription(p,a) -#define IShellLinkA_GetWorkingDirectory(p,a,b) (p)->lpVtbl->GetWorkingDirectory(p,a,b) -#define IShellLinkA_SetWorkingDirectory(p,a) (p)->lpVtbl->SetWorkingDirectory(p,a) -#define IShellLinkA_GetArguments(p,a,b) (p)->lpVtbl->GetArguments(p,a,b) -#define IShellLinkA_SetArguments(p,a) (p)->lpVtbl->SetArguments(p,a) -#define IShellLinkA_GetHotkey(p,a) (p)->lpVtbl->GetHotkey(p,a) -#define IShellLinkA_SetHotkey(p,a) (p)->lpVtbl->SetHotkey(p,a) -#define IShellLinkA_GetShowCmd(p,a) (p)->lpVtbl->GetShowCmd(p,a) -#define IShellLinkA_SetShowCmd(p,a) (p)->lpVtbl->SetShowCmd(p,a) -#define IShellLinkA_GetIconLocation(p,a,b,c) (p)->lpVtbl->GetIconLocation(p,a,b,c) -#define IShellLinkA_SetIconLocation(p,a,b) (p)->lpVtbl->SetIconLocation(p,a,b) -#define IShellLinkA_SetRelativePath(p,a,b) (p)->lpVtbl->SetRelativePath(p,a,b) -#define IShellLinkA_Resolve(p,a,b) (p)->lpVtbl->Resolve(p,a,b) -#define IShellLinkA_SetPath(p,a) (p)->lpVtbl->SetPath(p,a) - -#endif - -#define IShellLinkA_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellLinkA methods ***/ \ - STDMETHOD_(HRESULT,GetPath)(THIS_ LPSTR pszFile, int cch, WIN32_FIND_DATAA* pfd, DWORD fFlags) PURE; \ - STDMETHOD_(HRESULT,GetIDList)(THIS_ LPITEMIDLIST* ppidl) PURE; \ - STDMETHOD_(HRESULT,SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE; \ - STDMETHOD_(HRESULT,GetDescription)(THIS_ LPSTR pszName, int cch) PURE; \ - STDMETHOD_(HRESULT,SetDescription)(THIS_ LPCSTR pszName) PURE; \ - STDMETHOD_(HRESULT,GetWorkingDirectory)(THIS_ LPSTR pszDir, int cch) PURE; \ - STDMETHOD_(HRESULT,SetWorkingDirectory)(THIS_ LPCSTR pszDir) PURE; \ - STDMETHOD_(HRESULT,GetArguments)(THIS_ LPSTR pszArgs, int cch) PURE; \ - STDMETHOD_(HRESULT,SetArguments)(THIS_ LPCSTR pszArgs) PURE; \ - STDMETHOD_(HRESULT,GetHotkey)(THIS_ WORD* pwHotkey) PURE; \ - STDMETHOD_(HRESULT,SetHotkey)(THIS_ WORD wHotkey) PURE; \ - STDMETHOD_(HRESULT,GetShowCmd)(THIS_ int* piShowCmd) PURE; \ - STDMETHOD_(HRESULT,SetShowCmd)(THIS_ int iShowCmd) PURE; \ - STDMETHOD_(HRESULT,GetIconLocation)(THIS_ LPSTR pszIconPath, int cch, int* piIcon) PURE; \ - STDMETHOD_(HRESULT,SetIconLocation)(THIS_ LPCSTR pszIconPath, int iIcon) PURE; \ - STDMETHOD_(HRESULT,SetRelativePath)(THIS_ LPCSTR pszPathRel, DWORD dwReserved) PURE; \ - STDMETHOD_(HRESULT,Resolve)(THIS_ HWND hwnd, DWORD fFlags) PURE; \ - STDMETHOD_(HRESULT,SetPath)(THIS_ LPCSTR pszFile) PURE; - -HRESULT CALLBACK IShellLinkA_GetPath_Proxy( - IShellLinkA* This, - LPSTR pszFile, - int cch, - WIN32_FIND_DATAA* pfd, - DWORD fFlags); -void __RPC_STUB IShellLinkA_GetPath_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetIDList_Proxy( - IShellLinkA* This, - LPITEMIDLIST* ppidl); -void __RPC_STUB IShellLinkA_GetIDList_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetIDList_Proxy( - IShellLinkA* This, - LPCITEMIDLIST pidl); -void __RPC_STUB IShellLinkA_SetIDList_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetDescription_Proxy( - IShellLinkA* This, - LPSTR pszName, - int cch); -void __RPC_STUB IShellLinkA_GetDescription_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetDescription_Proxy( - IShellLinkA* This, - LPCSTR pszName); -void __RPC_STUB IShellLinkA_SetDescription_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetWorkingDirectory_Proxy( - IShellLinkA* This, - LPSTR pszDir, - int cch); -void __RPC_STUB IShellLinkA_GetWorkingDirectory_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetWorkingDirectory_Proxy( - IShellLinkA* This, - LPCSTR pszDir); -void __RPC_STUB IShellLinkA_SetWorkingDirectory_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetArguments_Proxy( - IShellLinkA* This, - LPSTR pszArgs, - int cch); -void __RPC_STUB IShellLinkA_GetArguments_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetArguments_Proxy( - IShellLinkA* This, - LPCSTR pszArgs); -void __RPC_STUB IShellLinkA_SetArguments_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetHotkey_Proxy( - IShellLinkA* This, - WORD* pwHotkey); -void __RPC_STUB IShellLinkA_GetHotkey_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetHotkey_Proxy( - IShellLinkA* This, - WORD wHotkey); -void __RPC_STUB IShellLinkA_SetHotkey_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetShowCmd_Proxy( - IShellLinkA* This, - int* piShowCmd); -void __RPC_STUB IShellLinkA_GetShowCmd_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetShowCmd_Proxy( - IShellLinkA* This, - int iShowCmd); -void __RPC_STUB IShellLinkA_SetShowCmd_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_GetIconLocation_Proxy( - IShellLinkA* This, - LPSTR pszIconPath, - int cch, - int* piIcon); -void __RPC_STUB IShellLinkA_GetIconLocation_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetIconLocation_Proxy( - IShellLinkA* This, - LPCSTR pszIconPath, - int iIcon); -void __RPC_STUB IShellLinkA_SetIconLocation_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetRelativePath_Proxy( - IShellLinkA* This, - LPCSTR pszPathRel, - DWORD dwReserved); -void __RPC_STUB IShellLinkA_SetRelativePath_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_Resolve_Proxy( - IShellLinkA* This, - HWND hwnd, - DWORD fFlags); -void __RPC_STUB IShellLinkA_Resolve_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkA_SetPath_Proxy( - IShellLinkA* This, - LPCSTR pszFile); -void __RPC_STUB IShellLinkA_SetPath_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellLinkA_INTERFACE_DEFINED__ */ - -#ifndef __IShellLinkW_FWD_DEFINED__ -#define __IShellLinkW_FWD_DEFINED__ -typedef struct IShellLinkW IShellLinkW; -#endif - -/***************************************************************************** - * IShellLinkW interface - */ -#ifndef __IShellLinkW_INTERFACE_DEFINED__ -#define __IShellLinkW_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellLinkW, 0x000214f9, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellLinkW : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE GetPath( - LPWSTR pszFile, - int cch, - WIN32_FIND_DATAW* pfd, - DWORD fFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIDList( - LPITEMIDLIST* ppidl) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetIDList( - LPCITEMIDLIST pidl) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDescription( - LPWSTR pszName, - int cch) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDescription( - LPCWSTR pszName) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory( - LPWSTR pszDir, - int cch) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory( - LPCWSTR pszDir) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetArguments( - LPWSTR pszArgs, - int cch) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetArguments( - LPCWSTR pszArgs) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHotkey( - WORD* pwHotkey) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetHotkey( - WORD wHotkey) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetShowCmd( - int* piShowCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetShowCmd( - int iShowCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetIconLocation( - LPWSTR pszIconPath, - int cch, - int* piIcon) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetIconLocation( - LPCWSTR pszIconPath, - int iIcon) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetRelativePath( - LPCWSTR pszPathRel, - DWORD dwReserved) = 0; - - virtual HRESULT STDMETHODCALLTYPE Resolve( - HWND hwnd, - DWORD fFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPath( - LPCWSTR pszFile) = 0; - -}; -#else -typedef struct IShellLinkWVtbl IShellLinkWVtbl; -struct IShellLinkW { - const IShellLinkWVtbl* lpVtbl; -}; -struct IShellLinkWVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellLinkW* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellLinkW* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellLinkW* This); - - /*** IShellLinkW methods ***/ - HRESULT (STDMETHODCALLTYPE *GetPath)( - IShellLinkW* This, - LPWSTR pszFile, - int cch, - WIN32_FIND_DATAW* pfd, - DWORD fFlags); - - HRESULT (STDMETHODCALLTYPE *GetIDList)( - IShellLinkW* This, - LPITEMIDLIST* ppidl); - - HRESULT (STDMETHODCALLTYPE *SetIDList)( - IShellLinkW* This, - LPCITEMIDLIST pidl); - - HRESULT (STDMETHODCALLTYPE *GetDescription)( - IShellLinkW* This, - LPWSTR pszName, - int cch); - - HRESULT (STDMETHODCALLTYPE *SetDescription)( - IShellLinkW* This, - LPCWSTR pszName); - - HRESULT (STDMETHODCALLTYPE *GetWorkingDirectory)( - IShellLinkW* This, - LPWSTR pszDir, - int cch); - - HRESULT (STDMETHODCALLTYPE *SetWorkingDirectory)( - IShellLinkW* This, - LPCWSTR pszDir); - - HRESULT (STDMETHODCALLTYPE *GetArguments)( - IShellLinkW* This, - LPWSTR pszArgs, - int cch); - - HRESULT (STDMETHODCALLTYPE *SetArguments)( - IShellLinkW* This, - LPCWSTR pszArgs); - - HRESULT (STDMETHODCALLTYPE *GetHotkey)( - IShellLinkW* This, - WORD* pwHotkey); - - HRESULT (STDMETHODCALLTYPE *SetHotkey)( - IShellLinkW* This, - WORD wHotkey); - - HRESULT (STDMETHODCALLTYPE *GetShowCmd)( - IShellLinkW* This, - int* piShowCmd); - - HRESULT (STDMETHODCALLTYPE *SetShowCmd)( - IShellLinkW* This, - int iShowCmd); - - HRESULT (STDMETHODCALLTYPE *GetIconLocation)( - IShellLinkW* This, - LPWSTR pszIconPath, - int cch, - int* piIcon); - - HRESULT (STDMETHODCALLTYPE *SetIconLocation)( - IShellLinkW* This, - LPCWSTR pszIconPath, - int iIcon); - - HRESULT (STDMETHODCALLTYPE *SetRelativePath)( - IShellLinkW* This, - LPCWSTR pszPathRel, - DWORD dwReserved); - - HRESULT (STDMETHODCALLTYPE *Resolve)( - IShellLinkW* This, - HWND hwnd, - DWORD fFlags); - - HRESULT (STDMETHODCALLTYPE *SetPath)( - IShellLinkW* This, - LPCWSTR pszFile); - -}; - -/*** IUnknown methods ***/ -#define IShellLinkW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellLinkW_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellLinkW_Release(p) (p)->lpVtbl->Release(p) -/*** IShellLinkW methods ***/ -#define IShellLinkW_GetPath(p,a,b,c,d) (p)->lpVtbl->GetPath(p,a,b,c,d) -#define IShellLinkW_GetIDList(p,a) (p)->lpVtbl->GetIDList(p,a) -#define IShellLinkW_SetIDList(p,a) (p)->lpVtbl->SetIDList(p,a) -#define IShellLinkW_GetDescription(p,a,b) (p)->lpVtbl->GetDescription(p,a,b) -#define IShellLinkW_SetDescription(p,a) (p)->lpVtbl->SetDescription(p,a) -#define IShellLinkW_GetWorkingDirectory(p,a,b) (p)->lpVtbl->GetWorkingDirectory(p,a,b) -#define IShellLinkW_SetWorkingDirectory(p,a) (p)->lpVtbl->SetWorkingDirectory(p,a) -#define IShellLinkW_GetArguments(p,a,b) (p)->lpVtbl->GetArguments(p,a,b) -#define IShellLinkW_SetArguments(p,a) (p)->lpVtbl->SetArguments(p,a) -#define IShellLinkW_GetHotkey(p,a) (p)->lpVtbl->GetHotkey(p,a) -#define IShellLinkW_SetHotkey(p,a) (p)->lpVtbl->SetHotkey(p,a) -#define IShellLinkW_GetShowCmd(p,a) (p)->lpVtbl->GetShowCmd(p,a) -#define IShellLinkW_SetShowCmd(p,a) (p)->lpVtbl->SetShowCmd(p,a) -#define IShellLinkW_GetIconLocation(p,a,b,c) (p)->lpVtbl->GetIconLocation(p,a,b,c) -#define IShellLinkW_SetIconLocation(p,a,b) (p)->lpVtbl->SetIconLocation(p,a,b) -#define IShellLinkW_SetRelativePath(p,a,b) (p)->lpVtbl->SetRelativePath(p,a,b) -#define IShellLinkW_Resolve(p,a,b) (p)->lpVtbl->Resolve(p,a,b) -#define IShellLinkW_SetPath(p,a) (p)->lpVtbl->SetPath(p,a) - -#endif - -#define IShellLinkW_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellLinkW methods ***/ \ - STDMETHOD_(HRESULT,GetPath)(THIS_ LPWSTR pszFile, int cch, WIN32_FIND_DATAW* pfd, DWORD fFlags) PURE; \ - STDMETHOD_(HRESULT,GetIDList)(THIS_ LPITEMIDLIST* ppidl) PURE; \ - STDMETHOD_(HRESULT,SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE; \ - STDMETHOD_(HRESULT,GetDescription)(THIS_ LPWSTR pszName, int cch) PURE; \ - STDMETHOD_(HRESULT,SetDescription)(THIS_ LPCWSTR pszName) PURE; \ - STDMETHOD_(HRESULT,GetWorkingDirectory)(THIS_ LPWSTR pszDir, int cch) PURE; \ - STDMETHOD_(HRESULT,SetWorkingDirectory)(THIS_ LPCWSTR pszDir) PURE; \ - STDMETHOD_(HRESULT,GetArguments)(THIS_ LPWSTR pszArgs, int cch) PURE; \ - STDMETHOD_(HRESULT,SetArguments)(THIS_ LPCWSTR pszArgs) PURE; \ - STDMETHOD_(HRESULT,GetHotkey)(THIS_ WORD* pwHotkey) PURE; \ - STDMETHOD_(HRESULT,SetHotkey)(THIS_ WORD wHotkey) PURE; \ - STDMETHOD_(HRESULT,GetShowCmd)(THIS_ int* piShowCmd) PURE; \ - STDMETHOD_(HRESULT,SetShowCmd)(THIS_ int iShowCmd) PURE; \ - STDMETHOD_(HRESULT,GetIconLocation)(THIS_ LPWSTR pszIconPath, int cch, int* piIcon) PURE; \ - STDMETHOD_(HRESULT,SetIconLocation)(THIS_ LPCWSTR pszIconPath, int iIcon) PURE; \ - STDMETHOD_(HRESULT,SetRelativePath)(THIS_ LPCWSTR pszPathRel, DWORD dwReserved) PURE; \ - STDMETHOD_(HRESULT,Resolve)(THIS_ HWND hwnd, DWORD fFlags) PURE; \ - STDMETHOD_(HRESULT,SetPath)(THIS_ LPCWSTR pszFile) PURE; - -HRESULT CALLBACK IShellLinkW_GetPath_Proxy( - IShellLinkW* This, - LPWSTR pszFile, - int cch, - WIN32_FIND_DATAW* pfd, - DWORD fFlags); -void __RPC_STUB IShellLinkW_GetPath_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetIDList_Proxy( - IShellLinkW* This, - LPITEMIDLIST* ppidl); -void __RPC_STUB IShellLinkW_GetIDList_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetIDList_Proxy( - IShellLinkW* This, - LPCITEMIDLIST pidl); -void __RPC_STUB IShellLinkW_SetIDList_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetDescription_Proxy( - IShellLinkW* This, - LPWSTR pszName, - int cch); -void __RPC_STUB IShellLinkW_GetDescription_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetDescription_Proxy( - IShellLinkW* This, - LPCWSTR pszName); -void __RPC_STUB IShellLinkW_SetDescription_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetWorkingDirectory_Proxy( - IShellLinkW* This, - LPWSTR pszDir, - int cch); -void __RPC_STUB IShellLinkW_GetWorkingDirectory_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetWorkingDirectory_Proxy( - IShellLinkW* This, - LPCWSTR pszDir); -void __RPC_STUB IShellLinkW_SetWorkingDirectory_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetArguments_Proxy( - IShellLinkW* This, - LPWSTR pszArgs, - int cch); -void __RPC_STUB IShellLinkW_GetArguments_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetArguments_Proxy( - IShellLinkW* This, - LPCWSTR pszArgs); -void __RPC_STUB IShellLinkW_SetArguments_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetHotkey_Proxy( - IShellLinkW* This, - WORD* pwHotkey); -void __RPC_STUB IShellLinkW_GetHotkey_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetHotkey_Proxy( - IShellLinkW* This, - WORD wHotkey); -void __RPC_STUB IShellLinkW_SetHotkey_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetShowCmd_Proxy( - IShellLinkW* This, - int* piShowCmd); -void __RPC_STUB IShellLinkW_GetShowCmd_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetShowCmd_Proxy( - IShellLinkW* This, - int iShowCmd); -void __RPC_STUB IShellLinkW_SetShowCmd_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_GetIconLocation_Proxy( - IShellLinkW* This, - LPWSTR pszIconPath, - int cch, - int* piIcon); -void __RPC_STUB IShellLinkW_GetIconLocation_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetIconLocation_Proxy( - IShellLinkW* This, - LPCWSTR pszIconPath, - int iIcon); -void __RPC_STUB IShellLinkW_SetIconLocation_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetRelativePath_Proxy( - IShellLinkW* This, - LPCWSTR pszPathRel, - DWORD dwReserved); -void __RPC_STUB IShellLinkW_SetRelativePath_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_Resolve_Proxy( - IShellLinkW* This, - HWND hwnd, - DWORD fFlags); -void __RPC_STUB IShellLinkW_Resolve_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IShellLinkW_SetPath_Proxy( - IShellLinkW* This, - LPCWSTR pszFile); -void __RPC_STUB IShellLinkW_SetPath_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellLinkW_INTERFACE_DEFINED__ */ - -#define IShellLink WINELIB_NAME_AW(IShellLink) -#ifndef __IShellExtInit_FWD_DEFINED__ -#define __IShellExtInit_FWD_DEFINED__ -typedef struct IShellExtInit IShellExtInit; -#endif - -typedef IShellExtInit *LPSHELLEXTINIT; - -/***************************************************************************** - * IShellExtInit interface - */ -#ifndef __IShellExtInit_INTERFACE_DEFINED__ -#define __IShellExtInit_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellExtInit, 0x000214e8, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellExtInit : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE Initialize( - LPCITEMIDLIST pidlFolder, - IDataObject* pdtobj, - HKEY hkeyProgID) = 0; - -}; -#else -typedef struct IShellExtInitVtbl IShellExtInitVtbl; -struct IShellExtInit { - const IShellExtInitVtbl* lpVtbl; -}; -struct IShellExtInitVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellExtInit* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellExtInit* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellExtInit* This); - - /*** IShellExtInit methods ***/ - HRESULT (STDMETHODCALLTYPE *Initialize)( - IShellExtInit* This, - LPCITEMIDLIST pidlFolder, - IDataObject* pdtobj, - HKEY hkeyProgID); - -}; - -/*** IUnknown methods ***/ -#define IShellExtInit_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellExtInit_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellExtInit_Release(p) (p)->lpVtbl->Release(p) -/*** IShellExtInit methods ***/ -#define IShellExtInit_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c) - -#endif - -#define IShellExtInit_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellExtInit methods ***/ \ - STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidlFolder, IDataObject* pdtobj, HKEY hkeyProgID) PURE; - -HRESULT CALLBACK IShellExtInit_Initialize_Proxy( - IShellExtInit* This, - LPCITEMIDLIST pidlFolder, - IDataObject* pdtobj, - HKEY hkeyProgID); -void __RPC_STUB IShellExtInit_Initialize_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellExtInit_INTERFACE_DEFINED__ */ - -#ifndef __IPersistFolder3_FWD_DEFINED__ -#define __IPersistFolder3_FWD_DEFINED__ -typedef struct IPersistFolder3 IPersistFolder3; -#endif - -typedef struct { - LPITEMIDLIST pidlTargetFolder; - WCHAR szTargetParsingName[260]; - WCHAR szNetworkProvider[260]; - DWORD dwAttributes; - int csidl; -} PERSIST_FOLDER_TARGET_INFO; - -/***************************************************************************** - * IPersistFolder3 interface - */ -#ifndef __IPersistFolder3_INTERFACE_DEFINED__ -#define __IPersistFolder3_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IPersistFolder3, 0xcef04fdf, 0xfe72, 0x11d2, 0x87,0xa5, 0x00,0xc0,0x4f,0x68,0x37,0xcf); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IPersistFolder3 : public IPersistFolder2 -{ - virtual HRESULT STDMETHODCALLTYPE InitializeEx( - IBindCtx* pbc, - LPCITEMIDLIST pidlRoot, - const PERSIST_FOLDER_TARGET_INFO* ppfti) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFolderTargetInfo( - PERSIST_FOLDER_TARGET_INFO* ppfti) = 0; - -}; -#else -typedef struct IPersistFolder3Vtbl IPersistFolder3Vtbl; -struct IPersistFolder3 { - const IPersistFolder3Vtbl* lpVtbl; -}; -struct IPersistFolder3Vtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IPersistFolder3* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IPersistFolder3* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IPersistFolder3* This); - - /*** IPersist methods ***/ - HRESULT (STDMETHODCALLTYPE *GetClassID)( - IPersistFolder3* This, - CLSID* pClassID); - - /*** IPersistFolder methods ***/ - HRESULT (STDMETHODCALLTYPE *Initialize)( - IPersistFolder3* This, - LPCITEMIDLIST pidl); - - /*** IPersistFolder2 methods ***/ - HRESULT (STDMETHODCALLTYPE *GetCurFolder)( - IPersistFolder3* This, - LPITEMIDLIST* ppidl); - - /*** IPersistFolder3 methods ***/ - HRESULT (STDMETHODCALLTYPE *InitializeEx)( - IPersistFolder3* This, - IBindCtx* pbc, - LPCITEMIDLIST pidlRoot, - const PERSIST_FOLDER_TARGET_INFO* ppfti); - - HRESULT (STDMETHODCALLTYPE *GetFolderTargetInfo)( - IPersistFolder3* This, - PERSIST_FOLDER_TARGET_INFO* ppfti); - -}; - -/*** IUnknown methods ***/ -#define IPersistFolder3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IPersistFolder3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IPersistFolder3_Release(p) (p)->lpVtbl->Release(p) -/*** IPersist methods ***/ -#define IPersistFolder3_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a) -/*** IPersistFolder methods ***/ -#define IPersistFolder3_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -/*** IPersistFolder2 methods ***/ -#define IPersistFolder3_GetCurFolder(p,a) (p)->lpVtbl->GetCurFolder(p,a) -/*** IPersistFolder3 methods ***/ -#define IPersistFolder3_InitializeEx(p,a,b,c) (p)->lpVtbl->InitializeEx(p,a,b,c) -#define IPersistFolder3_GetFolderTargetInfo(p,a) (p)->lpVtbl->GetFolderTargetInfo(p,a) - -#endif - -#define IPersistFolder3_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IPersist methods ***/ \ - STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \ - /*** IPersistFolder methods ***/ \ - STDMETHOD_(HRESULT,Initialize)(THIS_ LPCITEMIDLIST pidl) PURE; \ - /*** IPersistFolder2 methods ***/ \ - STDMETHOD_(HRESULT,GetCurFolder)(THIS_ LPITEMIDLIST* ppidl) PURE; \ - /*** IPersistFolder3 methods ***/ \ - STDMETHOD_(HRESULT,InitializeEx)(THIS_ IBindCtx* pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO* ppfti) PURE; \ - STDMETHOD_(HRESULT,GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO* ppfti) PURE; - -HRESULT CALLBACK IPersistFolder3_InitializeEx_Proxy( - IPersistFolder3* This, - IBindCtx* pbc, - LPCITEMIDLIST pidlRoot, - const PERSIST_FOLDER_TARGET_INFO* ppfti); -void __RPC_STUB IPersistFolder3_InitializeEx_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IPersistFolder3_GetFolderTargetInfo_Proxy( - IPersistFolder3* This, - PERSIST_FOLDER_TARGET_INFO* ppfti); -void __RPC_STUB IPersistFolder3_GetFolderTargetInfo_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IPersistFolder3_INTERFACE_DEFINED__ */ - -#ifndef __IExtractIconA_FWD_DEFINED__ -#define __IExtractIconA_FWD_DEFINED__ -typedef struct IExtractIconA IExtractIconA; -#endif - -#define GIL_OPENICON 0x0001 -#define GIL_FORSHELL 0x0002 -#define GIL_ASYNC 0x0020 -#define GIL_DEFAULTICON 0x0040 -#define GIL_FORSHORTCUT 0x0080 -#define GIL_SIMULATEDOC 0x0001 -#define GIL_PERINSTANCE 0x0002 -#define GIL_PERCLASS 0x0004 -#define GIL_NOTFILENAME 0x0008 -#define GIL_DONTCACHE 0x0010 -typedef IExtractIconA *LPEXTRACTICONA; - -/***************************************************************************** - * IExtractIconA interface - */ -#ifndef __IExtractIconA_INTERFACE_DEFINED__ -#define __IExtractIconA_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IExtractIconA, 0x000214eb, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IExtractIconA : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE GetIconLocation( - UINT uFlags, - LPSTR szIconFile, - UINT cchMax, - INT* piIndex, - UINT* pwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Extract( - LPCSTR pszFile, - UINT nIconIndex, - HICON* phiconLarge, - HICON* phiconSmall, - UINT nIconSize) = 0; - -}; -#else -typedef struct IExtractIconAVtbl IExtractIconAVtbl; -struct IExtractIconA { - const IExtractIconAVtbl* lpVtbl; -}; -struct IExtractIconAVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IExtractIconA* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IExtractIconA* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IExtractIconA* This); - - /*** IExtractIconA methods ***/ - HRESULT (STDMETHODCALLTYPE *GetIconLocation)( - IExtractIconA* This, - UINT uFlags, - LPSTR szIconFile, - UINT cchMax, - INT* piIndex, - UINT* pwFlags); - - HRESULT (STDMETHODCALLTYPE *Extract)( - IExtractIconA* This, - LPCSTR pszFile, - UINT nIconIndex, - HICON* phiconLarge, - HICON* phiconSmall, - UINT nIconSize); - -}; - -/*** IUnknown methods ***/ -#define IExtractIconA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IExtractIconA_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IExtractIconA_Release(p) (p)->lpVtbl->Release(p) -/*** IExtractIconA methods ***/ -#define IExtractIconA_GetIconLocation(p,a,b,c,d,e) (p)->lpVtbl->GetIconLocation(p,a,b,c,d,e) -#define IExtractIconA_Extract(p,a,b,c,d,e) (p)->lpVtbl->Extract(p,a,b,c,d,e) - -#endif - -#define IExtractIconA_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IExtractIconA methods ***/ \ - STDMETHOD_(HRESULT,GetIconLocation)(THIS_ UINT uFlags, LPSTR szIconFile, UINT cchMax, INT* piIndex, UINT* pwFlags) PURE; \ - STDMETHOD_(HRESULT,Extract)(THIS_ LPCSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) PURE; - -HRESULT CALLBACK IExtractIconA_GetIconLocation_Proxy( - IExtractIconA* This, - UINT uFlags, - LPSTR szIconFile, - UINT cchMax, - INT* piIndex, - UINT* pwFlags); -void __RPC_STUB IExtractIconA_GetIconLocation_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IExtractIconA_Extract_Proxy( - IExtractIconA* This, - LPCSTR pszFile, - UINT nIconIndex, - HICON* phiconLarge, - HICON* phiconSmall, - UINT nIconSize); -void __RPC_STUB IExtractIconA_Extract_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IExtractIconA_INTERFACE_DEFINED__ */ - -#ifndef __IExtractIconW_FWD_DEFINED__ -#define __IExtractIconW_FWD_DEFINED__ -typedef struct IExtractIconW IExtractIconW; -#endif - -typedef IExtractIconW *LPEXTRACTICONW; - -/***************************************************************************** - * IExtractIconW interface - */ -#ifndef __IExtractIconW_INTERFACE_DEFINED__ -#define __IExtractIconW_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IExtractIconW, 0x000214fa, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IExtractIconW : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE GetIconLocation( - UINT uFlags, - LPWSTR szIconFile, - UINT cchMax, - INT* piIndex, - UINT* pwFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE Extract( - LPCWSTR pszFile, - UINT nIconIndex, - HICON* phiconLarge, - HICON* phiconSmall, - UINT nIconSize) = 0; - -}; -#else -typedef struct IExtractIconWVtbl IExtractIconWVtbl; -struct IExtractIconW { - const IExtractIconWVtbl* lpVtbl; -}; -struct IExtractIconWVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IExtractIconW* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IExtractIconW* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IExtractIconW* This); - - /*** IExtractIconW methods ***/ - HRESULT (STDMETHODCALLTYPE *GetIconLocation)( - IExtractIconW* This, - UINT uFlags, - LPWSTR szIconFile, - UINT cchMax, - INT* piIndex, - UINT* pwFlags); - - HRESULT (STDMETHODCALLTYPE *Extract)( - IExtractIconW* This, - LPCWSTR pszFile, - UINT nIconIndex, - HICON* phiconLarge, - HICON* phiconSmall, - UINT nIconSize); - -}; - -/*** IUnknown methods ***/ -#define IExtractIconW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IExtractIconW_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IExtractIconW_Release(p) (p)->lpVtbl->Release(p) -/*** IExtractIconW methods ***/ -#define IExtractIconW_GetIconLocation(p,a,b,c,d,e) (p)->lpVtbl->GetIconLocation(p,a,b,c,d,e) -#define IExtractIconW_Extract(p,a,b,c,d,e) (p)->lpVtbl->Extract(p,a,b,c,d,e) - -#endif - -#define IExtractIconW_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IExtractIconW methods ***/ \ - STDMETHOD_(HRESULT,GetIconLocation)(THIS_ UINT uFlags, LPWSTR szIconFile, UINT cchMax, INT* piIndex, UINT* pwFlags) PURE; \ - STDMETHOD_(HRESULT,Extract)(THIS_ LPCWSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) PURE; - -HRESULT CALLBACK IExtractIconW_GetIconLocation_Proxy( - IExtractIconW* This, - UINT uFlags, - LPWSTR szIconFile, - UINT cchMax, - INT* piIndex, - UINT* pwFlags); -void __RPC_STUB IExtractIconW_GetIconLocation_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IExtractIconW_Extract_Proxy( - IExtractIconW* This, - LPCWSTR pszFile, - UINT nIconIndex, - HICON* phiconLarge, - HICON* phiconSmall, - UINT nIconSize); -void __RPC_STUB IExtractIconW_Extract_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IExtractIconW_INTERFACE_DEFINED__ */ - -#define LPEXTRACTICON WINELIB_NAME_AW(LPEXTRACTICON) -#define IExtractIcon WINELIB_NAME_AW(IExtractIcon) -#ifndef __ICommDlgBrowser_FWD_DEFINED__ -#define __ICommDlgBrowser_FWD_DEFINED__ -typedef struct ICommDlgBrowser ICommDlgBrowser; -#endif - -#define CDBOSC_SETFOCUS 0x00000000 -#define CDBOSC_KILLFOCUS 0x00000001 -#define CDBOSC_SELCHANGE 0x00000002 -#define CDBOSC_RENAME 0x00000003 -#define CDBOSC_STATECHANGE 0x00000004 -typedef ICommDlgBrowser *LPCOMMDLGBROWSER; - -/***************************************************************************** - * ICommDlgBrowser interface - */ -#ifndef __ICommDlgBrowser_INTERFACE_DEFINED__ -#define __ICommDlgBrowser_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_ICommDlgBrowser, 0x000214f1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct ICommDlgBrowser : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand( - IShellView* shv) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnStateChange( - IShellView* shv, - ULONG uChange) = 0; - - virtual HRESULT STDMETHODCALLTYPE IncludeObject( - IShellView* shv, - LPCITEMIDLIST pidl) = 0; - -}; -#else -typedef struct ICommDlgBrowserVtbl ICommDlgBrowserVtbl; -struct ICommDlgBrowser { - const ICommDlgBrowserVtbl* lpVtbl; -}; -struct ICommDlgBrowserVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - ICommDlgBrowser* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - ICommDlgBrowser* This); - - ULONG (STDMETHODCALLTYPE *Release)( - ICommDlgBrowser* This); - - /*** ICommDlgBrowser methods ***/ - HRESULT (STDMETHODCALLTYPE *OnDefaultCommand)( - ICommDlgBrowser* This, - IShellView* shv); - - HRESULT (STDMETHODCALLTYPE *OnStateChange)( - ICommDlgBrowser* This, - IShellView* shv, - ULONG uChange); - - HRESULT (STDMETHODCALLTYPE *IncludeObject)( - ICommDlgBrowser* This, - IShellView* shv, - LPCITEMIDLIST pidl); - -}; - -/*** IUnknown methods ***/ -#define ICommDlgBrowser_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define ICommDlgBrowser_AddRef(p) (p)->lpVtbl->AddRef(p) -#define ICommDlgBrowser_Release(p) (p)->lpVtbl->Release(p) -/*** ICommDlgBrowser methods ***/ -#define ICommDlgBrowser_OnDefaultCommand(p,a) (p)->lpVtbl->OnDefaultCommand(p,a) -#define ICommDlgBrowser_OnStateChange(p,a,b) (p)->lpVtbl->OnStateChange(p,a,b) -#define ICommDlgBrowser_IncludeObject(p,a,b) (p)->lpVtbl->IncludeObject(p,a,b) - -#endif - -#define ICommDlgBrowser_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** ICommDlgBrowser methods ***/ \ - STDMETHOD_(HRESULT,OnDefaultCommand)(THIS_ IShellView* shv) PURE; \ - STDMETHOD_(HRESULT,OnStateChange)(THIS_ IShellView* shv, ULONG uChange) PURE; \ - STDMETHOD_(HRESULT,IncludeObject)(THIS_ IShellView* shv, LPCITEMIDLIST pidl) PURE; - -HRESULT CALLBACK ICommDlgBrowser_OnDefaultCommand_Proxy( - ICommDlgBrowser* This, - IShellView* shv); -void __RPC_STUB ICommDlgBrowser_OnDefaultCommand_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK ICommDlgBrowser_OnStateChange_Proxy( - ICommDlgBrowser* This, - IShellView* shv, - ULONG uChange); -void __RPC_STUB ICommDlgBrowser_OnStateChange_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK ICommDlgBrowser_IncludeObject_Proxy( - ICommDlgBrowser* This, - IShellView* shv, - LPCITEMIDLIST pidl); -void __RPC_STUB ICommDlgBrowser_IncludeObject_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __ICommDlgBrowser_INTERFACE_DEFINED__ */ - -#ifndef __IDockingWindowFrame_FWD_DEFINED__ -#define __IDockingWindowFrame_FWD_DEFINED__ -typedef struct IDockingWindowFrame IDockingWindowFrame; -#endif - -#define DWFRF_NORMAL 0x0000 -#define DWFRF_DELETECONFIGDATA 0x0001 -#define DWFAF_HIDDEN 0x0001 -/***************************************************************************** - * IDockingWindowFrame interface - */ -#ifndef __IDockingWindowFrame_INTERFACE_DEFINED__ -#define __IDockingWindowFrame_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IDockingWindowFrame, 0x47d2657a, 0x7b27, 0x11d0, 0x8c,0xa9, 0x00,0xa0,0xc9,0x2d,0xbf,0xe8); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IDockingWindowFrame : public IOleWindow -{ - virtual HRESULT STDMETHODCALLTYPE AddToolbar( - IUnknown* punkSrc, - LPCWSTR pwszItem, - DWORD dwAddFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE RemoveToolbar( - IUnknown* punkSrc, - DWORD dwRemoveFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE FindToolbar( - LPCWSTR pwszItem, - REFIID riid, - LPVOID* ppvObj) = 0; - -}; -#else -typedef struct IDockingWindowFrameVtbl IDockingWindowFrameVtbl; -struct IDockingWindowFrame { - const IDockingWindowFrameVtbl* lpVtbl; -}; -struct IDockingWindowFrameVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IDockingWindowFrame* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IDockingWindowFrame* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IDockingWindowFrame* This); - - /*** IOleWindow methods ***/ - HRESULT (STDMETHODCALLTYPE *GetWindow)( - IDockingWindowFrame* This, - HWND* phwnd); - - HRESULT (STDMETHODCALLTYPE *ContextSensitiveHelp)( - IDockingWindowFrame* This, - BOOL fEnterMode); - - /*** IDockingWindowFrame methods ***/ - HRESULT (STDMETHODCALLTYPE *AddToolbar)( - IDockingWindowFrame* This, - IUnknown* punkSrc, - LPCWSTR pwszItem, - DWORD dwAddFlags); - - HRESULT (STDMETHODCALLTYPE *RemoveToolbar)( - IDockingWindowFrame* This, - IUnknown* punkSrc, - DWORD dwRemoveFlags); - - HRESULT (STDMETHODCALLTYPE *FindToolbar)( - IDockingWindowFrame* This, - LPCWSTR pwszItem, - REFIID riid, - LPVOID* ppvObj); - -}; - -/*** IUnknown methods ***/ -#define IDockingWindowFrame_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDockingWindowFrame_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDockingWindowFrame_Release(p) (p)->lpVtbl->Release(p) -/*** IOleWindow methods ***/ -#define IDockingWindowFrame_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a) -#define IDockingWindowFrame_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a) -/*** IDockingWindowFrame methods ***/ -#define IDockingWindowFrame_AddToolbar(p,a,b,c) (p)->lpVtbl->AddToolbar(p,a,b,c) -#define IDockingWindowFrame_RemoveToolbar(p,a,b) (p)->lpVtbl->RemoveToolbar(p,a,b) -#define IDockingWindowFrame_FindToolbar(p,a,b,c) (p)->lpVtbl->FindToolbar(p,a,b,c) - -#endif - -#define IDockingWindowFrame_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IOleWindow methods ***/ \ - STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND* phwnd) PURE; \ - STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; \ - /*** IDockingWindowFrame methods ***/ \ - STDMETHOD_(HRESULT,AddToolbar)(THIS_ IUnknown* punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags) PURE; \ - STDMETHOD_(HRESULT,RemoveToolbar)(THIS_ IUnknown* punkSrc, DWORD dwRemoveFlags) PURE; \ - STDMETHOD_(HRESULT,FindToolbar)(THIS_ LPCWSTR pwszItem, REFIID riid, LPVOID* ppvObj) PURE; - -HRESULT CALLBACK IDockingWindowFrame_AddToolbar_Proxy( - IDockingWindowFrame* This, - IUnknown* punkSrc, - LPCWSTR pwszItem, - DWORD dwAddFlags); -void __RPC_STUB IDockingWindowFrame_AddToolbar_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDockingWindowFrame_RemoveToolbar_Proxy( - IDockingWindowFrame* This, - IUnknown* punkSrc, - DWORD dwRemoveFlags); -void __RPC_STUB IDockingWindowFrame_RemoveToolbar_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDockingWindowFrame_FindToolbar_Proxy( - IDockingWindowFrame* This, - LPCWSTR pwszItem, - REFIID riid, - LPVOID* ppvObj); -void __RPC_STUB IDockingWindowFrame_FindToolbar_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IDockingWindowFrame_INTERFACE_DEFINED__ */ - -#ifndef __IDragSourceHelper_FWD_DEFINED__ -#define __IDragSourceHelper_FWD_DEFINED__ -typedef struct IDragSourceHelper IDragSourceHelper; -#endif - -typedef struct { - SIZE sizeDragImage; - POINT ptOffset; - HBITMAP hbmpDragImage; - COLORREF crColorKey; -} SHDRAGIMAGE, *LPSHDRAGIMAGE; - -/***************************************************************************** - * IDragSourceHelper interface - */ -#ifndef __IDragSourceHelper_INTERFACE_DEFINED__ -#define __IDragSourceHelper_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IDragSourceHelper, 0xde5bf786, 0x477a, 0x11d2, 0x83,0x9d, 0x00,0xc0,0x4f,0xd9,0x18,0xd0); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IDragSourceHelper : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE InitializeFromBitmap( - LPSHDRAGIMAGE pshdi, - IDataObject* pDataObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE InitializeFromWindow( - HWND hwnd, - POINT* ppt, - IDataObject* pDataObject) = 0; - -}; -#else -typedef struct IDragSourceHelperVtbl IDragSourceHelperVtbl; -struct IDragSourceHelper { - const IDragSourceHelperVtbl* lpVtbl; -}; -struct IDragSourceHelperVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IDragSourceHelper* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IDragSourceHelper* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IDragSourceHelper* This); - - /*** IDragSourceHelper methods ***/ - HRESULT (STDMETHODCALLTYPE *InitializeFromBitmap)( - IDragSourceHelper* This, - LPSHDRAGIMAGE pshdi, - IDataObject* pDataObject); - - HRESULT (STDMETHODCALLTYPE *InitializeFromWindow)( - IDragSourceHelper* This, - HWND hwnd, - POINT* ppt, - IDataObject* pDataObject); - -}; - -/*** IUnknown methods ***/ -#define IDragSourceHelper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDragSourceHelper_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDragSourceHelper_Release(p) (p)->lpVtbl->Release(p) -/*** IDragSourceHelper methods ***/ -#define IDragSourceHelper_InitializeFromBitmap(p,a,b) (p)->lpVtbl->InitializeFromBitmap(p,a,b) -#define IDragSourceHelper_InitializeFromWindow(p,a,b,c) (p)->lpVtbl->InitializeFromWindow(p,a,b,c) - -#endif - -#define IDragSourceHelper_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IDragSourceHelper methods ***/ \ - STDMETHOD_(HRESULT,InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject* pDataObject) PURE; \ - STDMETHOD_(HRESULT,InitializeFromWindow)(THIS_ HWND hwnd, POINT* ppt, IDataObject* pDataObject) PURE; - -HRESULT CALLBACK IDragSourceHelper_InitializeFromBitmap_Proxy( - IDragSourceHelper* This, - LPSHDRAGIMAGE pshdi, - IDataObject* pDataObject); -void __RPC_STUB IDragSourceHelper_InitializeFromBitmap_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDragSourceHelper_InitializeFromWindow_Proxy( - IDragSourceHelper* This, - HWND hwnd, - POINT* ppt, - IDataObject* pDataObject); -void __RPC_STUB IDragSourceHelper_InitializeFromWindow_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IDragSourceHelper_INTERFACE_DEFINED__ */ - -#ifndef __IDropTargetHelper_FWD_DEFINED__ -#define __IDropTargetHelper_FWD_DEFINED__ -typedef struct IDropTargetHelper IDropTargetHelper; -#endif +#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK /***************************************************************************** * IDropTargetHelper interface */ -#ifndef __IDropTargetHelper_INTERFACE_DEFINED__ -#define __IDropTargetHelper_INTERFACE_DEFINED__ - DEFINE_GUID(IID_IDropTargetHelper, 0x4657278b, 0x411b, 0x11d2, 0x83,0x9a, 0x00,0xc0,0x4f,0xd9,0x18,0xd0); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IDropTargetHelper : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE DragEnter( - HWND hwndTarget, - IDataObject* pDataObject, - POINT* ppt, - DWORD dwEffect) = 0; - - virtual HRESULT STDMETHODCALLTYPE DragLeave( - ) = 0; - - virtual HRESULT STDMETHODCALLTYPE DragOver( - POINT* ppt, - DWORD dwEffect) = 0; - - virtual HRESULT STDMETHODCALLTYPE Drop( - IDataObject* pDataObject, - POINT* ppt, - DWORD dwEffect) = 0; - - virtual HRESULT STDMETHODCALLTYPE Show( - BOOL fShow) = 0; - -}; -#else -typedef struct IDropTargetHelperVtbl IDropTargetHelperVtbl; -struct IDropTargetHelper { - const IDropTargetHelperVtbl* lpVtbl; -}; -struct IDropTargetHelperVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IDropTargetHelper* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IDropTargetHelper* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IDropTargetHelper* This); - - /*** IDropTargetHelper methods ***/ - HRESULT (STDMETHODCALLTYPE *DragEnter)( - IDropTargetHelper* This, - HWND hwndTarget, - IDataObject* pDataObject, - POINT* ppt, - DWORD dwEffect); - - HRESULT (STDMETHODCALLTYPE *DragLeave)( - IDropTargetHelper* This); - - HRESULT (STDMETHODCALLTYPE *DragOver)( - IDropTargetHelper* This, - POINT* ppt, - DWORD dwEffect); - - HRESULT (STDMETHODCALLTYPE *Drop)( - IDropTargetHelper* This, - IDataObject* pDataObject, - POINT* ppt, - DWORD dwEffect); - - HRESULT (STDMETHODCALLTYPE *Show)( - IDropTargetHelper* This, - BOOL fShow); - -}; - -/*** IUnknown methods ***/ -#define IDropTargetHelper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDropTargetHelper_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDropTargetHelper_Release(p) (p)->lpVtbl->Release(p) -/*** IDropTargetHelper methods ***/ -#define IDropTargetHelper_DragEnter(p,a,b,c,d) (p)->lpVtbl->DragEnter(p,a,b,c,d) -#define IDropTargetHelper_DragLeave(p) (p)->lpVtbl->DragLeave(p) -#define IDropTargetHelper_DragOver(p,a,b) (p)->lpVtbl->DragOver(p,a,b) -#define IDropTargetHelper_Drop(p,a,b,c) (p)->lpVtbl->Drop(p,a,b,c) -#define IDropTargetHelper_Show(p,a) (p)->lpVtbl->Show(p,a) - -#endif - -#define IDropTargetHelper_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IDropTargetHelper methods ***/ \ - STDMETHOD_(HRESULT,DragEnter)(THIS_ HWND hwndTarget, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; \ - STDMETHOD_(HRESULT,DragLeave)(THIS) PURE; \ - STDMETHOD_(HRESULT,DragOver)(THIS_ POINT* ppt, DWORD dwEffect) PURE; \ - STDMETHOD_(HRESULT,Drop)(THIS_ IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) PURE; \ - STDMETHOD_(HRESULT,Show)(THIS_ BOOL fShow) PURE; - -HRESULT CALLBACK IDropTargetHelper_DragEnter_Proxy( - IDropTargetHelper* This, - HWND hwndTarget, - IDataObject* pDataObject, - POINT* ppt, - DWORD dwEffect); -void __RPC_STUB IDropTargetHelper_DragEnter_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDropTargetHelper_DragLeave_Proxy( - IDropTargetHelper* This); -void __RPC_STUB IDropTargetHelper_DragLeave_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDropTargetHelper_DragOver_Proxy( - IDropTargetHelper* This, - POINT* ppt, - DWORD dwEffect); -void __RPC_STUB IDropTargetHelper_DragOver_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDropTargetHelper_Drop_Proxy( - IDropTargetHelper* This, - IDataObject* pDataObject, - POINT* ppt, - DWORD dwEffect); -void __RPC_STUB IDropTargetHelper_Drop_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IDropTargetHelper_Show_Proxy( - IDropTargetHelper* This, - BOOL fShow); -void __RPC_STUB IDropTargetHelper_Show_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IDropTargetHelper_INTERFACE_DEFINED__ */ - -#ifndef __IContextMenu_FWD_DEFINED__ -#define __IContextMenu_FWD_DEFINED__ -typedef struct IContextMenu IContextMenu; -#endif - -#define CMF_NORMAL 0x00000000 -#define CMF_DEFAULTONLY 0x00000001 -#define CMF_VERBSONLY 0x00000002 -#define CMF_EXPLORE 0x00000004 -#define CMF_NOVERBS 0x00000008 -#define CMF_CANRENAME 0x00000010 -#define CMF_NODEFAULT 0x00000020 -#define CMF_INCLUDESTATIC 0x00000040 -#define CMF_EXTENDEDVERBS 0x00000100 -#define CMF_RESERVED 0xffff0000 -#define GCS_VERBA 0x00000000 -#define GCS_HELPTEXTA 0x00000001 -#define GCS_VALIDATEA 0x00000002 -#define GCS_VERBW 0x00000004 -#define GCS_HELPTEXTW 0x00000005 -#define GCS_VALIDATEW 0x00000006 -#define GCS_UNICODE 0x00000004 -#define GCS_VERB WINELIB_NAME_AW(GCS_VERB) -#define GCS_HELPTEXT WINELIB_NAME_AW(GCS_HELPTEXT) -#define GCS_VALIDATE WINELIB_NAME_AW(GCS_VALIDATE) -#define CMDSTR_NEWFOLDERA "NewFolder" -#define CMDSTR_VIEWLISTA "ViewList" -#define CMDSTR_VIEWDETAILSA "ViewDetails" -#if defined(__GNUC__) -# define CMDSTR_NEWFOLDERW (const WCHAR []){ 'N','e','w','F','o','l','d','e','r',0 } -# define CMDSTR_VIEWLISTW (const WCHAR []){ 'V','i','e','w','L','i','s','t',0 } -# define CMDSTR_VIEWDETAILSW (const WCHAR []){ 'V','i','e','w','D','e','t','a','i','l','s',0 } -#elif defined(_MSC_VER) -# define CMDSTR_NEWFOLDERW L"NewFolder" -# define CMDSTR_VIEWLISTW L"ViewList" -# define CMDSTR_VIEWDETAILSW L"ViewDetails" -#else -static const WCHAR CMDSTR_NEWFOLDERW[] = {'N','e','w','F','o','l','d','e','r',0}; -static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0}; -static const WCHAR CMDSTR_VIEWDETAILSW[] = {'V','i','e','w','D','e','t','a','i','l','s',0}; -#endif -#define CMDSTR_NEWFOLDER WINELIB_NAME_AW(CMDSTR_NEWFOLDER) -#define CMDSTR_VIEWLIST WINELIB_NAME_AW(CMDSTR_VIEWLIST) -#define CMDSTR_VIEWDETAILS WINELIB_NAME_AW(CMDSTR_VIEWDETAILS) -#define CMIC_MASK_HOTKEY SEE_MASK_HOTKEY -#define CMIC_MASK_ICON SEE_MASK_ICON -#define CMIC_MASK_FLAG_NO_UI SEE_MASK_FLAG_NO_UI -#define CMIC_MASK_UNICODE SEE_MASK_UNICODE -#define CMIC_MASK_NO_CONSOLE SEE_MASK_NO_CONSOLE -#define CMIC_MASK_HASLINKNAME SEE_MASK_HASLINKNAME -#define CMIC_MASK_FLAG_SEP_VDM SEE_MASK_FLAG_SEPVDM -#define CMIC_MASK_HASTITLE SEE_MASK_HASTITLE -#define CMIC_MASK_ASYNCOK SEE_MASK_ASYNCOK -#define CMIC_MASK_SHIFT_DOWN 0x10000000 -#define CMIC_MASK_PTINVOKE 0x20000000 -#define CMIC_MASK_CONTROL_DOWN 0x40000000 -#define CMIC_MASK_FLAG_LOG_USAGE SEE_MASK_FLAG_LOG_USAGE -#define CMIC_MASK_NOZONECHECKS SEE_MASK_NOZONECHECKS -typedef IContextMenu *LPCONTEXTMENU; - -typedef struct tagCMINVOKECOMMANDINFO { - DWORD cbSize; - DWORD fMask; - HWND hwnd; - LPCSTR lpVerb; - LPCSTR lpParameters; - LPCSTR lpDirectory; - INT nShow; - DWORD dwHotKey; - HANDLE hIcon; -} CMINVOKECOMMANDINFO, *LPCMINVOKECOMMANDINFO; - -typedef struct tagCMInvokeCommandInfoEx { - DWORD cbSize; - DWORD fMask; - HWND hwnd; - LPCSTR lpVerb; - LPCSTR lpParameters; - LPCSTR lpDirectory; - INT nShow; - DWORD dwHotKey; - HANDLE hIcon; - LPCSTR lpTitle; - LPCWSTR lpVerbW; - LPCWSTR lpParametersW; - LPCWSTR lpDirectoryW; - LPCWSTR lpTitleW; - POINT ptInvoke; -} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX; /***************************************************************************** - * IContextMenu interface + * IPersistFolder2 interface */ -#ifndef __IContextMenu_INTERFACE_DEFINED__ -#define __IContextMenu_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IContextMenu, 0x000214e4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IContextMenu : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE QueryContextMenu( - HMENU hmenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE InvokeCommand( - LPCMINVOKECOMMANDINFO lpici) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCommandString( - UINT idCmd, - UINT uType, - UINT* pwReserved, - LPSTR pszName, - UINT cchMax) = 0; - -}; -#else -typedef struct IContextMenuVtbl IContextMenuVtbl; -struct IContextMenu { - const IContextMenuVtbl* lpVtbl; -}; -struct IContextMenuVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IContextMenu* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IContextMenu* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IContextMenu* This); - - /*** IContextMenu methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryContextMenu)( - IContextMenu* This, - HMENU hmenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags); - - HRESULT (STDMETHODCALLTYPE *InvokeCommand)( - IContextMenu* This, - LPCMINVOKECOMMANDINFO lpici); - - HRESULT (STDMETHODCALLTYPE *GetCommandString)( - IContextMenu* This, - UINT idCmd, - UINT uType, - UINT* pwReserved, - LPSTR pszName, - UINT cchMax); - -}; - -/*** IUnknown methods ***/ -#define IContextMenu_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IContextMenu_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IContextMenu_Release(p) (p)->lpVtbl->Release(p) -/*** IContextMenu methods ***/ -#define IContextMenu_QueryContextMenu(p,a,b,c,d,e) (p)->lpVtbl->QueryContextMenu(p,a,b,c,d,e) -#define IContextMenu_InvokeCommand(p,a) (p)->lpVtbl->InvokeCommand(p,a) -#define IContextMenu_GetCommandString(p,a,b,c,d,e) (p)->lpVtbl->GetCommandString(p,a,b,c,d,e) - -#endif - -#define IContextMenu_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IContextMenu methods ***/ \ - STDMETHOD_(HRESULT,QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; \ - STDMETHOD_(HRESULT,InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; \ - STDMETHOD_(HRESULT,GetCommandString)(THIS_ UINT idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) PURE; - -HRESULT CALLBACK IContextMenu_QueryContextMenu_Proxy( - IContextMenu* This, - HMENU hmenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags); -void __RPC_STUB IContextMenu_QueryContextMenu_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IContextMenu_InvokeCommand_Proxy( - IContextMenu* This, - LPCMINVOKECOMMANDINFO lpici); -void __RPC_STUB IContextMenu_InvokeCommand_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT CALLBACK IContextMenu_GetCommandString_Proxy( - IContextMenu* This, - UINT idCmd, - UINT uType, - UINT* pwReserved, - LPSTR pszName, - UINT cchMax); -void __RPC_STUB IContextMenu_GetCommandString_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IContextMenu_INTERFACE_DEFINED__ */ - -#ifndef __IContextMenu2_FWD_DEFINED__ -#define __IContextMenu2_FWD_DEFINED__ -typedef struct IContextMenu2 IContextMenu2; -#endif - -typedef IContextMenu2 *LPCONTEXTMENU2; +DEFINE_GUID(IID_IPersistFolder2, 0x1ac3d9f0, 0x175c, 0x11d1, 0x95,0xbe, 0x00,0x60,0x97,0x97,0xea,0x4f); /***************************************************************************** - * IContextMenu2 interface + * IShellFolder2 interface */ -#ifndef __IContextMenu2_INTERFACE_DEFINED__ -#define __IContextMenu2_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IContextMenu2, 0x000214f4, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IContextMenu2 : public IContextMenu -{ - virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg( - UINT uMsg, - WPARAM wParam, - LPARAM lParam) = 0; - -}; -#else -typedef struct IContextMenu2Vtbl IContextMenu2Vtbl; -struct IContextMenu2 { - const IContextMenu2Vtbl* lpVtbl; -}; -struct IContextMenu2Vtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IContextMenu2* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IContextMenu2* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IContextMenu2* This); - - /*** IContextMenu methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryContextMenu)( - IContextMenu2* This, - HMENU hmenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags); - - HRESULT (STDMETHODCALLTYPE *InvokeCommand)( - IContextMenu2* This, - LPCMINVOKECOMMANDINFO lpici); - - HRESULT (STDMETHODCALLTYPE *GetCommandString)( - IContextMenu2* This, - UINT idCmd, - UINT uType, - UINT* pwReserved, - LPSTR pszName, - UINT cchMax); - - /*** IContextMenu2 methods ***/ - HRESULT (STDMETHODCALLTYPE *HandleMenuMsg)( - IContextMenu2* This, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -}; - -/*** IUnknown methods ***/ -#define IContextMenu2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IContextMenu2_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IContextMenu2_Release(p) (p)->lpVtbl->Release(p) -/*** IContextMenu methods ***/ -#define IContextMenu2_QueryContextMenu(p,a,b,c,d,e) (p)->lpVtbl->QueryContextMenu(p,a,b,c,d,e) -#define IContextMenu2_InvokeCommand(p,a) (p)->lpVtbl->InvokeCommand(p,a) -#define IContextMenu2_GetCommandString(p,a,b,c,d,e) (p)->lpVtbl->GetCommandString(p,a,b,c,d,e) -/*** IContextMenu2 methods ***/ -#define IContextMenu2_HandleMenuMsg(p,a,b,c) (p)->lpVtbl->HandleMenuMsg(p,a,b,c) - -#endif - -#define IContextMenu2_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IContextMenu methods ***/ \ - STDMETHOD_(HRESULT,QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; \ - STDMETHOD_(HRESULT,InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; \ - STDMETHOD_(HRESULT,GetCommandString)(THIS_ UINT idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) PURE; \ - /*** IContextMenu2 methods ***/ \ - STDMETHOD_(HRESULT,HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; - -HRESULT CALLBACK IContextMenu2_HandleMenuMsg_Proxy( - IContextMenu2* This, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); -void __RPC_STUB IContextMenu2_HandleMenuMsg_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IContextMenu2_INTERFACE_DEFINED__ */ - -#ifndef __IContextMenu3_FWD_DEFINED__ -#define __IContextMenu3_FWD_DEFINED__ -typedef struct IContextMenu3 IContextMenu3; -#endif - -typedef IContextMenu3 *LPCONTEXTMENU3; +DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3,0x0e, 0x00,0xc0,0x4f,0x79,0xab,0xd1); /***************************************************************************** - * IContextMenu3 interface + * IPersistFolder3 interface */ -#ifndef __IContextMenu3_INTERFACE_DEFINED__ -#define __IContextMenu3_INTERFACE_DEFINED__ -DEFINE_GUID(IID_IContextMenu3, 0xbcfce0a0, 0xec17, 0x11d0, 0x8d,0x10, 0x00,0xa0,0xc9,0x0f,0x27,0x19); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IContextMenu3 : public IContextMenu2 -{ - virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg2( - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT* plResult) = 0; - -}; -#else -typedef struct IContextMenu3Vtbl IContextMenu3Vtbl; -struct IContextMenu3 { - const IContextMenu3Vtbl* lpVtbl; -}; -struct IContextMenu3Vtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IContextMenu3* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IContextMenu3* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IContextMenu3* This); - - /*** IContextMenu methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryContextMenu)( - IContextMenu3* This, - HMENU hmenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags); - - HRESULT (STDMETHODCALLTYPE *InvokeCommand)( - IContextMenu3* This, - LPCMINVOKECOMMANDINFO lpici); - - HRESULT (STDMETHODCALLTYPE *GetCommandString)( - IContextMenu3* This, - UINT idCmd, - UINT uType, - UINT* pwReserved, - LPSTR pszName, - UINT cchMax); - - /*** IContextMenu2 methods ***/ - HRESULT (STDMETHODCALLTYPE *HandleMenuMsg)( - IContextMenu3* This, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - - /*** IContextMenu3 methods ***/ - HRESULT (STDMETHODCALLTYPE *HandleMenuMsg2)( - IContextMenu3* This, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT* plResult); - -}; - -/*** IUnknown methods ***/ -#define IContextMenu3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IContextMenu3_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IContextMenu3_Release(p) (p)->lpVtbl->Release(p) -/*** IContextMenu methods ***/ -#define IContextMenu3_QueryContextMenu(p,a,b,c,d,e) (p)->lpVtbl->QueryContextMenu(p,a,b,c,d,e) -#define IContextMenu3_InvokeCommand(p,a) (p)->lpVtbl->InvokeCommand(p,a) -#define IContextMenu3_GetCommandString(p,a,b,c,d,e) (p)->lpVtbl->GetCommandString(p,a,b,c,d,e) -/*** IContextMenu2 methods ***/ -#define IContextMenu3_HandleMenuMsg(p,a,b,c) (p)->lpVtbl->HandleMenuMsg(p,a,b,c) -/*** IContextMenu3 methods ***/ -#define IContextMenu3_HandleMenuMsg2(p,a,b,c,d) (p)->lpVtbl->HandleMenuMsg2(p,a,b,c,d) - -#endif - -#define IContextMenu3_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IContextMenu methods ***/ \ - STDMETHOD_(HRESULT,QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE; \ - STDMETHOD_(HRESULT,InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE; \ - STDMETHOD_(HRESULT,GetCommandString)(THIS_ UINT idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) PURE; \ - /*** IContextMenu2 methods ***/ \ - STDMETHOD_(HRESULT,HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; \ - /*** IContextMenu3 methods ***/ \ - STDMETHOD_(HRESULT,HandleMenuMsg2)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plResult) PURE; - -HRESULT CALLBACK IContextMenu3_HandleMenuMsg2_Proxy( - IContextMenu3* This, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT* plResult); -void __RPC_STUB IContextMenu3_HandleMenuMsg2_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IContextMenu3_INTERFACE_DEFINED__ */ - -#ifndef __IShellExecuteHookA_FWD_DEFINED__ -#define __IShellExecuteHookA_FWD_DEFINED__ -typedef struct IShellExecuteHookA IShellExecuteHookA; -#endif - -struct _SHELLEXECUTEINFOA; -/***************************************************************************** - * IShellExecuteHookA interface - */ -#ifndef __IShellExecuteHookA_INTERFACE_DEFINED__ -#define __IShellExecuteHookA_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellExecuteHookA, 0x000214f5, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellExecuteHookA : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE Execute( - struct _SHELLEXECUTEINFOA* pei) = 0; - -}; -#else -typedef struct IShellExecuteHookAVtbl IShellExecuteHookAVtbl; -struct IShellExecuteHookA { - const IShellExecuteHookAVtbl* lpVtbl; -}; -struct IShellExecuteHookAVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellExecuteHookA* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellExecuteHookA* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellExecuteHookA* This); - - /*** IShellExecuteHookA methods ***/ - HRESULT (STDMETHODCALLTYPE *Execute)( - IShellExecuteHookA* This, - struct _SHELLEXECUTEINFOA* pei); - -}; - -/*** IUnknown methods ***/ -#define IShellExecuteHookA_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IShellExecuteHookA_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IShellExecuteHookA_Release(p) (p)->lpVtbl->Release(p) -/*** IShellExecuteHookA methods ***/ -#define IShellExecuteHookA_Execute(p,a) (p)->lpVtbl->Execute(p,a) - -#endif - -#define IShellExecuteHookA_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellExecuteHookA methods ***/ \ - STDMETHOD_(HRESULT,Execute)(THIS_ struct _SHELLEXECUTEINFOA* pei) PURE; - -HRESULT CALLBACK IShellExecuteHookA_Execute_Proxy( - IShellExecuteHookA* This, - struct _SHELLEXECUTEINFOA* pei); -void __RPC_STUB IShellExecuteHookA_Execute_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellExecuteHookA_INTERFACE_DEFINED__ */ - -#ifndef __IShellExecuteHookW_FWD_DEFINED__ -#define __IShellExecuteHookW_FWD_DEFINED__ -typedef struct IShellExecuteHookW IShellExecuteHookW; -#endif - -struct _SHELLEXECUTEINFOW; /***************************************************************************** * IShellExecuteHookW interface */ -#ifndef __IShellExecuteHookW_INTERFACE_DEFINED__ -#define __IShellExecuteHookW_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IShellExecuteHookW, 0x000214fb, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IShellExecuteHookW : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE Execute( - struct _SHELLEXECUTEINFOW* pei) = 0; - -}; -#else -typedef struct IShellExecuteHookWVtbl IShellExecuteHookWVtbl; -struct IShellExecuteHookW { - const IShellExecuteHookWVtbl* lpVtbl; -}; -struct IShellExecuteHookWVtbl { - ICOM_MSVTABLE_COMPAT_FIELDS - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IShellExecuteHookW* This, - REFIID riid, - void** ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IShellExecuteHookW* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IShellExecuteHookW* This); - - /*** IShellExecuteHookW methods ***/ - HRESULT (STDMETHODCALLTYPE *Execute)( - IShellExecuteHookW* This, - struct _SHELLEXECUTEINFOW* pei); - -}; - +DEFINE_GUID(IID_IPersistFolder3, 0xcef04fdf, 0xfe72, 0x11d2, 0x87,0xa5, 0x00,0xc0,0x4f,0x68,0x37,0xcf); /*** IUnknown methods ***/ #define IShellExecuteHookW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IShellExecuteHookW_AddRef(p) (p)->lpVtbl->AddRef(p) @@ -4242,29 +43,4 @@ struct IShellExecuteHookWVtbl { /*** IShellExecuteHookW methods ***/ #define IShellExecuteHookW_Execute(p,a) (p)->lpVtbl->Execute(p,a) -#endif - -#define IShellExecuteHookW_METHODS \ - ICOM_MSVTABLE_COMPAT_FIELDS \ - /*** IUnknown methods ***/ \ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ - STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ - STDMETHOD_(ULONG,Release)(THIS) PURE; \ - /*** IShellExecuteHookW methods ***/ \ - STDMETHOD_(HRESULT,Execute)(THIS_ struct _SHELLEXECUTEINFOW* pei) PURE; - -HRESULT CALLBACK IShellExecuteHookW_Execute_Proxy( - IShellExecuteHookW* This, - struct _SHELLEXECUTEINFOW* pei); -void __RPC_STUB IShellExecuteHookW_Execute_Stub( - struct IRpcStubBuffer* This, - struct IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IShellExecuteHookW_INTERFACE_DEFINED__ */ - -#ifdef __cplusplus -} -#endif -#endif /* __WIDL_SHOBJIDL_H */ +#endif /* __WINE_SHOBJIDL_H */ diff --git a/reactos/include/wine/winnetwk.h b/reactos/include/wine/winnetwk.h index f5149bdb9e6..d84bc41ab8b 100644 --- a/reactos/include/wine/winnetwk.h +++ b/reactos/include/wine/winnetwk.h @@ -1,383 +1,16 @@ -/* - * Copyright (C) the Wine project +/* $Id: winnetwk.h,v 1.2 2004/06/29 13:40:40 gvg Exp $ * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * Compatibility header * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This header is wrapper to allow compilation of Wine DLLs under ReactOS + * build system. It contains definitions commonly refered to as Wineisms + * and definitions that are missing in w32api. */ +#include_next -#ifndef _WINNETWK_H_ -#define _WINNETWK_H_ - -/* - * Network types - */ - -#define WNNC_NET_MSNET 0x00010000 -#define WNNC_NET_LANMAN 0x00020000 -#define WNNC_NET_NETWARE 0x00030000 -#define WNNC_NET_VINES 0x00040000 -#define WNNC_NET_10NET 0x00050000 -#define WNNC_NET_LOCUS 0x00060000 -#define WNNC_NET_SUN_PC_NFS 0x00070000 -#define WNNC_NET_LANSTEP 0x00080000 -#define WNNC_NET_9TILES 0x00090000 -#define WNNC_NET_LANTASTIC 0x000A0000 -#define WNNC_NET_AS400 0x000B0000 -#define WNNC_NET_FTP_NFS 0x000C0000 -#define WNNC_NET_PATHWORKS 0x000D0000 -#define WNNC_NET_LIFENET 0x000E0000 -#define WNNC_NET_POWERLAN 0x000F0000 -#define WNNC_NET_BWNFS 0x00100000 -#define WNNC_NET_COGENT 0x00110000 -#define WNNC_NET_FARALLON 0x00120000 -#define WNNC_NET_APPLETALK 0x00130000 -#define WNNC_NET_INTERGRAPH 0x00140000 - -/* - * Network resources - */ - -#define RESOURCE_CONNECTED 0x00000001 -#define RESOURCE_GLOBALNET 0x00000002 -#define RESOURCE_REMEMBERED 0x00000003 -#define RESOURCE_RECENT 0x00000004 -#define RESOURCE_CONTEXT 0x00000005 - -#define RESOURCETYPE_ANY 0x00000000 -#define RESOURCETYPE_DISK 0x00000001 -#define RESOURCETYPE_PRINT 0x00000002 -#define RESOURCETYPE_RESERVED 0x00000008 -#define RESOURCETYPE_UNKNOWN 0xFFFFFFFF - -#define RESOURCEUSAGE_CONNECTABLE 0x00000001 -#define RESOURCEUSAGE_CONTAINER 0x00000002 -#define RESOURCEUSAGE_NOLOCALDEVICE 0x00000004 -#define RESOURCEUSAGE_SIBLING 0x00000008 -#define RESOURCEUSAGE_ATTACHED 0x00000010 -#define RESOURCEUSAGE_ALL (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED) -#define RESOURCEUSAGE_RESERVED 0x80000000 - -#define RESOURCEDISPLAYTYPE_GENERIC 0x00000000 -#define RESOURCEDISPLAYTYPE_DOMAIN 0x00000001 -#define RESOURCEDISPLAYTYPE_SERVER 0x00000002 -#define RESOURCEDISPLAYTYPE_SHARE 0x00000003 -#define RESOURCEDISPLAYTYPE_FILE 0x00000004 -#define RESOURCEDISPLAYTYPE_GROUP 0x00000005 -#define RESOURCEDISPLAYTYPE_NETWORK 0x00000006 -#define RESOURCEDISPLAYTYPE_ROOT 0x00000007 -#define RESOURCEDISPLAYTYPE_SHAREADMIN 0x00000008 -#define RESOURCEDISPLAYTYPE_DIRECTORY 0x00000009 -#define RESOURCEDISPLAYTYPE_TREE 0x0000000A - -typedef struct { - DWORD dwScope; - DWORD dwType; - DWORD dwDisplayType; - DWORD dwUsage; - LPSTR lpLocalName; - LPSTR lpRemoteName; - LPSTR lpComment ; - LPSTR lpProvider; -} NETRESOURCEA,*LPNETRESOURCEA; - -typedef struct { - DWORD dwScope; - DWORD dwType; - DWORD dwDisplayType; - DWORD dwUsage; - LPWSTR lpLocalName; - LPWSTR lpRemoteName; - LPWSTR lpComment ; - LPWSTR lpProvider; -} NETRESOURCEW,*LPNETRESOURCEW; - -DECL_WINELIB_TYPE_AW(NETRESOURCE) -DECL_WINELIB_TYPE_AW(LPNETRESOURCE) - - -/* - * Network connections - */ - -#define NETPROPERTY_PERSISTENT 1 - -#define CONNECT_UPDATE_PROFILE 0x00000001 -#define CONNECT_UPDATE_RECENT 0x00000002 -#define CONNECT_TEMPORARY 0x00000004 -#define CONNECT_INTERACTIVE 0x00000008 -#define CONNECT_PROMPT 0x00000010 -#define CONNECT_NEED_DRIVE 0x00000020 -#define CONNECT_REFCOUNT 0x00000040 -#define CONNECT_REDIRECT 0x00000080 -#define CONNECT_LOCALDRIVE 0x00000100 -#define CONNECT_CURRENT_MEDIA 0x00000200 - -DWORD WINAPI WNetAddConnectionA(LPCSTR,LPCSTR,LPCSTR); -DWORD WINAPI WNetAddConnectionW(LPCWSTR,LPCWSTR,LPCWSTR); -#define WNetAddConnection WINELIB_NAME_AW(WNetAddConnection) -DWORD WINAPI WNetAddConnection2A(LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD); -DWORD WINAPI WNetAddConnection2W(LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD); -#define WNetAddConnection2 WINELIB_NAME_AW(WNetAddConnection2) -DWORD WINAPI WNetAddConnection3A(HWND,LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD); -DWORD WINAPI WNetAddConnection3W(HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD); -#define WNetAddConnection3 WINELIB_NAME_AW(WNetAddConnection3) -DWORD WINAPI WNetCancelConnectionA(LPCSTR,BOOL); -DWORD WINAPI WNetCancelConnectionW(LPCWSTR,BOOL); -#define WNetCancelConnection WINELIB_NAME_AW(WNetCancelConnection) -DWORD WINAPI WNetCancelConnection2A(LPCSTR,DWORD,BOOL); -DWORD WINAPI WNetCancelConnection2W(LPCWSTR,DWORD,BOOL); -#define WNetCancelConnection2 WINELIB_NAME_AW(WNetCancelConnection2) -DWORD WINAPI WNetGetConnectionA(LPCSTR,LPSTR,LPDWORD); -DWORD WINAPI WNetGetConnectionW(LPCWSTR,LPWSTR,LPDWORD); -#define WNetGetConnection WINELIB_NAME_AW(WNetGetConnection) -DWORD WINAPI WNetUseConnectionA(HWND,LPNETRESOURCEA,LPCSTR,LPCSTR,DWORD,LPSTR,LPDWORD,LPDWORD); -DWORD WINAPI WNetUseConnectionW(HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPDWORD,LPDWORD); -#define WNetUseConnection WINELIB_NAME_AW(WNetUseConnection) -DWORD WINAPI WNetSetConnectionA(LPCSTR,DWORD,LPVOID); -DWORD WINAPI WNetSetConnectionW(LPCWSTR,DWORD,LPVOID); -#define WNetSetConnection WINELIB_NAME_AW(WNetSetConnection) - -/* - * Network connection dialogs - */ - -typedef struct { - DWORD cbStructure; /* size of this structure in bytes */ - HWND hwndOwner; /* owner window for the dialog */ - LPNETRESOURCEA lpConnRes;/* Requested Resource info */ - DWORD dwFlags; /* flags (see below) */ - DWORD dwDevNum; /* number of devices connected to */ -} CONNECTDLGSTRUCTA, *LPCONNECTDLGSTRUCTA; -typedef struct { - DWORD cbStructure; /* size of this structure in bytes */ - HWND hwndOwner; /* owner window for the dialog */ - LPNETRESOURCEW lpConnRes;/* Requested Resource info */ - DWORD dwFlags; /* flags (see below) */ - DWORD dwDevNum; /* number of devices connected to */ -} CONNECTDLGSTRUCTW, *LPCONNECTDLGSTRUCTW; - -DECL_WINELIB_TYPE_AW(CONNECTDLGSTRUCT) -DECL_WINELIB_TYPE_AW(LPCONNECTDLGSTRUCT) - -#define CONNDLG_RO_PATH 0x00000001 /* Resource path should be read-only */ -#define CONNDLG_CONN_POINT 0x00000002 /* Netware -style movable connection point enabled */ -#define CONNDLG_USE_MRU 0x00000004 /* Use MRU combobox */ -#define CONNDLG_HIDE_BOX 0x00000008 /* Hide persistent connect checkbox */ -#define CONNDLG_PERSIST 0x00000010 /* Force persistent connection */ -#define CONNDLG_NOT_PERSIST 0x00000020 /* Force connection NOT persistent */ - -typedef struct { - DWORD cbStructure; /* size of this structure in bytes */ - HWND hwndOwner; /* owner window for the dialog */ - LPSTR lpLocalName; /* local device name */ - LPSTR lpRemoteName; /* network resource name */ - DWORD dwFlags; /* flags */ -} DISCDLGSTRUCTA, *LPDISCDLGSTRUCTA; -typedef struct { - DWORD cbStructure; /* size of this structure in bytes */ - HWND hwndOwner; /* owner window for the dialog */ - LPWSTR lpLocalName; /* local device name */ - LPWSTR lpRemoteName; /* network resource name */ - DWORD dwFlags; /* flags */ -} DISCDLGSTRUCTW, *LPDISCDLGSTRUCTW; - -DECL_WINELIB_TYPE_AW(DISCDLGSTRUCT) -DECL_WINELIB_TYPE_AW(LPDISCDLGSTRUCT) - -#define DISC_UPDATE_PROFILE 0x00000001 -#define DISC_NO_FORCE 0x00000040 - -DWORD WINAPI WNetConnectionDialog(HWND,DWORD); -DWORD WINAPI WNetDisconnectDialog(HWND,DWORD); -DWORD WINAPI WNetConnectionDialog1A(LPCONNECTDLGSTRUCTA); -DWORD WINAPI WNetConnectionDialog1W(LPCONNECTDLGSTRUCTW); -#define WNetConnectionDialog1 WINELIB_NAME_AW(WNetConnectionDialog1) -DWORD WINAPI WNetDisconnectDialog1A(LPDISCDLGSTRUCTA); -DWORD WINAPI WNetDisconnectDialog1W(LPDISCDLGSTRUCTW); -#define WNetDisconnectDialog1 WINELIB_NAME_AW(WNetDisconnectDialog1) - -/* - * Network browsing - */ - -DWORD WINAPI WNetOpenEnumA(DWORD,DWORD,DWORD,LPNETRESOURCEA,LPHANDLE); -DWORD WINAPI WNetOpenEnumW(DWORD,DWORD,DWORD,LPNETRESOURCEW,LPHANDLE); -#define WNetOpenEnum WINELIB_NAME_AW(WNetOpenEnum) -DWORD WINAPI WNetEnumResourceA(HANDLE,LPDWORD,LPVOID,LPDWORD); -DWORD WINAPI WNetEnumResourceW(HANDLE,LPDWORD,LPVOID,LPDWORD); -#define WNetEnumResource WINELIB_NAME_AW(WNetEnumResource) -DWORD WINAPI WNetGetResourceInformationA(LPNETRESOURCEA,LPVOID,LPDWORD,LPSTR*); -DWORD WINAPI WNetGetResourceInformationW(LPNETRESOURCEW,LPVOID,LPDWORD,LPWSTR*); -#define WNetGetResourceInformation WINELIB_NAME_AW(WNetGetResourceInformation) -DWORD WINAPI WNetGetResourceParentA(LPNETRESOURCEA,LPVOID,LPDWORD); -DWORD WINAPI WNetGetResourceParentW(LPNETRESOURCEW,LPVOID,LPDWORD); -#define WNetGetResourceParent WINELIB_NAME_AW(WNetGetResourceParent) -DWORD WINAPI WNetCloseEnum(HANDLE); - -/* - * Universal naming - */ - -#define UNIVERSAL_NAME_INFO_LEVEL 0x00000001 -#define REMOTE_NAME_INFO_LEVEL 0x00000002 - -typedef struct { - LPSTR lpUniversalName; -} UNIVERSAL_NAME_INFOA, *LPUNIVERSAL_NAME_INFOA; -typedef struct { - LPWSTR lpUniversalName; -} UNIVERSAL_NAME_INFOW, *LPUNIVERSAL_NAME_INFOW; - -DECL_WINELIB_TYPE_AW(UNIVERSAL_NAME_INFO) -DECL_WINELIB_TYPE_AW(LPUNIVERSAL_NAME_INFO) - -typedef struct { - LPSTR lpUniversalName; - LPSTR lpConnectionName; - LPSTR lpRemainingPath; -}REMOTE_NAME_INFOA, *LPREMOTE_NAME_INFOA; -typedef struct { - LPWSTR lpUniversalName; - LPWSTR lpConnectionName; - LPWSTR lpRemainingPath; -}REMOTE_NAME_INFOW, *LPREMOTE_NAME_INFOW; - -DECL_WINELIB_TYPE_AW(REMOTE_NAME_INFO) -DECL_WINELIB_TYPE_AW(LPREMOTE_NAME_INFO) - -DWORD WINAPI WNetGetUniversalNameA(LPCSTR,DWORD,LPVOID,LPDWORD); -DWORD WINAPI WNetGetUniversalNameW(LPCWSTR,DWORD,LPVOID,LPDWORD); -#define WNetGetUniversalName WINELIB_NAME_AW(WNetGetUniversalName) - -/* - * Other - */ - -DWORD WINAPI WNetGetUserA(LPCSTR,LPSTR,LPDWORD); -DWORD WINAPI WNetGetUserW(LPCWSTR,LPWSTR,LPDWORD); -#define WNetGetUser WINELIB_NAME_AW(WNetGetUser) - -#define WNFMT_MULTILINE 0x01 -#define WNFMT_ABBREVIATED 0x02 -#define WNFMT_INENUM 0x10 -#define WNFMT_CONNECTION 0x20 - -DWORD WINAPI WNetGetProviderNameA(DWORD,LPSTR,LPDWORD); -DWORD WINAPI WNetGetProviderNameW(DWORD,LPWSTR,LPDWORD); -#define WNetGetProviderName WINELIB_NAME_AW(WNetGetProviderName) - -typedef struct { - DWORD cbStructure; - DWORD dwProviderVersion; - DWORD dwStatus; - DWORD dwCharacteristics; - DWORD dwHandle; - WORD wNetType; - DWORD dwPrinters; - DWORD dwDrives; -} NETINFOSTRUCT, *LPNETINFOSTRUCT; - -#define NETINFO_DLL16 0x00000001 -#define NETINFO_DISKRED 0x00000004 -#define NETINFO_PRINTERRED 0x00000008 - -DWORD WINAPI WNetGetNetworkInformationA(LPCSTR,LPNETINFOSTRUCT); -DWORD WINAPI WNetGetNetworkInformationW(LPCWSTR,LPNETINFOSTRUCT); -#define WNetGetNetworkInformation WINELIB_NAME_AW(WNetGetNetworkInformation) - - -/* - * Status codes - */ - -DWORD WINAPI WNetGetLastErrorA(LPDWORD,LPSTR,DWORD,LPSTR,DWORD); -DWORD WINAPI WNetGetLastErrorW(LPDWORD,LPWSTR,DWORD,LPWSTR,DWORD); -#define WNetGetLastError WINELIB_NAME_AW(WNetGetLastError) - -#define WN_SUCCESS NO_ERROR -#define WN_NO_ERROR NO_ERROR -#define WN_NOT_SUPPORTED ERROR_NOT_SUPPORTED -#define WN_CANCEL ERROR_CANCELLED -#define WN_RETRY ERROR_RETRY -#define WN_NET_ERROR ERROR_UNEXP_NET_ERR -#define WN_MORE_DATA ERROR_MORE_DATA -#define WN_BAD_POINTER ERROR_INVALID_ADDRESS -#define WN_BAD_VALUE ERROR_INVALID_PARAMETER -#define WN_BAD_USER ERROR_BAD_USERNAME -#define WN_BAD_PASSWORD ERROR_INVALID_PASSWORD -#define WN_ACCESS_DENIED ERROR_ACCESS_DENIED -#define WN_FUNCTION_BUSY ERROR_BUSY -#define WN_WINDOWS_ERROR ERROR_UNEXP_NET_ERR -#define WN_OUT_OF_MEMORY ERROR_NOT_ENOUGH_MEMORY -#define WN_NO_NETWORK ERROR_NO_NETWORK -#define WN_EXTENDED_ERROR ERROR_EXTENDED_ERROR -#define WN_BAD_LEVEL ERROR_INVALID_LEVEL -#define WN_BAD_HANDLE ERROR_INVALID_HANDLE -#define WN_NOT_INITIALIZING ERROR_ALREADY_INITIALIZED -#define WN_NO_MORE_DEVICES ERROR_NO_MORE_DEVICES - -#define WN_NOT_CONNECTED ERROR_NOT_CONNECTED -#define WN_OPEN_FILES ERROR_OPEN_FILES -#define WN_DEVICE_IN_USE ERROR_DEVICE_IN_USE -#define WN_BAD_NETNAME ERROR_BAD_NET_NAME -#define WN_BAD_LOCALNAME ERROR_BAD_DEVICE -#define WN_ALREADY_CONNECTED ERROR_ALREADY_ASSIGNED -#define WN_DEVICE_ERROR ERROR_GEN_FAILURE -#define WN_CONNECTION_CLOSED ERROR_CONNECTION_UNAVAIL -#define WN_NO_NET_OR_BAD_PATH ERROR_NO_NET_OR_BAD_PATH -#define WN_BAD_PROVIDER ERROR_BAD_PROVIDER -#define WN_CANNOT_OPEN_PROFILE ERROR_CANNOT_OPEN_PROFILE -#define WN_BAD_PROFILE ERROR_BAD_PROFILE -#define WN_BAD_DEV_TYPE ERROR_BAD_DEV_TYPE -#define WN_DEVICE_ALREADY_REMEMBERED ERROR_DEVICE_ALREADY_REMEMBERED - -#define WN_NO_MORE_ENTRIES ERROR_NO_MORE_ITEMS -#define WN_NOT_CONTAINER ERROR_NOT_CONTAINER - -#define WN_NOT_AUTHENTICATED ERROR_NOT_AUTHENTICATED -#define WN_NOT_LOGGED_ON ERROR_NOT_LOGGED_ON -#define WN_NOT_VALIDATED ERROR_NO_LOGON_SERVERS - - -/* - * Multinet (for Shell) - */ - -typedef struct { - DWORD cbStructure; - DWORD dwFlags; - DWORD dwSpeed; - DWORD dwDelay; - DWORD dwOptDataSize; -} NETCONNECTINFOSTRUCT,*LPNETCONNECTINFOSTRUCT; - -#define WNCON_FORNETCARD 0x00000001 -#define WNCON_NOTROUTED 0x00000002 -#define WNCON_SLOWLINK 0x00000004 -#define WNCON_DYNAMIC 0x00000008 - -DWORD WINAPI MultinetGetConnectionPerformanceA(LPNETRESOURCEA,LPNETCONNECTINFOSTRUCT); -DWORD WINAPI MultinetGetConnectionPerformanceW(LPNETRESOURCEW,LPNETCONNECTINFOSTRUCT); -#define MultinetGetConnectionPerformance WINELIB_NAME_AW(MultinetGetConnectionPerformance) -DWORD WINAPI MultinetGetErrorTextA(DWORD,DWORD,DWORD); -DWORD WINAPI MultinetGetErrorTextW(DWORD,DWORD,DWORD); -#define MultinetGetErrorText WINELIB_NAME_AW(MultinetGetErrorText) - -/* - * Password cache - */ +#ifndef __WINE_WINNETWK_H +#define __WINE_WINNETWK_H /* WNetEnumCachedPasswords */ typedef struct tagPASSWORD_CACHE_ENTRY @@ -392,8 +25,5 @@ typedef struct tagPASSWORD_CACHE_ENTRY typedef BOOL (CALLBACK *ENUMPASSWORDPROC)(PASSWORD_CACHE_ENTRY *, DWORD); UINT WINAPI WNetEnumCachedPasswords( LPSTR, WORD, BYTE, ENUMPASSWORDPROC, DWORD); -DWORD WINAPI WNetGetCachedPassword( LPSTR, WORD, LPSTR, LPWORD, BYTE ); -DWORD WINAPI WNetCachePassword( LPSTR, WORD, LPSTR, WORD, BYTE, WORD ); - -#endif /* _WINNETWK_H_ */ +#endif /* __WINE_WINNETWK_H */ diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c index 1ebdd76330f..3fd02d9a5b7 100644 --- a/reactos/lib/shell32/pidl.c +++ b/reactos/lib/shell32/pidl.c @@ -204,7 +204,7 @@ LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl) * NOTES * when pidl=Desktop return=FALSE */ -BOOL WINAPI ILRemoveLastID(LPCITEMIDLIST pidl) +BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl) { TRACE_(shell)("pidl=%p\n",pidl); diff --git a/reactos/lib/shell32/shell32_main.c b/reactos/lib/shell32/shell32_main.c index fa79faf559b..5de39d65eb2 100644 --- a/reactos/lib/shell32/shell32_main.c +++ b/reactos/lib/shell32/shell32_main.c @@ -706,7 +706,7 @@ DWORD WINAPI SHHelpShortcuts_RunDLL (DWORD dwArg1, DWORD dwArg2, DWORD dwArg3, D * the shell process and release it immediately */ -DWORD WINAPI SHLoadInProc (REFCLSID rclsid) +HRESULT WINAPI SHLoadInProc (REFCLSID rclsid) { void *ptr = NULL; diff --git a/reactos/lib/shell32/shellole.c b/reactos/lib/shell32/shellole.c index cc4f7067cfc..e53f21f21b2 100644 --- a/reactos/lib/shell32/shellole.c +++ b/reactos/lib/shell32/shellole.c @@ -495,7 +495,7 @@ void WINAPI SHFree(LPVOID pv) /************************************************************************* * SHGetDesktopFolder [SHELL32.@] */ -DWORD WINAPI SHGetDesktopFolder(IShellFolder **psf) +HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf) { HRESULT hres = S_OK; TRACE("\n"); diff --git a/reactos/lib/shell32/shellord.c b/reactos/lib/shell32/shellord.c index 894de4dcf01..d6521fa4b75 100644 --- a/reactos/lib/shell32/shellord.c +++ b/reactos/lib/shell32/shellord.c @@ -612,9 +612,8 @@ static INT SHADD_create_add_mru_data(HANDLE mruhandle, LPSTR doc_name, LPSTR new * NOTES * exported by name * - * FIXME: ?? MSDN shows this as a VOID */ -DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) +void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) { /* If list is a string list lpfnCompare has the following prototype * int CALLBACK MRUCompareString(LPCSTR s1, LPCSTR s2) @@ -653,20 +652,20 @@ DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) ret=SHADD_get_policy( "NoRecentDocsHistory", &type, &data, &datalen); if ((ret > 0) && (ret != ERROR_FILE_NOT_FOUND)) { ERR("Error %d getting policy \"NoRecentDocsHistory\"\n", ret); - return 0; + return; } if (ret == ERROR_SUCCESS) { if (!( (type == REG_DWORD) || ((type == REG_BINARY) && (datalen == 4)) )) { ERR("Error policy data for \"NoRecentDocsHistory\" not formated correctly, type=%ld, len=%ld\n", type, datalen); - return 0; + return; } TRACE("policy value for NoRecentDocsHistory = %08lx\n", data[0]); /* now test the actual policy value */ if ( data[0] != 0) - return 0; + return; } /* Open key to where the necessary info is @@ -679,7 +678,7 @@ DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", 0, 0, 0, KEY_READ, 0, &HCUbasekey, 0)) { ERR("Failed to create 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer'\n"); - return 0; + return; } /* Get path to user's "Recent" directory @@ -729,7 +728,7 @@ DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) */ RegDeleteKeyA(HCUbasekey, "RecentDocs"); RegCloseKey(HCUbasekey); - return 0; + return; } /* Have data to add, the jobs to be done: @@ -785,7 +784,7 @@ DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) /* MRU failed */ ERR("MRU processing failed, handle zero\n"); RegCloseKey(HCUbasekey); - return 0; + return; } len = lstrlenA(doc_name); pos = FindMRUData(mruhandle, doc_name, len, 0); @@ -934,7 +933,7 @@ DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) /* all done */ RegCloseKey(HCUbasekey); - return 0; + return; } /************************************************************************* diff --git a/reactos/lib/shell32/shlfileop.c b/reactos/lib/shell32/shlfileop.c index 21956669373..bae85725e06 100644 --- a/reactos/lib/shell32/shlfileop.c +++ b/reactos/lib/shell32/shlfileop.c @@ -545,7 +545,7 @@ DWORD WINAPI SHCreateDirectory(HWND hWnd, LPCVOID path) * ERROR_ALREADY_EXISTS when the directory already exists * ERROR_FILENAME_EXCED_RANGE if the filename was to long to process */ -DWORD WINAPI SHCreateDirectoryExA(HWND hWnd, LPCSTR path, LPSECURITY_ATTRIBUTES sec) +int WINAPI SHCreateDirectoryExA(HWND hWnd, LPCSTR path, LPSECURITY_ATTRIBUTES sec) { WCHAR wPath[MAX_PATH]; TRACE("(%p, %s, %p)\n",hWnd, debugstr_a(path), sec); @@ -557,9 +557,9 @@ DWORD WINAPI SHCreateDirectoryExA(HWND hWnd, LPCSTR path, LPSECURITY_ATTRIBUTES /************************************************************************* * SHCreateDirectoryExW [SHELL32.@] */ -DWORD WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec) +int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec) { - DWORD ret = ERROR_BAD_PATHNAME; + int ret = ERROR_BAD_PATHNAME; TRACE("(%p, %s, %p)\n",hWnd, debugstr_w(path), sec); if (PathIsRelativeW(path)) diff --git a/reactos/w32api/include/shlguid.h b/reactos/w32api/include/shlguid.h index 5bbc7af414e..ff1dfa01551 100644 --- a/reactos/w32api/include/shlguid.h +++ b/reactos/w32api/include/shlguid.h @@ -9,8 +9,14 @@ extern "C" { #endif #define DEFINE_SHLGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46) #define SID_SShellBrowser IID_IShellBrowser +extern const GUID CLSID_MyComputer; extern const GUID CLSID_ShellDesktop; extern const GUID CLSID_ShellLink; +extern const GUID CLSID_ControlPanel; +extern const GUID CLSID_Internet; +extern const GUID CLSID_NetworkPlaces; +extern const GUID CLSID_RecycleBin; +extern const GUID CLSID_ShellFSFolder; extern const GUID FMTID_Intshcut; extern const GUID FMTID_InternetSite; extern const GUID CGID_Explorer; diff --git a/reactos/w32api/include/shlobj.h b/reactos/w32api/include/shlobj.h index 52a1e4fcf4c..761d35286dd 100644 --- a/reactos/w32api/include/shlobj.h +++ b/reactos/w32api/include/shlobj.h @@ -332,6 +332,50 @@ extern "C" { #define SVGIO_ALLVIEW 2 #define SV2GV_CURRENTVIEW ((UINT)-1) #define SV2GV_DEFAULTVIEW ((UINT)-2) +#define SHCNE_RENAMEITEM 0x00000001 +#define SHCNE_CREATE 0x00000002 +#define SHCNE_DELETE 0x00000004 +#define SHCNE_MKDIR 0x00000008 +#define SHCNE_RMDIR 0x00000010 +#define SHCNE_MEDIAINSERTED 0x00000020 +#define SHCNE_MEDIAREMOVED 0x00000040 +#define SHCNE_DRIVEREMOVED 0x00000080 +#define SHCNE_DRIVEADD 0x00000100 +#define SHCNE_NETSHARE 0x00000200 +#define SHCNE_NETUNSHARE 0x00000400 +#define SHCNE_ATTRIBUTES 0x00000800 +#define SHCNE_UPDATEDIR 0x00001000 +#define SHCNE_UPDATEITEM 0x00002000 +#define SHCNE_SERVERDISCONNECT 0x00004000 +#define SHCNE_UPDATEIMAGE 0x00008000 +#define SHCNE_DRIVEADDGUI 0x00010000 +#define SHCNE_RENAMEFOLDER 0x00020000 +#define SHCNE_FREESPACE 0x00040000 +#define SHCNE_EXTENDED_EVENT 0x04000000 +#define SHCNE_ASSOCCHANGED 0x08000000 +#define SHCNE_DISKEVENTS 0x0002381F +#define SHCNE_GLOBALEVENTS 0x0C0581E0 +#define SHCNE_ALLEVENTS 0x7FFFFFFF +#define SHCNE_INTERRUPT 0x80000000 +#define SHCNEE_ORDERCHANGED 0x0002L +#define SHCNEE_MSI_CHANGE 0x0004L +#define SHCNEE_MSI_UNINSTALL 0x0005L +#define SHCNF_IDLIST 0x0000 +#define SHCNF_PATHA 0x0001 +#define SHCNF_PRINTERA 0x0002 +#define SHCNF_DWORD 0x0003 +#define SHCNF_PATHW 0x0005 +#define SHCNF_PRINTERW 0x0006 +#define SHCNF_TYPE 0x00FF +#define SHCNF_FLUSH 0x1000 +#define SHCNF_FLUSHNOWAIT 0x2000 +#ifdef UNICODE +#define SHCNF_PATH SHCNF_PATHW +#define SHCNF_PRINTER SHCNF_PRINTERW +#else +#define SHCNF_PATH SHCNF_PATHA +#define SHCNF_PRINTER SHCNF_PRINTERA +#endif typedef ULONG SFGAOF; typedef DWORD SHGDNF; @@ -516,6 +560,205 @@ typedef struct int csidl; } PERSIST_FOLDER_TARGET_INFO; #endif +typedef struct _SHChangeNotifyEntry +{ + LPCITEMIDLIST pidl; + BOOL fRecursive; +} SHChangeNotifyEntry; +#define NUM_POINTS 3 +typedef struct +{ + int iNextSample; + DWORD dwLastScroll; + BOOL bFull; + POINT pts[NUM_POINTS]; + DWORD dwTimes[NUM_POINTS]; +} AUTO_SCROLL_DATA; +typedef struct +{ + WORD cLength; + WORD nVersion; + BOOL fFullPathTitle:1; + BOOL fSaveLocalView:1; + BOOL fNotShell:1; + BOOL fSimpleDefault:1; + BOOL fDontShowDescBar:1; + BOOL fNewWindowMode:1; + BOOL fShowCompColor:1; + BOOL fDontPrettyNames:1; + BOOL fAdminsCreateCommonGroups:1; + UINT fUnusedFlags:7; + UINT fMenuEnumFilter; +} CABINETSTATE, *LPCABINETSTATE; +typedef enum RESTRICTIONS +{ + REST_NONE = 0x00000000, + REST_NORUN = 0x00000001, + REST_NOCLOSE = 0x00000002, + REST_NOSAVESET = 0x00000004, + REST_NOFILEMENU = 0x00000008, + REST_NOSETFOLDERS = 0x00000010, + REST_NOSETTASKBAR = 0x00000020, + REST_NODESKTOP = 0x00000040, + REST_NOFIND = 0x00000080, + REST_NODRIVES = 0x00000100, + REST_NODRIVEAUTORUN = 0x00000200, + REST_NODRIVETYPEAUTORUN = 0x00000400, + REST_NONETHOOD = 0x00000800, + REST_STARTBANNER = 0x00001000, + REST_RESTRICTRUN = 0x00002000, + REST_NOPRINTERTABS = 0x00004000, + REST_NOPRINTERDELETE = 0x00008000, + REST_NOPRINTERADD = 0x00010000, + REST_NOSTARTMENUSUBFOLDERS = 0x00020000, + REST_MYDOCSONNET = 0x00040000, + REST_NOEXITTODOS = 0x00080000, + REST_ENFORCESHELLEXTSECURITY = 0x00100000, + REST_LINKRESOLVEIGNORELINKINFO = 0x00200000, + REST_NOCOMMONGROUPS = 0x00400000, + REST_SEPARATEDESKTOPPROCESS = 0x00800000, + REST_NOWEB = 0x01000000, + REST_NOTRAYCONTEXTMENU = 0x02000000, + REST_NOVIEWCONTEXTMENU = 0x04000000, + REST_NONETCONNECTDISCONNECT = 0x08000000, + REST_STARTMENULOGOFF = 0x10000000, + REST_NOSETTINGSASSIST = 0x20000000, + REST_NOINTERNETICON = 0x40000001, + REST_NORECENTDOCSHISTORY, + REST_NORECENTDOCSMENU, + REST_NOACTIVEDESKTOP, + REST_NOACTIVEDESKTOPCHANGES, + REST_NOFAVORITESMENU, + REST_CLEARRECENTDOCSONEXIT, + REST_CLASSICSHELL, + REST_NOCUSTOMIZEWEBVIEW, + + REST_NOHTMLWALLPAPER = 0x40000010, + REST_NOCHANGINGWALLPAPER, + REST_NODESKCOMP, + REST_NOADDDESKCOMP, + REST_NODELDESKCOMP, + REST_NOCLOSEDESKCOMP, + REST_NOCLOSE_DRAGDROPBAND, + REST_NOMOVINGBAND, + REST_NOEDITDESKCOMP, + REST_NORESOLVESEARCH, + REST_NORESOLVETRACK, + REST_FORCECOPYACLWITHFILE, + REST_NOLOGO3CHANNELNOTIFY, + REST_NOFORGETSOFTWAREUPDATE, + REST_NOSETACTIVEDESKTOP, + REST_NOUPDATEWINDOWS, + REST_NOCHANGESTARMENU, /* 0x40000020 */ + REST_NOFOLDEROPTIONS, + REST_HASFINDCOMPUTERS, + REST_INTELLIMENUS, + REST_RUNDLGMEMCHECKBOX, + REST_ARP_ShowPostSetup, + REST_NOCSC, + REST_NOCONTROLPANEL, + REST_ENUMWORKGROUP, + REST_ARP_NOARP, + REST_ARP_NOREMOVEPAGE, + REST_ARP_NOADDPAGE, + REST_ARP_NOWINSETUPPAGE, + REST_GREYMSIADS, + REST_NOCHANGEMAPPEDDRIVELABEL, + REST_NOCHANGEMAPPEDDRIVECOMMENT, + REST_MaxRecentDocs, /* 0x40000030 */ + REST_NONETWORKCONNECTIONS, + REST_FORCESTARTMENULOGOFF, + REST_NOWEBVIEW, + REST_NOCUSTOMIZETHISFOLDER, + REST_NOENCRYPTION, + + REST_ALLOWFRENCHENCRYPTION, /* not documented */ + + REST_DONTSHOWSUPERHIDDEN, + REST_NOSHELLSEARCHBUTTON, + REST_NOHARDWARETAB, + REST_NORUNASINSTALLPROMPT, + REST_PROMPTRUNASINSTALLNETPATH, + REST_NOMANAGEMYCOMPUTERVERB, + REST_NORECENTDOCSNETHOOD, + REST_DISALLOWRUN, + REST_NOWELCOMESCREEN, + REST_RESTRICTCPL, /* 0x40000040 */ + REST_DISALLOWCPL, + REST_NOSMBALLOONTIP, + REST_NOSMHELP, + REST_NOWINKEYS, + REST_NOENCRYPTONMOVE, + REST_NOLOCALMACHINERUN, + REST_NOCURRENTUSERRUN, + REST_NOLOCALMACHINERUNONCE, + REST_NOCURRENTUSERRUNONCE, + REST_FORCEACTIVEDESKTOPON, + REST_NOCOMPUTERSNEARME, + REST_NOVIEWONDRIVE, + REST_NONETCRAWL, + REST_NOSHAREDDOCUMENTS, + REST_NOSMMYDOCS, + REST_NOSMMYPICS, /* 0x40000050 */ + REST_ALLOWBITBUCKDRIVES, + REST_NONLEGACYSHELLMODE, + REST_NOCONTROLPANELBARRICADE, + REST_NOSTARTPAGE, + REST_NOAUTOTRAYNOTIFY, + REST_NOTASKGROUPING, + REST_NOCDBURNING, + REST_MYCOMPNOPROP, + REST_MYDOCSNOPROP, + REST_NOSTARTPANEL, + REST_NODISPLAYAPPEARANCEPAGE, + REST_NOTHEMESTAB, + REST_NOVISUALSTYLECHOICE, + REST_NOSIZECHOICE, + REST_NOCOLORCHOICE, + REST_SETVISUALSTYLE, /* 0x40000060 */ + REST_STARTRUNNOHOMEPATH, + REST_NOUSERNAMEINSTARTPANEL, + REST_NOMYCOMPUTERICON, + REST_NOSMNETWORKPLACES, + REST_NOSMPINNEDLIST, + REST_NOSMMYMUSIC, + REST_NOSMEJECTPC, + REST_NOSMMOREPROGRAMS, + REST_NOSMMFUPROGRAMS, + REST_NOTRAYITEMSDISPLAY, + REST_NOTOOLBARSONTASKBAR, + /* 0x4000006C + 0x4000006D + 0x4000006E */ + REST_NOSMCONFIGUREPROGRAMS = 0x4000006F, + REST_HIDECLOCK, /* 0x40000070 */ + REST_NOLOWDISKSPACECHECKS, + REST_NOENTIRENETWORK, + REST_NODESKTOPCLEANUP, + REST_BITBUCKNUKEONDELETE, + REST_BITBUCKCONFIRMDELETE, + REST_BITBUCKNOPROP, + REST_NODISPBACKGROUND, + REST_NODISPSCREENSAVEPG, + REST_NODISPSETTINGSPG, + REST_NODISPSCREENSAVEPREVIEW, + REST_NODISPLAYCPL, + REST_HIDERUNASVERB, + REST_NOTHUMBNAILCACHE, + REST_NOSTRCMPLOGICAL, + REST_NOPUBLISHWIZARD, + REST_NOONLINEPRINTSWIZARD, /* 0x40000080 */ + REST_NOWEBSERVICES, + REST_ALLOWUNHASHEDWEBVIEW, + REST_ALLOWLEGACYWEBVIEW, + REST_REVERTWEBVIEWSECURITY, + + REST_INHERITCONSOLEHANDLES = 0x40000086, + + REST_NODISCONNECT = 0x41000001, + REST_NOSECURITY, + REST_NOFILEASSOCIATE, /* 0x41000003 */ +} RESTRICTIONS; DECLARE_ENUMERATOR_(IEnumIDList,LPITEMIDLIST); typedef IEnumIDList *LPENUMIDLIST; @@ -848,7 +1091,7 @@ typedef IShellFolder *LPSHELLFOLDER; #define IShellFolder_BindToObject(T,a,b,c,d) (T)->lpVtbl->BindToObject(T,a,b,c,d) #define IShellFolder_BindToStorage(T,a,b,c,d) (T)->lpVtbl->BindToStorage(T,a,b,c,d) #define IShellFolder_CompareIDs(T,a,b,c) (T)->lpVtbl->CompareIDs(T,a,b,c) -#define IShellFolder_CreateViewObject(T,a,b) (T)->lpVtbl->CreateViewObject(T,a,b) +#define IShellFolder_CreateViewObject(T,a,b,c) (T)->lpVtbl->CreateViewObject(T,a,b,c) #define IShellFolder_GetAttributesOf(T,a,b,c) (T)->lpVtbl->GetAttributesOf(T,a,b,c) #define IShellFolder_GetUIObjectOf(T,a,b,c,d,e,f) (T)->lpVtbl->GetUIObjectOf(T,a,b,c,d,e,f) #define IShellFolder_GetDisplayNameOf(T,a,b,c) (T)->lpVtbl->GetDisplayNameOf(T,a,b,c) @@ -1394,6 +1637,12 @@ void WINAPI ILFree(LPITEMIDLIST); HRESULT WINAPI SHCoCreateInstance(LPCWSTR,REFCLSID,IUnknown*,REFIID,void**); #endif +int WINAPI RestartDialog(HWND,LPCWSTR,UINT); +int WINAPI RestartDialogEx(HWND,LPCWSTR,UINT,UINT); + +ULONG WINAPI SHChangeNotifyRegister(HWND,int,LONG,UINT,int,SHChangeNotifyEntry *); +BOOL WINAPI SHChangeNotifyDeregister(ULONG); + #ifdef UNICODE typedef IShellExecuteHookW IShellExecuteHook; typedef IShellLinkW IShellLink; diff --git a/reactos/w32api/include/winnetwk.h b/reactos/w32api/include/winnetwk.h index 0e734462587..44ca5c1823c 100644 --- a/reactos/w32api/include/winnetwk.h +++ b/reactos/w32api/include/winnetwk.h @@ -277,7 +277,7 @@ DWORD APIENTRY WNetGetProviderNameW(DWORD,LPWSTR,PDWORD); DWORD APIENTRY WNetGetNetworkInformationA(LPCSTR,LPNETINFOSTRUCT); DWORD APIENTRY WNetGetNetworkInformationW(LPCWSTR,LPNETINFOSTRUCT); DWORD APIENTRY WNetGetResourceInformationA(LPNETRESOURCEA,LPVOID,LPDWORD,LPSTR*); -DWORD APIENTRY WNetGetResourceInformationW(LPNETRESOURCEA,LPVOID,LPDWORD,LPWSTR*); +DWORD APIENTRY WNetGetResourceInformationW(LPNETRESOURCEW,LPVOID,LPDWORD,LPWSTR*); DWORD APIENTRY WNetGetLastErrorA(PDWORD,LPSTR,DWORD,LPSTR,DWORD); DWORD APIENTRY WNetGetLastErrorW(PDWORD,LPWSTR,DWORD,LPWSTR,DWORD); DWORD APIENTRY MultinetGetConnectionPerformanceA(LPNETRESOURCEA,LPNETCONNECTINFOSTRUCT); From 80df3c01b832dd7d8b1ccbfad31694b8f09ad876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 29 Jun 2004 13:47:27 +0000 Subject: [PATCH 129/356] Minimize Wine porting headers svn path=/trunk/; revision=9928 --- reactos/lib/shell32/shell32_main.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index eb399e45628..934af5855d3 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -236,9 +236,6 @@ BOOL WINAPI ShellExecuteExW32(LPSHELLEXECUTEINFOW psei, SHELL_ExecuteW32 execfun UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, LPWSTR lpResult, int resultLen, LPWSTR key, void **env, LPITEMIDLIST pidl, LPCWSTR args); -int WINAPI RestartDialog(HWND hwndOwner, LPCSTR lpstrReason, UINT uFlags); -int WINAPI RestartDialogEx(HWND hwndOwner, LPCWSTR lpwstrReason, UINT uFlags, UINT uReason); - extern WCHAR swShell32Name[MAX_PATH]; #endif From 4e347550d48d94f14fe7550f2bdb93c24004005c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 29 Jun 2004 13:51:59 +0000 Subject: [PATCH 130/356] Fix RestartDialog() prototype svn path=/trunk/; revision=9929 --- reactos/lib/shell32/dialogs.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/reactos/lib/shell32/dialogs.c b/reactos/lib/shell32/dialogs.c index 11a70f9b9f3..bd19cd458d5 100644 --- a/reactos/lib/shell32/dialogs.c +++ b/reactos/lib/shell32/dialogs.c @@ -379,7 +379,7 @@ void FillList (HWND hCb, char *pszLatest) /************************************************************************* - * RestartWindowsDialog [SHELL32.730] + * RestartDialogEx [SHELL32.730] */ int WINAPI RestartDialogEx(HWND hwndOwner, LPCWSTR lpwstrReason, UINT uFlags, UINT uReason) @@ -410,27 +410,12 @@ int WINAPI RestartDialogEx(HWND hwndOwner, LPCWSTR lpwstrReason, UINT uFlags, UI /************************************************************************* - * RestartWindowsDialog [SHELL32.59] + * RestartDialog [SHELL32.59] */ -int WINAPI RestartDialog(HWND hwndOwner, LPCSTR lpstrReason, UINT uFlags) +int WINAPI RestartDialog(HWND hwndOwner, LPCWSTR lpstrReason, UINT uFlags) { - LPWSTR lpwcsReason; - int len, ret; - - if (lpstrReason) { - len = MultiByteToWideChar(CP_ACP, 0, lpstrReason, -1, NULL, 0); - lpwcsReason = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, lpstrReason, -1, lpwcsReason, len); - } else - lpwcsReason = NULL; - - ret = RestartDialogEx(hwndOwner, lpwcsReason, uFlags, 0); - - if (lpwcsReason) - HeapFree(GetProcessHeap(), 0, lpwcsReason); - - return ret; + return RestartDialogEx(hwndOwner, lpstrReason, uFlags, 0); } From 653e60385efb73e4b3f8d498885b655ae435173e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 29 Jun 2004 14:08:58 +0000 Subject: [PATCH 131/356] Fix IFileSystemBindData method order svn path=/trunk/; revision=9930 --- reactos/lib/shell32/shlfsbind.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/shlfsbind.c b/reactos/lib/shell32/shlfsbind.c index 73344ae1ebf..75ea638f5d5 100644 --- a/reactos/lib/shell32/shlfsbind.c +++ b/reactos/lib/shell32/shlfsbind.c @@ -58,8 +58,8 @@ static struct ICOM_VTABLE(IFileSystemBindData) sbvt = IFileSystemBindData_fnQueryInterface, IFileSystemBindData_fnAddRef, IFileSystemBindData_fnRelease, - IFileSystemBindData_fnGetFindData, IFileSystemBindData_fnSetFindData, + IFileSystemBindData_fnGetFindData, }; static WCHAR wFileSystemBindData[] = {'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0}; From 91da5e1abe9808ac067863fc134963a1ba402277 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 29 Jun 2004 17:40:01 +0000 Subject: [PATCH 132/356] Add substitutions for 'MS Shell Dlg' and 'MS Shell Dlg 2' fonts. svn path=/trunk/; revision=9931 --- reactos/bootdata/hivesft.inf | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 45877bbccb1..3814479b776 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -3,11 +3,6 @@ Signature="$ReactOS$ [AddReg] -; Version Information -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentVersion",0x00020000,"4.0" -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CSDVersion",0x00020000,"Service Pack 6" -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00020000,"1381" - ; Common shell folder settings HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Desktop",0x00020000,"%ALLUSERSPROFILE%\Desktop" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common AppData",0x00020000,"%ALLUSERSPROFILE%\Application Data" @@ -24,6 +19,11 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Templates",0x00020000,"%ALLUSERSPROFILE%\Templates" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Personal",0x00020000,"%ALLUSERSPROFILE%\My Documents" +; Version Information +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentVersion",0x00020000,"4.0" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CSDVersion",0x00020000,"Service Pack 6" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00020000,"1381" + ; Image File Execution Options (NtGlobalFlag with FLG_SHOW_LDR_SNAPS set for loadlib.exe) HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00000000,"0x00000002" ;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00000000,"0x00000002" @@ -49,5 +49,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Courier HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Marlett",0x00000000,"TGMarlett" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Times New Roman",0x00000000,"Bitstream Vera Serif" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Sans Serif",0x00000000,"Bitstream Vera Sans" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Shell Dlg",0x00000000,"Bitstream Vera Sans" +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Shell Dlg 2",0x00000000,"Bitstream Vera Sans" ; EOF From ecd1ebfec82a194465ab506b4e9d21e3fac6074d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 18:12:27 +0000 Subject: [PATCH 133/356] - Match the first 16 colors of the Windows (R) XP default palette. svn path=/trunk/; revision=9932 --- reactos/drivers/video/displays/framebuf/palette.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/displays/framebuf/palette.c b/reactos/drivers/video/displays/framebuf/palette.c index 7e6272e92ba..87ab37285ae 100644 --- a/reactos/drivers/video/displays/framebuf/palette.c +++ b/reactos/drivers/video/displays/framebuf/palette.c @@ -36,9 +36,9 @@ const PALETTEENTRY BASEPALETTE[20] = { 0x00, 0x80, 0x80, 0x00 }, { 0xC0, 0xC0, 0xC0, 0x00 }, { 0xC0, 0xDC, 0xC0, 0x00 }, - { 0xA6, 0xCA, 0xF0, 0x00 }, + { 0xD4, 0xD0, 0xC8, 0x00 }, { 0xFF, 0xFB, 0xF0, 0x00 }, - { 0xA0, 0xA0, 0xA4, 0x00 }, + { 0x3A, 0x6E, 0xA5, 0x00 }, { 0x80, 0x80, 0x80, 0x00 }, { 0xFF, 0x00, 0x00, 0x00 }, { 0x00, 0xFF, 0x00, 0x00 }, From b43bcf2cc14309660ecbb517693a47164ed11868 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 18:12:28 +0000 Subject: [PATCH 134/356] - Report 1 (Default) instead of 0 (Invalid) as the refresh frequency value. svn path=/trunk/; revision=9933 --- reactos/drivers/video/miniport/vbe/vbemp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 6992ce6df96..cd2a21917ac 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -819,7 +819,7 @@ VBEQueryMode( VideoMode->ScreenStride = VBEMode->BytesPerScanLine; VideoMode->NumberOfPlanes = VBEMode->NumberOfPlanes; VideoMode->BitsPerPlane = VBEMode->BitsPerPixel / VBEMode->NumberOfPlanes; - VideoMode->Frequency = 0; /* FIXME */ + VideoMode->Frequency = 1; VideoMode->XMillimeter = 0; /* FIXME */ VideoMode->YMillimeter = 0; /* FIXME */ if (VBEMode->BitsPerPixel > 8) From 0ad9fa72f8ba66437b9e556477484d71ef0e6c66 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 18:12:30 +0000 Subject: [PATCH 135/356] - Fixed list mode traversing. svn path=/trunk/; revision=9934 --- reactos/drivers/video/displays/framebuf/screen.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/drivers/video/displays/framebuf/screen.c b/reactos/drivers/video/displays/framebuf/screen.c index 95abedddda3..b760cafac23 100644 --- a/reactos/drivers/video/displays/framebuf/screen.c +++ b/reactos/drivers/video/displays/framebuf/screen.c @@ -162,6 +162,7 @@ IntInitScreenInfo( { continue; } + if (pDevMode->dmPelsWidth == ModeInfoPtr->VisScreenWidth && pDevMode->dmPelsHeight == ModeInfoPtr->VisScreenHeight && pDevMode->dmBitsPerPel == (ModeInfoPtr->BitsPerPlane * @@ -171,6 +172,8 @@ IntInitScreenInfo( SelectedMode = ModeInfoPtr; break; } + + ModeInfoPtr++; } } From 70e1b16c270a590d8f4cfd0197ac7e89d62cfc81 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 29 Jun 2004 19:20:16 +0000 Subject: [PATCH 136/356] fixed makefiles svn path=/trunk/; revision=9935 --- reactos/drivers/dd/Makefile | 2 +- reactos/drivers/storage/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/dd/Makefile b/reactos/drivers/dd/Makefile index 3c842adfa26..9859d89a6d9 100644 --- a/reactos/drivers/dd/Makefile +++ b/reactos/drivers/dd/Makefile @@ -6,7 +6,7 @@ PATH_TO_TOP = ../.. include $(PATH_TO_TOP)/rules.mak -DRIVERS = beep blue bootvid debugout floppy ide null serial +DRIVERS = beep blue bootvid debugout null serial all: $(DRIVERS) diff --git a/reactos/drivers/storage/Makefile b/reactos/drivers/storage/Makefile index 11018f5ed4d..c7bb0fde85c 100644 --- a/reactos/drivers/storage/Makefile +++ b/reactos/drivers/storage/Makefile @@ -6,7 +6,7 @@ PATH_TO_TOP = ../.. include $(PATH_TO_TOP)/rules.mak -DRIVERS = atapi cdrom class2 disk diskdump scsiport +DRIVERS = atapi cdrom class2 disk diskdump floppy scsiport all: $(DRIVERS) From c891ec007e73ad12ef85aa61e72ddb98505f269e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 20:08:05 +0000 Subject: [PATCH 137/356] - Match the first 16 colors of the Windows (R) XP default palette. svn path=/trunk/; revision=9936 --- reactos/subsys/win32k/objects/color.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 2fbbfcbe751..c28fd426ae1 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.44 2004/06/28 17:03:35 navaraf Exp $ */ +/* $Id: color.c,v 1.45 2004/06/29 20:08:05 navaraf Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -44,14 +44,14 @@ const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = { 0x00, 0x80, 0x80, PC_SYS_USED }, { 0xc0, 0xc0, 0xc0, PC_SYS_USED }, { 0xc0, 0xdc, 0xc0, PC_SYS_USED }, - { 0xa6, 0xca, 0xf0, PC_SYS_USED }, + { 0xd4, 0xd0, 0xc7, PC_SYS_USED }, // ... c_min/2 dynamic colorcells // ... gap (for sparse palettes) // ... c_min/2 dynamic colorcells { 0xff, 0xfb, 0xf0, PC_SYS_USED }, - { 0xa0, 0xa0, 0xa4, PC_SYS_USED }, + { 0x3a, 0x6e, 0xa5, PC_SYS_USED }, { 0x80, 0x80, 0x80, PC_SYS_USED }, { 0xff, 0x00, 0x00, PC_SYS_USED }, { 0x00, 0xff, 0x00, PC_SYS_USED }, From e83551ae34f83225e142f4fa2a27983edfaee998 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 20:08:07 +0000 Subject: [PATCH 138/356] - Fixed duplicate color conversion in Bitfields/RGB -> Indexed case. svn path=/trunk/; revision=9937 --- reactos/subsys/win32k/eng/xlate.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index 9b60b2abaed..bcb8d019572 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.37 2004/06/28 17:03:35 navaraf Exp $ +/* $Id: xlate.c,v 1.38 2004/06/29 20:08:07 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -60,29 +60,17 @@ static ULONG FASTCALL ShiftAndMask(XLATEGDI *XlateGDI, ULONG Color) // Takes indexed palette and a ULONG STDCALL -ClosestColorMatch(XLATEGDI *XlateGDI, ULONG SourceColor, +ClosestColorMatch(XLATEGDI *XlateGDI, LPPALETTEENTRY SourceColor, PALETTEENTRY *DestColors, ULONG NumColors) { - LPPALETTEENTRY cSourceColor; LONG idx = 0; ULONG i; - ULONG SourceRGB; ULONG SourceRed, SourceGreen, SourceBlue; ULONG cxRed, cxGreen, cxBlue, rt, BestMatch = 16777215; - if (PAL_BITFIELDS == XlateGDI->XlateObj.iSrcType || PAL_BGR == XlateGDI->XlateObj.iSrcType) - { - /* FIXME: must use bitfields */ - SourceRGB = ShiftAndMask(XlateGDI, SourceColor); - cSourceColor = (LPPALETTEENTRY) &SourceRGB; - } - else - { - cSourceColor = (LPPALETTEENTRY)&SourceColor; - } - SourceRed = cSourceColor->peRed; - SourceGreen = cSourceColor->peGreen; - SourceBlue = cSourceColor->peBlue; + SourceRed = SourceColor->peRed; + SourceGreen = SourceColor->peGreen; + SourceBlue = SourceColor->peBlue; for (i=0; iNumColors; i++) { - TranslationTable[i] = ClosestColorMatch(XlateGDI, *((ULONG*)&PalSource->IndexedColors[i]), PalDest->IndexedColors, PalDest->NumColors); + TranslationTable[i] = ClosestColorMatch(XlateGDI, PalSource->IndexedColors + i, PalDest->IndexedColors, PalDest->NumColors); Trivial = Trivial && (TranslationTable[i] == i); } if (Trivial) @@ -425,7 +413,7 @@ XLATEOBJ_iXlate(XLATEOBJ *XlateObj, ULONG Color) Color = ShiftAndMask(XlateGDI, Color); /* Return closest match for the given color. */ - Closest = ClosestColorMatch(XlateGDI, Color, PalGDI->IndexedColors, PalGDI->NumColors); + Closest = ClosestColorMatch(XlateGDI, (LPPALETTEENTRY)&Color, PalGDI->IndexedColors, PalGDI->NumColors); PALETTE_UnlockPalette(XlateGDI->DestPal); return Closest; } From a4a1cb1b98f10a82def526567ce9859fcc709749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 29 Jun 2004 21:09:16 +0000 Subject: [PATCH 139/356] Use DIB bitfields to create palette at > 8 bpp svn path=/trunk/; revision=9939 --- reactos/subsys/win32k/objects/dc.c | 13 ++++++------- reactos/subsys/win32k/objects/dib.c | 14 +++++++------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index b2d994e29f7..23f235984df 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.140 2004/06/28 17:03:35 navaraf Exp $ +/* $Id: dc.c,v 1.141 2004/06/29 21:09:16 gvg Exp $ * * DC.C - Device context functions * @@ -1904,13 +1904,12 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) if(pb->dib->dsBmih.biBitCount == 8) { NumColors = 256; } dc->w.hPalette = PALETTE_AllocPaletteIndexedRGB(NumColors, pb->ColorMap); } - else if ( 16 == pb->dib->dsBmih.biBitCount ) + else { - dc->w.hPalette = PALETTE_AllocPalette(PAL_BITFIELDS, pb->dib->dsBmih.biClrUsed, NULL, 0x7c00, 0x03e0, 0x001f); - } - else if(pb->dib->dsBmih.biBitCount >= 24) - { - dc->w.hPalette = PALETTE_AllocPalette(PAL_RGB, pb->dib->dsBmih.biClrUsed, NULL, 0, 0, 0); + dc->w.hPalette = PALETTE_AllocPalette(PAL_BITFIELDS, 0, NULL, + pb->dib->dsBitfields[0], + pb->dib->dsBitfields[1], + pb->dib->dsBitfields[2]); } } else diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 1be558bf67e..1abf6123dbf 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.54 2004/06/28 17:03:35 navaraf Exp $ + * $Id: dib.c,v 1.55 2004/06/29 21:09:16 gvg Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -1115,15 +1115,15 @@ DIB_CreateDIBSection( dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 2) : 0x001f; break; case 24: - dib->dsBitfields[0] = 0xff; - dib->dsBitfields[1] = 0xff00; - dib->dsBitfields[2] = 0xff0000; + dib->dsBitfields[0] = 0xff0000; + dib->dsBitfields[1] = 0x00ff00; + dib->dsBitfields[2] = 0x0000ff; break; case 32: - dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ? *(DWORD *)bmi->bmiColors : 0xff; - dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 1) : 0xff00; - dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 2) : 0xff0000; + dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ? *(DWORD *)bmi->bmiColors : 0xff0000; + dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 1) : 0x00ff00; + dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ? *((DWORD *)bmi->bmiColors + 2) : 0x0000ff; break; } dib->dshSection = section; From 52b944e9fba28fd1bd63d9d526eb90263e9eea2f Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 29 Jun 2004 23:45:31 +0000 Subject: [PATCH 140/356] - Return correct ID for windowless timers in IntSetTimer. svn path=/trunk/; revision=9940 --- reactos/subsys/win32k/ntuser/timer.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/timer.c b/reactos/subsys/win32k/ntuser/timer.c index 26c783427d9..d15dd11a978 100644 --- a/reactos/subsys/win32k/ntuser/timer.c +++ b/reactos/subsys/win32k/ntuser/timer.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: timer.c,v 1.32 2004/05/10 17:07:18 weiden Exp $ +/* $Id: timer.c,v 1.33 2004/06/29 23:45:31 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -175,7 +175,6 @@ RemoveTimersWindow(HWND Wnd) UINT_PTR FASTCALL IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, BOOL SystemTimer) { - ULONG Index; PMSG_TIMER_ENTRY MsgTimer = NULL; PMSG_TIMER_ENTRY NewTimer; LARGE_INTEGER CurrentTime; @@ -190,15 +189,15 @@ IntSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc, B if((hWnd == NULL) && !SystemTimer) { /* find a free, window-less timer id */ - Index = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex); + nIDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex); - if(Index == (ULONG) -1) + if(nIDEvent == (UINT_PTR) -1) { IntUnLockTimerList(); return 0; } - HintIndex = ++Index; + HintIndex = ++nIDEvent; } else { @@ -302,7 +301,6 @@ IntKillTimer(HWND hWnd, UINT_PTR uIDEvent, BOOL SystemTimer) /* FIXME: set the last error */ return FALSE; } - RtlClearBits(&WindowLessTimersBitMap, uIDEvent - 1, 1); } else From 885e4ae102f1c1dcab7c27c836863111a9246218 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 30 Jun 2004 10:49:18 +0000 Subject: [PATCH 141/356] Define PSCB_BUTTONPRESSED. svn path=/trunk/; revision=9941 --- reactos/w32api/include/prsht.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/w32api/include/prsht.h b/reactos/w32api/include/prsht.h index 299834b68e0..004558980eb 100644 --- a/reactos/w32api/include/prsht.h +++ b/reactos/w32api/include/prsht.h @@ -60,6 +60,9 @@ extern "C" { #endif #define PSCB_INITIALIZED 1 #define PSCB_PRECREATE 2 +#if (_WIN32_IE >= 0x560) +#define PSCB_BUTTONPRESSED 3 +#endif /* _WIN32_IE >= 0x560 */ #define PSM_GETTABCONTROL 1140 #define PSM_GETCURRENTPAGEHWND 1142 #define PSM_ISDIALOGMESSAGE 1141 @@ -82,7 +85,7 @@ extern "C" { #define PSNRET_INVALID 1 #define PSNRET_INVALID_NOCHANGEPAGE 2 #define ID_PSRESTARTWINDOWS 2 -#define ID_PSREBOOTSYSTEM 3 +#define ID_PSREBOOTSYSTEM 3 #define WIZ_CXDLG 276 #define WIZ_CYDLG 140 #define WIZ_CXBMP 80 From 3845c9019c2ae69e306e45da994cc1f550ebd6b8 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 30 Jun 2004 10:53:05 +0000 Subject: [PATCH 142/356] - Apply patch by . - User w32api. - Fix some tchar issues. svn path=/trunk/; revision=9942 --- reactos/lib/cpl/sysdm/Makefile | 7 +++- reactos/lib/cpl/sysdm/advanced.c | 10 ++++- reactos/lib/cpl/sysdm/general.c | 8 ++-- reactos/lib/cpl/sysdm/hardware.c | 12 +++--- reactos/lib/cpl/sysdm/resource.h | 18 ++++++++- reactos/lib/cpl/sysdm/sysdm.c | 27 ++++++------- reactos/lib/cpl/sysdm/sysdm.h | 14 ++++++- reactos/lib/cpl/sysdm/sysdm.rc | 59 +++++++++++++++++++++++++---- reactos/lib/cpl/sysdm/userprofile.c | 48 +++++++++++++++++++++++ 9 files changed, 168 insertions(+), 35 deletions(-) create mode 100644 reactos/lib/cpl/sysdm/userprofile.c diff --git a/reactos/lib/cpl/sysdm/Makefile b/reactos/lib/cpl/sysdm/Makefile index 20f88d4b9b8..6a480a0811f 100644 --- a/reactos/lib/cpl/sysdm/Makefile +++ b/reactos/lib/cpl/sysdm/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.2 2004/05/29 21:24:43 hbirr Exp $ +# $Id: Makefile,v 1.3 2004/06/30 10:53:05 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -13,10 +13,13 @@ TARGET_INSTALLDIR = system32 TARGET_BASE = $(TARGET_BASE_LIB_CPL_SYSDM) TARGET_CFLAGS = \ + -D_WIN32_IE=0x0600 \ + -D_WIN32_WINNT=0x0501 \ -I./include \ -DUNICODE \ -D_UNICODE \ -D__REACTOS__ \ + -D__USE_W32API \ -Wall \ -Werror \ -fno-builtin @@ -31,7 +34,7 @@ TARGET_PCH = TARGET_CLEAN = -TARGET_OBJECTS = sysdm.o general.o computer.o hardware.o advanced.o +TARGET_OBJECTS = sysdm.o general.o computer.o hardware.o advanced.o userprofile.o DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/lib/cpl/sysdm/advanced.c b/reactos/lib/cpl/sysdm/advanced.c index 8cd77a88735..c21c1b34c35 100644 --- a/reactos/lib/cpl/sysdm/advanced.c +++ b/reactos/lib/cpl/sysdm/advanced.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: advanced.c,v 1.1 2004/03/08 14:24:47 weiden Exp $ +/* $Id: advanced.c,v 1.2 2004/06/30 10:53:05 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/advanced.c @@ -27,6 +27,8 @@ */ #include #include +#include + #include "resource.h" #include "sysdm.h" @@ -39,10 +41,14 @@ AdvancedPageProc( LPARAM lParam ) { - switch(uMsg) + switch (uMsg) { case WM_INITDIALOG: break; + + case WM_COMMAND: + break; + } return FALSE; } diff --git a/reactos/lib/cpl/sysdm/general.c b/reactos/lib/cpl/sysdm/general.c index 50889de8b41..9d8b1375730 100644 --- a/reactos/lib/cpl/sysdm/general.c +++ b/reactos/lib/cpl/sysdm/general.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: general.c,v 1.1 2004/03/08 14:24:47 weiden Exp $ +/* $Id: general.c,v 1.2 2004/06/30 10:53:05 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/general.c @@ -26,21 +26,23 @@ * 03-04-2004 Created */ #include +#include #include + #include "resource.h" #include "sysdm.h" void ShowLastWin32Error(HWND hWndOwner) { - LPWSTR lpMsg; + LPTSTR lpMsg; DWORD LastError; LastError = GetLastError(); if((LastError == 0) || !FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, LastError, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPWSTR)&lpMsg, 0, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&lpMsg, 0, NULL)) { return; diff --git a/reactos/lib/cpl/sysdm/hardware.c b/reactos/lib/cpl/sysdm/hardware.c index ef329b3b299..eb56423357e 100644 --- a/reactos/lib/cpl/sysdm/hardware.c +++ b/reactos/lib/cpl/sysdm/hardware.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: hardware.c,v 1.1 2004/03/08 14:24:47 weiden Exp $ +/* $Id: hardware.c,v 1.2 2004/06/30 10:53:05 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/hardware.c @@ -27,17 +27,19 @@ */ #include #include +#include + #include "resource.h" #include "sysdm.h" -typedef WINBOOL (STDCALL *PDEVMGREXEC)(HWND hWndParent, HINSTANCE hInst, PVOID Unknown, int nCmdShow); +typedef BOOL (STDCALL *PDEVMGREXEC)(HWND hWndParent, HINSTANCE hInst, PVOID Unknown, int nCmdShow); BOOL LaunchDeviceManager(HWND hWndParent) { HMODULE hDll; PDEVMGREXEC DevMgrExec; BOOL Ret; - - if(!(hDll = LoadLibrary(L"devmgr.dll"))) + + if(!(hDll = LoadLibrary(_TEXT("devmgr.dll")))) { return FALSE; } @@ -68,7 +70,7 @@ HardwarePageProc( case WM_COMMAND: switch(LOWORD(wParam)) { - case IDC_DEVMGR: + case IDC_HARDWARE_DEVICE_MANAGER: if(!LaunchDeviceManager(hwndDlg)) { /* FIXME */ diff --git a/reactos/lib/cpl/sysdm/resource.h b/reactos/lib/cpl/sysdm/resource.h index c6650a917d9..a6f4ff1bc87 100644 --- a/reactos/lib/cpl/sysdm/resource.h +++ b/reactos/lib/cpl/sysdm/resource.h @@ -19,7 +19,8 @@ #define IDD_PROPPAGEGENERAL 100 #define IDD_PROPPAGECOMPUTER 101 #define IDD_PROPPAGEHARDWARE 102 -#define IDD_PROPPAGEADVANCED 103 +#define IDD_PROPPAGEUSERPROFILE 103 +#define IDD_PROPPAGEADVANCED 104 #define IDS_CPLSYSTEMNAME 1001 #define IDS_CPLSYSTEMDESCRIPTION 2001 @@ -31,8 +32,23 @@ #define IDC_PROCESSORSPEED 104 #define IDC_SYSTEMMEMORY 105 #define IDC_DEVMGR 106 +#define IDC_ENVVAR 107 +#define IDC_STAREC 108 #define IDC_ICON1 201 +#define IDC_COMPUTERNAME 202 +#define IDC_WORKGROUPDOMAIN_NAME 203 +#define IDC_WORKGROUPDOMAIN 204 +#define IDC_NETWORK_ID 205 +#define IDC_NETWORK_PROPERTY 206 +#define IDC_HARDWARE_WIZARD 207 +#define IDC_HARDWARE_PROFILE 210 +#define IDC_HARDWARE_DRIVER_SIGN 211 +#define IDC_HARDWARE_DEVICE_MANAGER 212 +#define IDC_USERPROFILE_DELETE 213 +#define IDC_USERPROFILE_CHANGE 214 +#define IDC_USERPROFILE_COPY 215 + #endif /* __CPL_RESOURCE_H */ /* EOF */ diff --git a/reactos/lib/cpl/sysdm/sysdm.c b/reactos/lib/cpl/sysdm/sysdm.c index 08ab7509ff8..a786ae656b9 100644 --- a/reactos/lib/cpl/sysdm/sysdm.c +++ b/reactos/lib/cpl/sysdm/sysdm.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: sysdm.c,v 1.1 2004/03/08 14:24:47 weiden Exp $ +/* $Id: sysdm.c,v 1.2 2004/06/30 10:53:05 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/sysdm.c @@ -26,17 +26,17 @@ * 03-04-2004 Created */ #include +#include +#include +#include #include + #include "resource.h" #include "sysdm.h" #define NUM_APPLETS (1) LONG CALLBACK SystemApplet(VOID); -BOOL CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -BOOL CALLBACK ComputerPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -BOOL CALLBACK HardwarePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -BOOL CALLBACK AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); HINSTANCE hApplet = 0; /* Applets */ @@ -52,7 +52,7 @@ InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) psp->dwSize = sizeof(PROPSHEETPAGE); psp->dwFlags = PSP_DEFAULT; psp->hInstance = hApplet; - psp->u1.pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pszTemplate = MAKEINTRESOURCE(idDlg); psp->pfnDlgProc = DlgProc; } @@ -93,7 +93,7 @@ PropSheetProc( LONG CALLBACK SystemApplet(VOID) { - PROPSHEETPAGE psp[4]; + PROPSHEETPAGE psp[5]; PROPSHEETHEADER psh; TCHAR Caption[1024]; @@ -101,20 +101,21 @@ SystemApplet(VOID) ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE; + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; /* | PSH_USECALLBACK */ psh.hwndParent = NULL; psh.hInstance = hApplet; - psh.u1.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); + psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); psh.pszCaption = Caption; psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); - psh.u2.nStartPage = 0; - psh.u3.ppsp = psp; - psh.pfnCallback = PropSheetProc; + psh.nStartPage = 0; + psh.ppsp = psp; + psh.pfnCallback = NULL; /* PropSheetProc; */ InitPropSheetPage(&psp[0], IDD_PROPPAGEGENERAL, GeneralPageProc); InitPropSheetPage(&psp[1], IDD_PROPPAGECOMPUTER, ComputerPageProc); InitPropSheetPage(&psp[2], IDD_PROPPAGEHARDWARE, HardwarePageProc); - InitPropSheetPage(&psp[3], IDD_PROPPAGEADVANCED, AdvancedPageProc); + InitPropSheetPage(&psp[3], IDD_PROPPAGEUSERPROFILE, UserProfilePageProc); + InitPropSheetPage(&psp[4], IDD_PROPPAGEADVANCED, AdvancedPageProc); return (LONG)(PropertySheet(&psh) != -1); } diff --git a/reactos/lib/cpl/sysdm/sysdm.h b/reactos/lib/cpl/sysdm/sysdm.h index 0640f5fd283..0fc26155f9d 100644 --- a/reactos/lib/cpl/sysdm/sysdm.h +++ b/reactos/lib/cpl/sysdm/sysdm.h @@ -1,20 +1,30 @@ #ifndef __CPL_SYSDM_H #define __CPL_SYSDM_H -typedef LONG (CALLBACK *APPLET_PROC)(VOID); +typedef LONG (CALLBACK *APPLET_INITPROC)(VOID); typedef struct { int idIcon; int idName; int idDescription; - APPLET_PROC AppletProc; + APPLET_INITPROC AppletProc; } APPLET, *PAPPLET; extern HINSTANCE hApplet; void ShowLastWin32Error(HWND hWndOwner); +BOOL CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK ComputerPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK HardwarePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK UserProfilePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + + +//BOOL CALLBACK EnvironmentDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + + #endif /* __CPL_SYSDM_H */ /* EOF */ diff --git a/reactos/lib/cpl/sysdm/sysdm.rc b/reactos/lib/cpl/sysdm/sysdm.rc index 64a2fba81c6..a47bcd20ba3 100644 --- a/reactos/lib/cpl/sysdm/sysdm.rc +++ b/reactos/lib/cpl/sysdm/sysdm.rc @@ -1,5 +1,6 @@ #include #include +#include #include "resource.h" LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT @@ -61,21 +62,54 @@ END IDD_PROPPAGECOMPUTER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Computer Name" +CAPTION "Network Identification" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - /* LTEXT "Property Page 2",-1,73,74,90,8 */ + ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING,LABELLINE(1)-5, ICONSIZE, ICONSIZE, SS_ICON + LTEXT "Windows uses the following information to identify your computer on the network.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(1)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + LTEXT "Full computer name:",-1,PROPSHEETPADDING,LABELLINE(4)-4,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(4)-4 + LTEXT "",IDC_COMPUTERNAME,90,LABELLINE(4)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(4)-5 + LTEXT "Workgroup:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING,LABELLINE(6)-6,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(6)-6 + LTEXT "",IDC_WORKGROUPDOMAIN_NAME,90,LABELLINE(6)-6,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(6)-6 + LTEXT "To use the Network Identfication Wizard to join a domain and create a local user, click Network ID.",-1,PROPSHEETPADDING,LABELLINE(7)+5,PROPSHEETWIDTH-(12*PROPSHEETPADDING)-ICONSIZE,LABELLINE(8)+5 + PUSHBUTTON "&Network ID",IDC_NETWORK_ID,185,LABELLINE(7)+5,54,LABELLINE(1)+4 + LTEXT "To rename this computer or join a domain, click Properties.",-1,PROPSHEETPADDING,LABELLINE(11)+2,PROPSHEETWIDTH-(12*PROPSHEETPADDING)-ICONSIZE,LABELLINE(12)+2 + PUSHBUTTON "&Properties",IDC_NETWORK_PROPERTY,185,LABELLINE(11)+2,54,LABELLINE(1)+4 END IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Hardware" FONT 8, "MS Shell Dlg", 0, 0, 0x0 -BEGIN - GROUPBOX "Hardware Devices",-1,PROPSHEETPADDING,PROPSHEETPADDING,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING +BEGIN + GROUPBOX "Hardware Wizard",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + LTEXT "The Hardware wizard helps you install, uninstall, repair, unplug, eject, and configure your hardware.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(2), ICONSIZE, ICONSIZE, SS_ICON - LTEXT "The Device Manager lists all the hardware devices that are installed on your computer. Use the Device Manger to change their settings.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) - PUSHBUTTON "&Device Manager",IDC_DEVMGR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Hardware Wizard",IDC_HARDWARE_WIZARD,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + + GROUPBOX "Device Manager",-1,PROPSHEETPADDING,LABELLINE(8)+5,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(7)+2 + ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(10)-3,ICONSIZE, ICONSIZE, SS_ICON + LTEXT "The Device Manager lists all the hardware devices installed on your computer. Use the Device Manager to change the properties of any device.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(10)-3,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + + PUSHBUTTON "&Device Manager",IDC_HARDWARE_DEVICE_MANAGER,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(13)+2,(15*PROPSHEETPADDING),14 + + GROUPBOX "Hardware Profiles",-1,PROPSHEETPADDING,LABELLINE(16)+3,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(18)-5, ICONSIZE, ICONSIZE, SS_ICON + LTEXT "Hardware profiles provide a way for you to set up and store different hardware configurations.",0,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(18)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + PUSHBUTTON "&Hardware Profiles",IDC_HARDWARE_PROFILE,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(20)+2,(15*PROPSHEETPADDING),14 +END + +IDD_PROPPAGEUSERPROFILE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "User Profiles" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING,LABELLINE(1), ICONSIZE, ICONSIZE, SS_ICON + LTEXT "User profiles contain desktop settings and other information related to your login. A different profile can be created on each computer you use, or you can select a roaming profile that is the same on every computer you use.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(1),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(4) + LTEXT "Profiles stored on this computer:",-1,PROPSHEETPADDING,LABELLINE(6),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(6) + PUSHBUTTON "Delete",IDC_USERPROFILE_DELETE,PROPSHEETPADDING,LABELLINE(23),60,LABELLINE(1)+2 + PUSHBUTTON "Change Type",IDC_USERPROFILE_CHANGE,95,LABELLINE(23),60,LABELLINE(1)+2 + PUSHBUTTON "Copy To",IDC_USERPROFILE_COPY,180,LABELLINE(23),60,LABELLINE(1)+2 END IDD_PROPPAGEADVANCED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -83,7 +117,18 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Advanced" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - /* LTEXT "Property Page 4",-1,73,74,90,8 */ + GROUPBOX "Performance",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(2), ICONSIZE, ICONSIZE, SS_ICON + LTEXT "Performance options control how applications use memory, which affects the speed of your computer.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + PUSHBUTTON "&Performance Options",IDC_ENVVAR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + GROUPBOX "Environment Variables",-1,PROPSHEETPADDING,LABELLINE(8)+2,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(10)-5, ICONSIZE, ICONSIZE, SS_ICON + LTEXT "Environment variables tell your computer where to find certain types of information.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(10)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(11) + PUSHBUTTON "&Environment Variables",IDC_ENVVAR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(12)+2,(15*PROPSHEETPADDING),14 + GROUPBOX "Startup and Recovery",-1,PROPSHEETPADDING,LABELLINE(15)+3,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(17)-5, ICONSIZE, ICONSIZE, SS_ICON + LTEXT "Startup and recovery options tell your computer how to start and what to do if an error causes your computer to stop.",0,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(17)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + PUSHBUTTON "&Startup and Recovery",IDC_STAREC,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(19)+2,(15*PROPSHEETPADDING),14 END STRINGTABLE diff --git a/reactos/lib/cpl/sysdm/userprofile.c b/reactos/lib/cpl/sysdm/userprofile.c new file mode 100644 index 00000000000..fd2425f7702 --- /dev/null +++ b/reactos/lib/cpl/sysdm/userprofile.c @@ -0,0 +1,48 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: userprofile.c,v 1.1 2004/06/30 10:53:05 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/computer.c + * PURPOSE: Computer settings for networking + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include "resource.h" +#include "sysdm.h" + +/* Property page dialog callback */ +BOOL CALLBACK +UserProfilePageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; //GetUserName + } + return FALSE; +} From e4d51272bee82a9cd84754187c691ab67d224e1f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 30 Jun 2004 12:11:11 +0000 Subject: [PATCH 143/356] Use w32api. svn path=/trunk/; revision=9944 --- reactos/lib/cpl/appwiz/Makefile | 8 +- reactos/lib/cpl/appwiz/appwiz.c | 376 ++++++++++++++++-------------- reactos/lib/cpl/appwiz/appwiz.rc | 1 - reactos/lib/cpl/control/Makefile | 13 +- reactos/lib/cpl/control/control.c | 12 +- 5 files changed, 222 insertions(+), 188 deletions(-) diff --git a/reactos/lib/cpl/appwiz/Makefile b/reactos/lib/cpl/appwiz/Makefile index dead14f0e90..28d6a098113 100644 --- a/reactos/lib/cpl/appwiz/Makefile +++ b/reactos/lib/cpl/appwiz/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1 2004/06/18 20:43:44 kuehng Exp $ +# $Id: Makefile,v 1.2 2004/06/30 12:11:11 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -13,16 +13,22 @@ TARGET_INSTALLDIR = system32 TARGET_BASE = $(TARGET_BASE_LIB_CPL_SYSDM) TARGET_CFLAGS = \ + -D_WIN32_IE=0x0600 \ + -D_WIN32_WINNT=0x0501 \ -I./include \ -DUNICODE \ -D_UNICODE \ -D__REACTOS__ \ + -D__USE_W32API \ -Wall \ -Werror \ -fno-builtin TARGET_LFLAGS = -nostartfiles + +TARGET_LFLAGS = -nostartfiles + TARGET_SDKLIBS = kernel32.a user32.a comctl32.a TARGET_GCCLIBS = gcc diff --git a/reactos/lib/cpl/appwiz/appwiz.c b/reactos/lib/cpl/appwiz/appwiz.c index 72ccb8315f8..c33f6c35a3b 100644 --- a/reactos/lib/cpl/appwiz/appwiz.c +++ b/reactos/lib/cpl/appwiz/appwiz.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: appwiz.c,v 1.1 2004/06/18 20:43:44 kuehng Exp $ +/* $Id: appwiz.c,v 1.2 2004/06/30 12:11:11 ekohl Exp $ * * PROJECT: ReactOS Software Control Panel * FILE: lib/cpl/system/appwiz.c @@ -26,21 +26,15 @@ * 06-17-2004 Created */ +#include +#include +#include + #include #include #include #include -#include - -#ifdef _MSC_VER -#include -#include -#endif - -#include -#include #include -#include #include "resource.h" #include "appwiz.h" @@ -55,124 +49,162 @@ HINSTANCE hApplet = 0; /* Applets */ APPLET Applets[NUM_APPLETS] = { - {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet} + {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet} }; -void CallUninstall(HWND hwndDlg) + +static VOID +CallUninstall(HWND hwndDlg) { - int nIndex; - nIndex = SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_GETCURSEL,0,0); - if(nIndex == -1) - MessageBox(hwndDlg,L"No item selected",L"Error",MB_ICONSTOP); - else { - HKEY hKey; - DWORD dwType = REG_SZ; - TCHAR pszUninstallString[MAX_PATH]; - DWORD dwSize = MAX_PATH; - hKey = (HKEY)SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_GETITEMDATA,(WPARAM)nIndex,0); - if(RegQueryValueEx(hKey,L"UninstallString",NULL,&dwType,(BYTE*)pszUninstallString,&dwSize)==ERROR_SUCCESS) - { - STARTUPINFO si; - PROCESS_INFORMATION pi; - memset(&si,0x00,sizeof(si)); - si.cb = sizeof(si); - si.wShowWindow = SW_SHOW; - if(CreateProcess(NULL,pszUninstallString,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) - { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } else { - MessageBox(hwndDlg,L"Unable to read UninstallString. This entry is invalid or has been created by an MSI installer.",L"Error",MB_ICONSTOP); - } - } + STARTUPINFO si; + PROCESS_INFORMATION pi; + int nIndex; + HKEY hKey; + DWORD dwType; + TCHAR pszUninstallString[MAX_PATH]; + DWORD dwSize; + + nIndex = SendDlgItemMessage(hwndDlg, IDC_SOFTWARELIST, LB_GETCURSEL, 0, 0); + if (nIndex == -1) + { + MessageBox(hwndDlg, + _TEXT("No item selected"), + _TEXT("Error"), + MB_ICONSTOP); + } + else + { + hKey = (HKEY)SendDlgItemMessage(hwndDlg, IDC_SOFTWARELIST, LB_GETITEMDATA, (WPARAM)nIndex, 0); + + dwType = REG_SZ; + dwSize = MAX_PATH; + if (RegQueryValueEx(hKey, + _TEXT("UninstallString"), + NULL, + &dwType, + (LPBYTE)pszUninstallString, + &dwSize) == ERROR_SUCCESS) + { + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.wShowWindow = SW_SHOW; + if (CreateProcess(NULL,pszUninstallString,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) + { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + else + { + MessageBox(hwndDlg, + _TEXT("Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."), + _TEXT("Error"), + MB_ICONSTOP); + } + } } + /* Property page dialog callback */ -BOOL CALLBACK InstallPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) +static BOOL CALLBACK +InstallPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { - switch(uMsg) - { + TCHAR pszName[MAX_PATH]; + TCHAR pszDisplayName[MAX_PATH]; + FILETIME FileTime; + HKEY hKey; + HKEY hSubKey; + DWORD dwType; + DWORD dwSize; + int i; + ULONG index; + + switch (uMsg) + { case WM_INITDIALOG: - { - HKEY hKey; - int i=0; - TCHAR pszName[MAX_PATH]; - FILETIME FileTime; - DWORD dwSize = MAX_PATH; - EnableWindow(GetDlgItem(hwndDlg,IDC_INSTALL),FALSE); - if(RegOpenKey(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",&hKey)!=ERROR_SUCCESS) { - MessageBox(hwndDlg,L"Unable to open Uninstall Key",L"Error",MB_ICONSTOP); - return FALSE; - } - while(RegEnumKeyEx(hKey,i,pszName,&dwSize,NULL,NULL,NULL,&FileTime)==ERROR_SUCCESS) - { - HKEY hSubKey; - if(RegOpenKey(hKey,pszName,&hSubKey)==ERROR_SUCCESS) - { - DWORD dwType = REG_SZ; - TCHAR pszDisplayName[MAX_PATH]; - DWORD dwSize = MAX_PATH; - ULONG index; - if(RegQueryValueEx(hSubKey,L"DisplayName",NULL,&dwType,(BYTE*)pszDisplayName,&dwSize)==ERROR_SUCCESS) - { - index = SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_ADDSTRING,0,(LPARAM)pszDisplayName); - SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_SETITEMDATA,index,(LPARAM)hSubKey); - } - } - - dwSize = MAX_PATH; - i++; - } - RegCloseKey(hKey); - break; - } - break; - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDC_SOFTWARELIST: - if(HIWORD(wParam)==LBN_DBLCLK) - { - CallUninstall(hwndDlg); - } - break; - - case IDC_ADDREMOVE: - CallUninstall(hwndDlg); - break; - } - break; - } - return FALSE; + EnableWindow(GetDlgItem(hwndDlg,IDC_INSTALL), FALSE); + if (RegOpenKey(HKEY_LOCAL_MACHINE, + _TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"), + &hKey) != ERROR_SUCCESS) + { + MessageBox(hwndDlg, + _TEXT("Unable to open Uninstall Key"), + _TEXT("Error"), + MB_ICONSTOP); + return FALSE; + } + + i = 0; + dwSize = MAX_PATH; + while (RegEnumKeyEx (hKey, i, pszName, &dwSize, NULL, NULL, NULL, &FileTime) == ERROR_SUCCESS) + { + if (RegOpenKey(hKey,pszName,&hSubKey)==ERROR_SUCCESS) + { + dwType = REG_SZ; + dwSize = MAX_PATH; + if (RegQueryValueEx(hSubKey, + _TEXT("DisplayName"), + NULL, + &dwType, + (LPBYTE)pszDisplayName, + &dwSize) == ERROR_SUCCESS) + { + index = SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_ADDSTRING,0,(LPARAM)pszDisplayName); + SendDlgItemMessage(hwndDlg,IDC_SOFTWARELIST,LB_SETITEMDATA,index,(LPARAM)hSubKey); + } + } + + dwSize = MAX_PATH; + i++; + } + + RegCloseKey(hKey); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_SOFTWARELIST: + if (HIWORD(wParam) == LBN_DBLCLK) + { + CallUninstall(hwndDlg); + } + break; + + case IDC_ADDREMOVE: + CallUninstall(hwndDlg); + break; + } + break; + } + + return FALSE; } + /* Property page dialog callback */ -BOOL CALLBACK RosPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) +static BOOL CALLBACK +RosPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { - switch(uMsg) - { + switch(uMsg) + { case WM_INITDIALOG: - { - - break; - } - } - return FALSE; + break; + } + + return FALSE; } -static void InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) + +static VOID +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) { - ZeroMemory(psp, sizeof(PROPSHEETPAGE)); - psp->dwSize = sizeof(PROPSHEETPAGE); - psp->dwFlags = PSP_DEFAULT; - psp->hInstance = hApplet; -#ifdef _MSC_VER - psp->pszTemplate = MAKEINTRESOURCE(idDlg); -#else - psp->u1.pszTemplate = MAKEINTRESOURCE(idDlg); -#endif - psp->pfnDlgProc = DlgProc; + ZeroMemory(psp, sizeof(PROPSHEETPAGE)); + psp->dwSize = sizeof(PROPSHEETPAGE); + psp->dwFlags = PSP_DEFAULT; + psp->hInstance = hApplet; + psp->pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pfnDlgProc = DlgProc; } @@ -181,83 +213,73 @@ static void InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) LONG CALLBACK SystemApplet(VOID) { - PROPSHEETPAGE psp[2]; - PROPSHEETHEADER psh; - TCHAR Caption[1024]; - - LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR)); - - ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); - psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; - psh.hwndParent = NULL; - psh.hInstance = hApplet; -#ifdef _MSC_VER - psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); -#else - psh.u1.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); -#endif - psh.pszCaption = Caption; - psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); -#ifdef _MSC_VER - psh.nStartPage = 0; - psh.ppsp = psp; -#else - psh.u2.nStartPage = 0; - psh.u3.ppsp = psp; -#endif - psh.pfnCallback = NULL; - + PROPSHEETPAGE psp[2]; + PROPSHEETHEADER psh; + TCHAR Caption[1024]; - InitPropSheetPage(&psp[0], IDD_PROPPAGEINSTALL, InstallPageProc); - InitPropSheetPage(&psp[1], IDD_PROPPAGEROSSETUP, RosPageProc); - - return (LONG)(PropertySheet(&psh) != -1); + LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR)); + + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; + psh.hwndParent = NULL; + psh.hInstance = hApplet; + psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); + psh.pszCaption = Caption; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); + psh.nStartPage = 0; + psh.ppsp = psp; + psh.pfnCallback = NULL; + + InitPropSheetPage(&psp[0], IDD_PROPPAGEINSTALL, InstallPageProc); + InitPropSheetPage(&psp[1], IDD_PROPPAGEROSSETUP, RosPageProc); + + return (LONG)(PropertySheet(&psh) != -1); } + /* Control Panel Callback */ -LONG CALLBACK CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +LONG CALLBACK +CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { - int i = (int)lParam1; - - switch(uMsg) - { + CPLINFO *CPlInfo; + DWORD i; + + i = (DWORD)lParam1; + switch(uMsg) + { case CPL_INIT: - { - return TRUE; - } + return TRUE; + case CPL_GETCOUNT: - { - return NUM_APPLETS; - } + return NUM_APPLETS; + case CPL_INQUIRE: - { - CPLINFO *CPlInfo = (CPLINFO*)lParam2; - CPlInfo->lData = 0; - CPlInfo->idIcon = Applets[i].idIcon; - CPlInfo->idName = Applets[i].idName; - CPlInfo->idInfo = Applets[i].idDescription; - break; - } + CPlInfo = (CPLINFO*)lParam2; + CPlInfo->lData = 0; + CPlInfo->idIcon = Applets[i].idIcon; + CPlInfo->idName = Applets[i].idName; + CPlInfo->idInfo = Applets[i].idDescription; + break; + case CPL_DBLCLK: - { - Applets[i].AppletProc(); - break; - } - } - return FALSE; + Applets[i].AppletProc(); + break; + } + + return FALSE; } -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) { - switch(dwReason) - { + switch(dwReason) + { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: - hApplet = hinstDLL; - break; - } - return TRUE; + hApplet = hinstDLL; + break; + } + return TRUE; } - diff --git a/reactos/lib/cpl/appwiz/appwiz.rc b/reactos/lib/cpl/appwiz/appwiz.rc index 4eec9a01551..485a020b9b5 100644 --- a/reactos/lib/cpl/appwiz/appwiz.rc +++ b/reactos/lib/cpl/appwiz/appwiz.rc @@ -49,7 +49,6 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Install/Uninstall" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,18,16,16 LTEXT "To install a new program, click Install",-1,36,18,PROPSHEETWIDTH-48,8 PUSHBUTTON "&Install...", IDC_INSTALL, PROPSHEETWIDTH-(72), 36, 60, 14 diff --git a/reactos/lib/cpl/control/Makefile b/reactos/lib/cpl/control/Makefile index 7a70cb49e6e..1ad6360f659 100644 --- a/reactos/lib/cpl/control/Makefile +++ b/reactos/lib/cpl/control/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.2 2004/06/29 12:03:56 ekohl Exp $ +# $Id: Makefile,v 1.3 2004/06/30 12:10:12 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -10,7 +10,16 @@ TARGET_INSTALLDIR = system32 TARGET_APPTYPE = windows -TARGET_CFLAGS = -D_UNICODE -DUNICODE +TARGET_CFLAGS = \ + -D_WIN32_IE=0x0600 \ + -D_WIN32_WINNT=0x0501 \ + -DUNICODE \ + -D_UNICODE \ + -D__REACTOS__ \ + -D__USE_W32API \ + -Wall \ + -Werror \ + -fno-builtin TARGET_SDKLIBS = kernel32.a user32.a comctl32.a diff --git a/reactos/lib/cpl/control/control.c b/reactos/lib/cpl/control/control.c index 3b35fd6abc6..d10ad031ec4 100644 --- a/reactos/lib/cpl/control/control.c +++ b/reactos/lib/cpl/control/control.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: control.c,v 1.3 2004/06/29 12:03:56 ekohl Exp $ +/* $Id: control.c,v 1.4 2004/06/30 12:10:12 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/control.c @@ -26,16 +26,14 @@ * UPDATE HISTORY: * 06-13-2004 Created */ +#include +#include +#include + #include #include #include #include -#include - -#ifdef _MSC_VER -#include -#include -#endif #include "resource.h" From c9ad0dddb4d50ebde891ac8570bdb004b032293e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 30 Jun 2004 12:16:27 +0000 Subject: [PATCH 144/356] - Add accessibility control panel. Patch by - Use w32api. - Add control panel icon. svn path=/trunk/; revision=9945 --- reactos/lib/cpl/access/Makefile | 49 ++++++++ reactos/lib/cpl/access/access.c | 182 ++++++++++++++++++++++++++++++ reactos/lib/cpl/access/access.def | 6 + reactos/lib/cpl/access/access.edf | 6 + reactos/lib/cpl/access/access.h | 20 ++++ reactos/lib/cpl/access/access.rc | 144 +++++++++++++++++++++++ reactos/lib/cpl/access/display.c | 64 +++++++++++ reactos/lib/cpl/access/general.c | 84 ++++++++++++++ reactos/lib/cpl/access/keyboard.c | 85 ++++++++++++++ reactos/lib/cpl/access/mouse.c | 64 +++++++++++ reactos/lib/cpl/access/resource.h | 51 +++++++++ reactos/lib/cpl/access/sound.c | 68 +++++++++++ 12 files changed, 823 insertions(+) create mode 100644 reactos/lib/cpl/access/Makefile create mode 100644 reactos/lib/cpl/access/access.c create mode 100644 reactos/lib/cpl/access/access.def create mode 100644 reactos/lib/cpl/access/access.edf create mode 100644 reactos/lib/cpl/access/access.h create mode 100644 reactos/lib/cpl/access/access.rc create mode 100644 reactos/lib/cpl/access/display.c create mode 100644 reactos/lib/cpl/access/general.c create mode 100644 reactos/lib/cpl/access/keyboard.c create mode 100644 reactos/lib/cpl/access/mouse.c create mode 100644 reactos/lib/cpl/access/resource.h create mode 100644 reactos/lib/cpl/access/sound.c diff --git a/reactos/lib/cpl/access/Makefile b/reactos/lib/cpl/access/Makefile new file mode 100644 index 00000000000..a85b852b5d4 --- /dev/null +++ b/reactos/lib/cpl/access/Makefile @@ -0,0 +1,49 @@ +# $Id: Makefile,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = dynlink + +TARGET_EXTENSION = .cpl + +TARGET_NAME = access + +TARGET_INSTALLDIR = system32 + +TARGET_BASE = 0x58760000 + +TARGET_CFLAGS = \ + -D_WIN32_IE=0x0600 \ + -D_WIN32_WINNT=0x0501 \ + -DUNICODE \ + -D_UNICODE \ + -D__REACTOS__ \ + -D__USE_W32API \ + -Wall \ + -Werror \ + -fno-builtin + +TARGET_LFLAGS = -nostartfiles + +TARGET_SDKLIBS = kernel32.a user32.a comctl32.a + +TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = keyboard.o sound.o display.o mouse.o general.o access.o + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +include $(TOOLS_PATH)/depend.mk + +%/TAGS: + etags -o $(@D)/TAGS $(@D)/\*.c + +etags: ./TAGS diff --git a/reactos/lib/cpl/access/access.c b/reactos/lib/cpl/access/access.c new file mode 100644 index 00000000000..69de779a790 --- /dev/null +++ b/reactos/lib/cpl/access/access.c @@ -0,0 +1,182 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: access.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/sysdm.c + * PURPOSE: ReactOS System Control Panel + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include + +#include + +#include "resource.h" +#include "access.h" + +#define NUM_APPLETS (1) + +LONG CALLBACK SystemApplet(VOID); +BOOL CALLBACK DisplayPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK KeyboardPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK MousePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK SoundPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +HINSTANCE hApplet = 0; + +/* Applets */ +APPLET Applets[NUM_APPLETS] = +{ + {IDI_CPLACCESS, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet} +}; + +static void +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) +{ + ZeroMemory(psp, sizeof(PROPSHEETPAGE)); + psp->dwSize = sizeof(PROPSHEETPAGE); + psp->dwFlags = PSP_DEFAULT; + psp->hInstance = hApplet; + psp->pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pfnDlgProc = DlgProc; +} + +/* Property Sheet Callback */ +int CALLBACK +PropSheetProc( + HWND hwndDlg, + UINT uMsg, + LPARAM lParam +) +{ + switch(uMsg) + { + case PSCB_BUTTONPRESSED: + switch(lParam) + { + case PSBTN_OK: /* OK */ + break; + case PSBTN_CANCEL: /* Cancel */ + break; + case PSBTN_APPLYNOW: /* Apply now */ + break; + case PSBTN_FINISH: /* Close */ + break; + default: + return FALSE; + } + break; + + case PSCB_INITIALIZED: + break; + } + return TRUE; +} + +/* First Applet */ + +LONG CALLBACK +SystemApplet(VOID) +{ + PROPSHEETPAGE psp[5]; + PROPSHEETHEADER psh; + TCHAR Caption[1024]; + + LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR)); + + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE; + psh.hwndParent = NULL; + psh.hInstance = hApplet; + psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLACCESS)); + psh.pszCaption = Caption; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); + psh.nStartPage = 0; + psh.ppsp = psp; + psh.pfnCallback = PropSheetProc; + + InitPropSheetPage(&psp[0], IDD_PROPPAGEKEYBOARD, KeyboardPageProc); + InitPropSheetPage(&psp[1], IDD_PROPPAGESOUND, SoundPageProc); + InitPropSheetPage(&psp[2], IDD_PROPPAGEDISPLAY, DisplayPageProc); + InitPropSheetPage(&psp[3], IDD_PROPPAGEMOUSE, MousePageProc); + InitPropSheetPage(&psp[4], IDD_PROPPAGEGENERAL, GeneralPageProc); + + return (LONG)(PropertySheet(&psh) != -1); +} + +/* Control Panel Callback */ +LONG CALLBACK +CPlApplet( + HWND hwndCPl, + UINT uMsg, + LPARAM lParam1, + LPARAM lParam2) +{ + int i = (int)lParam1; + + switch(uMsg) + { + case CPL_INIT: + { + return TRUE; + } + case CPL_GETCOUNT: + { + return NUM_APPLETS; + } + case CPL_INQUIRE: + { + CPLINFO *CPlInfo = (CPLINFO*)lParam2; + CPlInfo->lData = 0; + CPlInfo->idIcon = Applets[i].idIcon; + CPlInfo->idName = Applets[i].idName; + CPlInfo->idInfo = Applets[i].idDescription; + break; + } + case CPL_DBLCLK: + { + Applets[i].AppletProc(); + break; + } + } + return FALSE; +} + + +BOOL STDCALL +DllMain( + HINSTANCE hinstDLL, + DWORD dwReason, + LPVOID lpvReserved) +{ + switch(dwReason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + hApplet = hinstDLL; + break; + } + return TRUE; +} + diff --git a/reactos/lib/cpl/access/access.def b/reactos/lib/cpl/access/access.def new file mode 100644 index 00000000000..1ed84314984 --- /dev/null +++ b/reactos/lib/cpl/access/access.def @@ -0,0 +1,6 @@ +LIBRARY cplsample.cpl + +EXPORTS +CPlApplet@16 + +; EOF diff --git a/reactos/lib/cpl/access/access.edf b/reactos/lib/cpl/access/access.edf new file mode 100644 index 00000000000..47e146aa470 --- /dev/null +++ b/reactos/lib/cpl/access/access.edf @@ -0,0 +1,6 @@ +LIBRARY cplsample.cpl + +EXPORTS +CPlApplet=CPlApplet@16 + +; EOF diff --git a/reactos/lib/cpl/access/access.h b/reactos/lib/cpl/access/access.h new file mode 100644 index 00000000000..337bc5b692c --- /dev/null +++ b/reactos/lib/cpl/access/access.h @@ -0,0 +1,20 @@ +#ifndef __CPL_SYSDM_H +#define __CPL_SYSDM_H + +typedef LONG (CALLBACK *APPLET_INITPROC)(VOID); + +typedef struct +{ + int idIcon; + int idName; + int idDescription; + APPLET_INITPROC AppletProc; +} APPLET, *PAPPLET; + +extern HINSTANCE hApplet; + +void ShowLastWin32Error(HWND hWndOwner); + +#endif /* __CPL_SYSDM_H */ + +/* EOF */ diff --git a/reactos/lib/cpl/access/access.rc b/reactos/lib/cpl/access/access.rc new file mode 100644 index 00000000000..f055a576865 --- /dev/null +++ b/reactos/lib/cpl/access/access.rc @@ -0,0 +1,144 @@ +#include +#include +#include "resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +VS_VERSION_INFO VERSIONINFO + FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD + PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", RES_STR_COMPANY_NAME + VALUE "FileDescription", "ReactOS Accessibility Control Panel\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "access\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "access.cpl\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +IDI_CPLACCESS ICON "resources/applet.ico" + + +IDD_PROPPAGEKEYBOARD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Keyboard" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "StickyKeys",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + LTEXT "Use StickyKeys if you want to use Shift, Ctrl, or Alt key by pressing one key at at time.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + CHECKBOX "Use StickyKeys",IDC_STICKY_BOX,(4*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Settings",IDC_STICKY_BUTTON,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + GROUPBOX "FilterKeys",-1,PROPSHEETPADDING,LABELLINE(8)+5,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(7)+2 + LTEXT "Use FilterKeys if you want Reactos to ignore brief or repeated keystrokes, or slow the repeat rate.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(10)-3,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + CHECKBOX "Use FilterKeys",IDC_FILTER_BOX,(4*PROPSHEETPADDING),LABELLINE(13)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Settings",IDC_FILTER_BUTTON,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(13)+2,(15*PROPSHEETPADDING),14 + GROUPBOX "ToggleKeys",-1,PROPSHEETPADDING,LABELLINE(16)+3,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + LTEXT "Use ToggleKeys if you want to hear tones when pressing Caps Lock, Num Lock, and Scroll Lock.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(18)-3,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(2) + CHECKBOX "Use ToggleKeys",IDC_TOGGLE_BOX,(4*PROPSHEETPADDING),LABELLINE(20)+2,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(2) + PUSHBUTTON "&Settings",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(20)+2,(15*PROPSHEETPADDING),14 +// CHECKBOX "Show extra keyboard help in programs",IDC_KEYBOARD_EXTRA +END + + +IDD_PROPPAGESOUND DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Sound" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "SoundSentry",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + LTEXT "Use SoundSentry if you want Reactos to generate visual warnings when your system makes a sound.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + CHECKBOX "Use &SoundSentry",IDC_SENTRY_BOX,(4*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Settings",IDC_SENTRY_BUTTON,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + + GROUPBOX "ShowSounds",-1,PROPSHEETPADDING,LABELLINE(8)+5,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(7)+2 + LTEXT "Use ShowSounds to tell your programs to display captions for the speech and sounds they make.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(10)-3,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + CHECKBOX "Use S&howSounds",IDC_SSHOW_BOX,(4*PROPSHEETPADDING),LABELLINE(12)+2,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) +END + + +IDD_PROPPAGEDISPLAY DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Display" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "High Contrast",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + LTEXT "Use this option if you want Reactos to use colors and fonts designed for easy reading.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + CHECKBOX "&Use High Contrast",IDC_CONTRAST_BOX,(4*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Settings",IDC_CONTRAST_BUTTON,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 +END + + +IDD_PROPPAGEMOUSE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Mouse" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "MouseKeys",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING + LTEXT "Use this option if you want to control the pointer with the numeric keypad on your keyboard.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) + CHECKBOX "Use &MouseKeys",IDC_MOUSE_BOX,(4*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Settings",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 +END + + +IDD_PROPPAGEGENERAL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "General" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "Automatic Reset",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(5) + CHECKBOX "&Turn off accessbility features after idle for:",IDC_RESET_BOX,(2*PROPSHEETPADDING),LABELLINE(2)-2,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(2) + + //POPUP IDC_RESET_POPUP, GRAYED + //{ + // MENUITEM "5 Minutes", IDC_RESET_5 + // MENUITEM "10 Minutes", IDC_RESET_10 + // MENUITEM "15 Minutes", IDC_RESET_15 + // MENUITEM "20 Minutes", IDC_RESET_20 + // MENUITEM "25 Minutes", IDC_RESET_25 + // MENUITEM "30 Minutes", IDC_RESET_30 + //} + + GROUPBOX "Notification",-1,PROPSHEETPADDING,LABELLINE(7)-2,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(5) + CHECKBOX "Give warning message when turning a feature on",IDC_NOTIFICATION_MESSAGE,(2*PROPSHEETPADDING),LABELLINE(8)-2,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(2) + CHECKBOX "Make a sound when turning a feature on or off",IDC_NOTIFICATION_SOUND,(2*PROPSHEETPADDING),LABELLINE(10)-2,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(1) + + + GROUPBOX "SerialKey Devices",-1,PROPSHEETPADDING,LABELLINE(13)-4,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(5) + LTEXT "SerialKey devices allow alternative access to keyboard and mouse features.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(14)-4,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(2) + CHECKBOX "Support &SerialKey devices",IDC_SERIAL_BOX,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(16)-4,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(1) + + PUSHBUTTON "S&ettings",IDC_SERIAL_BUTTON,180,LABELLINE(16)-4,50,LABELLINE(1) + + GROUPBOX "Administrative options",-1,PROPSHEETPADDING,LABELLINE(19)-4,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(5) + + CHECKBOX "Apply all settings to l&ogon desktop",IDC_ADMIN_LOGON_BOX,(PROPSHEETPADDING*2),LABELLINE(20)-4,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(2) + CHECKBOX "Apply all settings to &defaults for new users",IDC_ADMIN_USERS_BOX,(2*PROPSHEETPADDING),LABELLINE(22)-4,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(1) +END + + +STRINGTABLE +BEGIN + IDS_CPLSYSTEMNAME "Accessibility" + IDS_CPLSYSTEMDESCRIPTION "Customizes accessbility features for your computer." +END diff --git a/reactos/lib/cpl/access/display.c b/reactos/lib/cpl/access/display.c new file mode 100644 index 00000000000..12178ab3fb2 --- /dev/null +++ b/reactos/lib/cpl/access/display.c @@ -0,0 +1,64 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: display.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/advanced.c + * PURPOSE: Memory, start-up and profiles settings + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include "resource.h" +#include "access.h" + +/* Property page dialog callback */ +BOOL CALLBACK +DisplayPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_CONTRAST_BOX: + { + break; + } + case IDC_CONTRAST_BUTTON: + { + break; + } + default: + break; + } + } + } + return FALSE; +} diff --git a/reactos/lib/cpl/access/general.c b/reactos/lib/cpl/access/general.c new file mode 100644 index 00000000000..03f032cac43 --- /dev/null +++ b/reactos/lib/cpl/access/general.c @@ -0,0 +1,84 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: general.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/advanced.c + * PURPOSE: Memory, start-up and profiles settings + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include "resource.h" +#include "access.h" + +/* Property page dialog callback */ +BOOL CALLBACK +GeneralPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_RESET_BOX: + { + break; + } + case IDC_NOTIFICATION_MESSAGE: + { + break; + } + case IDC_NOTIFICATION_SOUND: + { + break; + } + case IDC_SERIAL_BOX: + { + break; + } + case IDC_SERIAL_BUTTON: + { + break; + } + case IDC_ADMIN_LOGON_BOX: + { + break; + } + case IDC_ADMIN_USERS_BOX: + { + break; + } + default: + break; + } + } + } + return FALSE; +} diff --git a/reactos/lib/cpl/access/keyboard.c b/reactos/lib/cpl/access/keyboard.c new file mode 100644 index 00000000000..aeb64bfbdd2 --- /dev/null +++ b/reactos/lib/cpl/access/keyboard.c @@ -0,0 +1,85 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: keyboard.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/advanced.c + * PURPOSE: Memory, start-up and profiles settings + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include "resource.h" +#include "access.h" + +/* Property page dialog callback */ +BOOL CALLBACK +KeyboardPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_STICKY_BOX: + { + break; + } + + case IDC_STICKY_BUTTON: + { + break; + } + + case IDC_FILTER_BOX: + { + break; + } + + case IDC_FILTER_BUTTON: + { + break; + } + + case IDC_TOGGLE_BOX: + { + break; + } + + case IDC_TOGGLE_BUTTON: + { + break; + } + default: + break; + } + } + } + return FALSE; +} diff --git a/reactos/lib/cpl/access/mouse.c b/reactos/lib/cpl/access/mouse.c new file mode 100644 index 00000000000..ec8ce4a5d2f --- /dev/null +++ b/reactos/lib/cpl/access/mouse.c @@ -0,0 +1,64 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: mouse.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/advanced.c + * PURPOSE: Memory, start-up and profiles settings + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include "resource.h" +#include "access.h" + +/* Property page dialog callback */ +BOOL CALLBACK +MousePageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_MOUSE_BOX: + { + break; + } + case IDC_MOUSE_BUTTON: + { + break; + } + default: + break; + } + } + } + return FALSE; +} diff --git a/reactos/lib/cpl/access/resource.h b/reactos/lib/cpl/access/resource.h new file mode 100644 index 00000000000..d2cb74fee6e --- /dev/null +++ b/reactos/lib/cpl/access/resource.h @@ -0,0 +1,51 @@ +#ifndef __CPL_RESOURCE_H +#define __CPL_RESOURCE_H + +/* metrics */ +#define PROPSHEETWIDTH 246 +#define PROPSHEETHEIGHT 228 +#define PROPSHEETPADDING 6 +#define SYSTEM_COLUMN (18 * PROPSHEETPADDING) +#define LABELLINE(x) (((PROPSHEETPADDING + 2) * x) + (x + 2)) +#define ICONSIZE 16 + +/* ids */ +#define IDI_CPLACCESS 100 + +#define IDD_PROPPAGEKEYBOARD 100 +#define IDD_PROPPAGESOUND 101 +#define IDD_PROPPAGEDISPLAY 102 +#define IDD_PROPPAGEMOUSE 103 +#define IDD_PROPPAGEGENERAL 104 + +#define IDS_CPLSYSTEMNAME 1001 +#define IDS_CPLSYSTEMDESCRIPTION 2001 + +/* controls */ +#define IDC_STICKY_BOX 200 +#define IDC_STICKY_BUTTON 201 +#define IDC_FILTER_BOX 202 +#define IDC_FILTER_BUTTON 203 +#define IDC_TOGGLE_BOX 204 +#define IDC_TOGGLE_BUTTON 205 +#define IDC_SENTRY_BOX 206 +#define IDC_SENTRY_BUTTON 207 +#define IDC_SSHOW_BOX 208 +#define IDC_CONTRAST_BOX 209 +#define IDC_CONTRAST_BUTTON 210 +#define IDC_MOUSE_BOX 211 +#define IDC_MOUSE_BUTTON 212 +#define IDC_RESET_BOX 213 +#define IDC_RESET_POPUP 214 +#define IDC_NOTIFICATION_MESSAGE 215 +#define IDC_NOTIFICATION_SOUND 216 +#define IDC_SERIAL_BOX 217 +#define IDC_SERIAL_BUTTON 218 +#define IDC_ADMIN_LOGON_BOX 219 +#define IDC_ADMIN_USERS_BOX 220 + + + +#endif /* __CPL_RESOURCE_H */ + +/* EOF */ diff --git a/reactos/lib/cpl/access/sound.c b/reactos/lib/cpl/access/sound.c new file mode 100644 index 00000000000..c1780b41059 --- /dev/null +++ b/reactos/lib/cpl/access/sound.c @@ -0,0 +1,68 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: sound.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/system/advanced.c + * PURPOSE: Memory, start-up and profiles settings + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * UPDATE HISTORY: + * 03-04-2004 Created + */ +#include +#include +#include "resource.h" +#include "access.h" + +/* Property page dialog callback */ +BOOL CALLBACK +SoundPageProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + break; + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDC_SENTRY_BOX: + { + break; + } + case IDC_SENTRY_BUTTON: + { + break; + } + case IDC_SSHOW_BOX: + { + break; + } + default: + break; + } + } + } + return FALSE; +} From 9eefe9985c592c92efcc504ad6034d2d6923b5c5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 30 Jun 2004 12:20:35 +0000 Subject: [PATCH 145/356] Add control panel icon. svn path=/trunk/; revision=9946 --- reactos/lib/cpl/access/resources/applet.ico | Bin 0 -> 1398 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/lib/cpl/access/resources/applet.ico diff --git a/reactos/lib/cpl/access/resources/applet.ico b/reactos/lib/cpl/access/resources/applet.ico new file mode 100644 index 0000000000000000000000000000000000000000..3eae16df58c7f5b9a6b80827d788f7416afccbda GIT binary patch literal 1398 zcmds1v2MaJ5Pcy?>6oosVPx#onJ?g5x|yL8-r%#mb?JxX50cHi7sup4K?uN%Pj@Bxs|$P2s|z*`B_b@H#sH*;X6HIy|)ae`;;G(4U3c%KwU zng}6K%Mtq*G0LLw(UgYY#`a*~ft@q>4}8aK8_?=J=D_=@^L_oC@Gbu>Zm!E|ecnu( z+`8Q-9);RO1DVO`5*Ex${7*rzT$k>q>YY}5t123;JHup-7leVI7nk`P|W&Ys_ z_r*N>-jMqObGQP}oF-9>st~smS_|yFs$V?oA+Ep34wa~LO!6G5 MKQVRI!ab7Xj@&-27XSbN literal 0 HcmV?d00001 From 3ec9c96584b6a3b2285089c2c47e69c49ef55f98 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 30 Jun 2004 12:21:20 +0000 Subject: [PATCH 146/356] Add accessibility control panel. svn path=/trunk/; revision=9947 --- reactos/lib/cpl/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/cpl/Makefile b/reactos/lib/cpl/Makefile index 21e4b0b27f9..cfe388ce48b 100644 --- a/reactos/lib/cpl/Makefile +++ b/reactos/lib/cpl/Makefile @@ -6,7 +6,7 @@ PATH_TO_TOP = ../.. include $(PATH_TO_TOP)/rules.mak -CONTROL_PANELS = sysdm appwiz control +CONTROL_PANELS = access appwiz control sysdm all: $(CONTROL_PANELS) From 3af5a16e60a76bc547c9c78c713d77d7579d6346 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 30 Jun 2004 19:07:22 +0000 Subject: [PATCH 147/356] Merge in Winehq commits. svn path=/trunk/; revision=9948 --- reactos/lib/shell32/classes.c | 2 +- reactos/lib/shell32/shlfsbind.c | 10 +++++----- reactos/lib/shell32/shv_bg_cmenu.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/lib/shell32/classes.c b/reactos/lib/shell32/classes.c index 21f75721238..5c00c8b4399 100644 --- a/reactos/lib/shell32/classes.c +++ b/reactos/lib/shell32/classes.c @@ -265,7 +265,7 @@ BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD * * Gets the name of a registred class */ -static WCHAR swEmpty[] = {0}; +static const WCHAR swEmpty[] = {0}; BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) { diff --git a/reactos/lib/shell32/shlfsbind.c b/reactos/lib/shell32/shlfsbind.c index 75ea638f5d5..a5a0dc52a8b 100644 --- a/reactos/lib/shell32/shlfsbind.c +++ b/reactos/lib/shell32/shlfsbind.c @@ -58,11 +58,11 @@ static struct ICOM_VTABLE(IFileSystemBindData) sbvt = IFileSystemBindData_fnQueryInterface, IFileSystemBindData_fnAddRef, IFileSystemBindData_fnRelease, - IFileSystemBindData_fnSetFindData, IFileSystemBindData_fnGetFindData, + IFileSystemBindData_fnSetFindData, }; -static WCHAR wFileSystemBindData[] = {'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0}; +static const WCHAR wFileSystemBindData[] = {'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0}; HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV) { @@ -93,7 +93,7 @@ HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC bindOpts.grfMode = STGM_CREATE; bindOpts.dwTickCountDeadline = 0; IBindCtx_SetBindOptions(*ppV, &bindOpts); - IBindCtx_RegisterObjectParam(*ppV, wFileSystemBindData, (LPUNKNOWN)sb); + IBindCtx_RegisterObjectParam(*ppV, (LPOLESTR)wFileSystemBindData, (LPUNKNOWN)sb); IFileSystemBindData_Release((IFileSystemBindData*)sb); } @@ -113,7 +113,7 @@ HRESULT WINAPI FileSystemBindData_GetFindData(LPBC pbc, WIN32_FIND_DATAW *pfd) if (!pfd) return E_INVALIDARG; - ret = IBindCtx_GetObjectParam(pbc, wFileSystemBindData, &pUnk); + ret = IBindCtx_GetObjectParam(pbc, (LPOLESTR)wFileSystemBindData, &pUnk); if (SUCCEEDED(ret)) { ret = IUnknown_QueryInterface(pUnk, &IID_IFileSystemBindData, (LPVOID *)&pfsbd); @@ -135,7 +135,7 @@ HRESULT WINAPI FileSystemBindData_SetFindData(LPBC pbc, const WIN32_FIND_DATAW * TRACE("%p, %p\n", pbc, pfd); - ret = IBindCtx_GetObjectParam(pbc, wFileSystemBindData, &pUnk); + ret = IBindCtx_GetObjectParam(pbc, (LPOLESTR)wFileSystemBindData, &pUnk); if (SUCCEEDED(ret)) { ret = IUnknown_QueryInterface(pUnk, &IID_IFileSystemBindData, (LPVOID *)&pfsbd); diff --git a/reactos/lib/shell32/shv_bg_cmenu.c b/reactos/lib/shell32/shv_bg_cmenu.c index cfc1fc136be..c4174fab11f 100644 --- a/reactos/lib/shell32/shv_bg_cmenu.c +++ b/reactos/lib/shell32/shv_bg_cmenu.c @@ -223,7 +223,7 @@ static BOOL DoPaste( TRACE("\n"); - if(SUCCEEDED(pOleGetClipboard(&pda))) + if(SUCCEEDED(OleGetClipboard(&pda))) { STGMEDIUM medium; FORMATETC formatetc; @@ -277,7 +277,7 @@ static BOOL DoPaste( SHFree(pidl); /* release the medium*/ - pReleaseStgMedium(&medium); + ReleaseStgMedium(&medium); } IDataObject_Release(pda); } From 458aec49c1d3dbbb2be31dd1feaf4223ed6da361 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 30 Jun 2004 19:14:24 +0000 Subject: [PATCH 148/356] Merge in Winehq commits. svn path=/trunk/; revision=9949 --- reactos/lib/shell32/shell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/shell.c b/reactos/lib/shell32/shell.c index 419e2fd0ab2..b6307a7beea 100644 --- a/reactos/lib/shell32/shell.c +++ b/reactos/lib/shell32/shell.c @@ -611,7 +611,7 @@ DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len ) /************************************************************************* * SHELL_Execute16 [Internal] */ -static UINT SHELL_Execute16(const WCHAR *lpCmd, void *env, BOOL shWait, +static UINT SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) { UINT ret; From e050a4dd0303a89514833619ac7140d3d023e211 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 30 Jun 2004 20:19:25 +0000 Subject: [PATCH 149/356] Merge in Winehq commits. svn path=/trunk/; revision=9950 --- reactos/lib/shell32/enumidlist.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/lib/shell32/enumidlist.c b/reactos/lib/shell32/enumidlist.c index 4ce2e7257c2..07122012bb9 100644 --- a/reactos/lib/shell32/enumidlist.c +++ b/reactos/lib/shell32/enumidlist.c @@ -21,7 +21,6 @@ #include #include #include - #include "wine/debug.h" #include "windef.h" #include "winbase.h" From 8eb23c9e6c2b190dc0152a341b8c99b346511e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 30 Jun 2004 20:40:02 +0000 Subject: [PATCH 150/356] Fix IFileSystemBindData method order again. svn path=/trunk/; revision=9951 --- reactos/lib/shell32/shlfsbind.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/shlfsbind.c b/reactos/lib/shell32/shlfsbind.c index a5a0dc52a8b..0804b1bb6db 100644 --- a/reactos/lib/shell32/shlfsbind.c +++ b/reactos/lib/shell32/shlfsbind.c @@ -58,8 +58,8 @@ static struct ICOM_VTABLE(IFileSystemBindData) sbvt = IFileSystemBindData_fnQueryInterface, IFileSystemBindData_fnAddRef, IFileSystemBindData_fnRelease, - IFileSystemBindData_fnGetFindData, IFileSystemBindData_fnSetFindData, + IFileSystemBindData_fnGetFindData, }; static const WCHAR wFileSystemBindData[] = {'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0}; From 6cfb2b5848861648701aa03ae8da2733b2b13bba Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 30 Jun 2004 20:42:18 +0000 Subject: [PATCH 151/356] Merge in Winehq commits. svn path=/trunk/; revision=9952 --- reactos/lib/shell32/brsfolder.c | 11 ++++++----- reactos/lib/shell32/shlfileop.c | 17 ++++++++++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/reactos/lib/shell32/brsfolder.c b/reactos/lib/shell32/brsfolder.c index 9110ed2515e..944117fdd05 100644 --- a/reactos/lib/shell32/brsfolder.c +++ b/reactos/lib/shell32/brsfolder.c @@ -391,7 +391,8 @@ static INT_PTR CALLBACK BrsFolderDlgProc(HWND hWnd, UINT msg, WPARAM wParam, switch (wParam) { case IDOK: pdump ( pidlRet ); - SHGetPathFromIDListW(pidlRet, lpBrowseInfo->pszDisplayName); + if (lpBrowseInfo->pszDisplayName) + SHGetPathFromIDListW(pidlRet, lpBrowseInfo->pszDisplayName); EndDialog(hWnd, (DWORD) ILClone(pidlRet)); return TRUE; @@ -438,7 +439,7 @@ static INT_PTR CALLBACK BrsFolderDlgProc(HWND hWnd, UINT msg, WPARAM wParam, return FALSE; } -static WCHAR swBrowseTempName[] = {'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0}; +static const WCHAR swBrowseTempName[] = {'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0}; /************************************************************************* * SHBrowseForFolderA [SHELL32.@] @@ -460,9 +461,9 @@ LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOA lpbi) bi.pidlRoot = lpbi->pidlRoot; if (lpbi->pszDisplayName) { - len = MultiByteToWideChar(CP_ACP, 0, lpbi->pszDisplayName, -1, NULL, 0); - bi.pszDisplayName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, lpbi->pszDisplayName, -1, bi.pszDisplayName, len); + /*lpbi->pszDisplayName is assumed to be MAX_PATH (MSDN) */ + bi.pszDisplayName = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpbi->pszDisplayName, -1, bi.pszDisplayName, MAX_PATH); } else bi.pszDisplayName = NULL; diff --git a/reactos/lib/shell32/shlfileop.c b/reactos/lib/shell32/shlfileop.c index bae85725e06..2acb2ed6004 100644 --- a/reactos/lib/shell32/shlfileop.c +++ b/reactos/lib/shell32/shlfileop.c @@ -53,9 +53,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); #define FO_MASK 0xF CHAR aWildcardFile[] = {'*','.','*',0}; -WCHAR wWildcardFile[] = {'*','.','*',0}; -WCHAR wWildcardChars[] = {'*','?',0}; -WCHAR wBackslash[] = {'\\',0}; +static const WCHAR wWildcardFile[] = {'*','.','*',0}; +static const WCHAR wWildcardChars[] = {'*','?',0}; +static const WCHAR wBackslash[] = {'\\',0}; static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec); static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec); @@ -1310,3 +1310,14 @@ BOOL WINAPI IsNetDrive(DWORD drive) root[0] += (char)drive; return (GetDriveTypeA(root) == DRIVE_REMOTE); } + + +/************************************************************************* + * RealDriveType [SHELL32.524] + */ +INT WINAPI RealDriveType(INT drive, BOOL bQueryNet) +{ + char root[] = "A:\\"; + root[0] += (char)drive; + return GetDriveTypeA(root); +} From aa33e159659e5635c351e92d9f2fc35305d76774 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 30 Jun 2004 20:51:45 +0000 Subject: [PATCH 152/356] Merge in Winehq commits. - not enabled yet svn path=/trunk/; revision=9953 --- reactos/lib/shell32/autocomplete.c | 645 +++++++++++++++++++++++++++++ 1 file changed, 645 insertions(+) create mode 100644 reactos/lib/shell32/autocomplete.c diff --git a/reactos/lib/shell32/autocomplete.c b/reactos/lib/shell32/autocomplete.c new file mode 100644 index 00000000000..50460c4bec9 --- /dev/null +++ b/reactos/lib/shell32/autocomplete.c @@ -0,0 +1,645 @@ +/* + * AutoComplete interfaces implementation. + * + * Copyright 2004 Maxime Bellengé + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Implemented: + - ACO_AUTOAPPEND style + - ACO_AUTOSUGGEST style + - ACO_UPDOWNKEYDROPSLIST style + + - Handle pwzsRegKeyPath and pwszQuickComplete in Init + + TODO: + - implement ACO_SEARCH style + - implement ACO_FILTERPREFIXES style + - implement ACO_USETAB style + - implement ACO_RTLREADING style + + */ +#include "config.h" + +#include +#include +#include +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "undocshell.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "pidl.h" +#include "shlguid.h" +#include "shlobj.h" +#include "shldisp.h" +#include "debughlp.h" + +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct +{ + ICOM_VFIELD(IAutoComplete); + ICOM_VTABLE (IAutoComplete2) * lpvtblAutoComplete2; + DWORD ref; + BOOL enabled; + HWND hwndEdit; + HWND hwndListBox; + WNDPROC wpOrigEditProc; + WNDPROC wpOrigLBoxProc; + WCHAR *txtbackup; + WCHAR *quickComplete; + IEnumString *enumstr; + AUTOCOMPLETEOPTIONS options; +} IAutoCompleteImpl; + +static struct ICOM_VTABLE(IAutoComplete) acvt; +static struct ICOM_VTABLE(IAutoComplete2) ac2vt; + +#define _IAutoComplete2_Offset ((int)(&(((IAutoCompleteImpl*)0)->lpvtblAutoComplete2))) +#define _ICOM_THIS_From_IAutoComplete2(class, name) class* This = (class*)(((char*)name)-_IAutoComplete2_Offset); + +/* + converts This to a interface pointer +*/ +#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) +#define _IAutoComplete2_(This) (IAutoComplete2*)&(This->lpvtblAutoComplete2) + +static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +/************************************************************************** + * IAutoComplete_Constructor + */ +HRESULT WINAPI IAutoComplete_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IAutoCompleteImpl *lpac; + + if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + lpac = (IAutoCompleteImpl*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(IAutoCompleteImpl)); + if (!lpac) + return E_OUTOFMEMORY; + + lpac->ref = 1; + lpac->lpVtbl = &acvt; + lpac->lpvtblAutoComplete2 = &ac2vt; + lpac->enabled = TRUE; + lpac->enumstr = NULL; + lpac->options = ACO_AUTOAPPEND; + lpac->wpOrigEditProc = NULL; + lpac->hwndListBox = NULL; + lpac->txtbackup = NULL; + lpac->quickComplete = NULL; + + if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (lpac), riid, ppv))) { + IUnknown_Release (_IUnknown_ (lpac)); + return E_NOINTERFACE; + } + + TRACE("-- (%p)->\n",lpac); + + return S_OK; +} + +/************************************************************************** + * AutoComplete_QueryInterface + */ +static HRESULT WINAPI IAutoComplete_fnQueryInterface( + IAutoComplete * iface, + REFIID riid, + LPVOID *ppvObj) +{ + ICOM_THIS(IAutoCompleteImpl, iface); + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n", This, shdebugstr_guid(riid), ppvObj); + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IAutoComplete)) + { + *ppvObj = (IAutoComplete*)This; + } + else if(IsEqualIID(riid, &IID_IAutoComplete2)) + { + *ppvObj = _IAutoComplete2_ (This); + } + + if (*ppvObj) + { + IAutoComplete_AddRef((IAutoComplete*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/****************************************************************************** + * IAutoComplete_fnAddRef + */ +static ULONG WINAPI IAutoComplete_fnAddRef( + IAutoComplete * iface) +{ + ICOM_THIS(IAutoCompleteImpl,iface); + + TRACE("(%p)->(%lu)\n",This,This->ref); + return ++(This->ref); +} + +/****************************************************************************** + * IAutoComplete_fnRelease + */ +static ULONG WINAPI IAutoComplete_fnRelease( + IAutoComplete * iface) +{ + ICOM_THIS(IAutoCompleteImpl,iface); + + TRACE("(%p)->(%lu)\n",This,This->ref); + + if (!--(This->ref)) { + TRACE(" destroying IAutoComplete(%p)\n",This); + if (This->quickComplete) + HeapFree(GetProcessHeap(), 0, This->quickComplete); + if (This->txtbackup) + HeapFree(GetProcessHeap(), 0, This->txtbackup); + if (This->hwndListBox) + DestroyWindow(This->hwndListBox); + if (This->enumstr) + IEnumString_Release(This->enumstr); + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return This->ref; +} + +/****************************************************************************** + * IAutoComplete_fnEnable + */ +static HRESULT WINAPI IAutoComplete_fnEnable( + IAutoComplete * iface, + BOOL fEnable) +{ + ICOM_THIS(IAutoCompleteImpl, iface); + + HRESULT hr = S_OK; + + TRACE("(%p)->(%s)\n", This, (fEnable)?"true":"false"); + + This->enabled = fEnable; + + return hr; +} + +/****************************************************************************** + * IAutoComplete_fnInit + */ +static HRESULT WINAPI IAutoComplete_fnInit( + IAutoComplete * iface, + HWND hwndEdit, + IUnknown *punkACL, + LPCOLESTR pwzsRegKeyPath, + LPCOLESTR pwszQuickComplete) +{ + ICOM_THIS(IAutoCompleteImpl, iface); + static const WCHAR lbName[] = {'L','i','s','t','B','o','x',0}; + + TRACE("(%p)->(0x%08lx, %p, %s, %s)\n", + This, (long)hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete)); + + if (This->options & ACO_AUTOSUGGEST) TRACE(" ACO_AUTOSUGGEST\n"); + if (This->options & ACO_AUTOAPPEND) TRACE(" ACO_AUTOAPPEND\n"); + if (This->options & ACO_SEARCH) FIXME(" ACO_SEARCH not supported\n"); + if (This->options & ACO_FILTERPREFIXES) FIXME(" ACO_FILTERPREFIXES not supported\n"); + if (This->options & ACO_USETAB) FIXME(" ACO_USETAB not supported\n"); + if (This->options & ACO_UPDOWNKEYDROPSLIST) TRACE(" ACO_UPDOWNKEYDROPSLIST\n"); + if (This->options & ACO_RTLREADING) FIXME(" ACO_RTLREADING not supported\n"); + + This->hwndEdit = hwndEdit; + + if (!SUCCEEDED (IUnknown_QueryInterface (punkACL, &IID_IEnumString, (LPVOID*)&This->enumstr))) { + TRACE("No IEnumString interface\n"); + return E_NOINTERFACE; + } + + This->wpOrigEditProc = (WNDPROC) SetWindowLongPtrW( hwndEdit, GWLP_WNDPROC, (LONG_PTR) ACEditSubclassProc); + SetWindowLongPtrW( hwndEdit, GWLP_USERDATA, (LONG_PTR)This); + + if (This->options & ACO_AUTOSUGGEST) { + HWND hwndParent; + + hwndParent = GetParent(This->hwndEdit); + + /* FIXME : The listbox should be resizable with the mouse. WS_THICKFRAME looks ugly */ + This->hwndListBox = CreateWindowExW(0, lbName, NULL, + WS_BORDER | WS_CHILD | WS_VSCROLL | LBS_HASSTRINGS | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + hwndParent, NULL, + (HINSTANCE)GetWindowLongA( hwndParent, GWL_HINSTANCE ), NULL); + + if (This->hwndListBox) { + This->wpOrigLBoxProc = (WNDPROC) SetWindowLongPtrW( This->hwndListBox, GWLP_WNDPROC, (LONG_PTR) ACLBoxSubclassProc); + SetWindowLongPtrW( This->hwndListBox, GWLP_USERDATA, (LONG_PTR)This); + } + } + + if (pwzsRegKeyPath) { + WCHAR *key; + WCHAR result[MAX_PATH]; + WCHAR *value; + HKEY hKey = 0; + LONG res; + LONG len; + + /* pwszRegKeyPath contains the key as well as the value, so we split */ + key = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwzsRegKeyPath)+1)*sizeof(WCHAR)); + strcpyW(key, pwzsRegKeyPath); + value = strrchrW(key, '\\'); + *value = 0; + value++; + /* Now value contains the value and buffer the key */ + res = RegOpenKeyExW(HKEY_CURRENT_USER, key, 0, KEY_READ, &hKey); + if (res != ERROR_SUCCESS) { + /* if the key is not found, MSDN states we must seek in HKEY_LOCAL_MACHINE */ + res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hKey); + } + if (res == ERROR_SUCCESS) { + res = RegQueryValueW(hKey, value, result, &len); + if (res == ERROR_SUCCESS) { + This->quickComplete = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(WCHAR)); + strcpyW(This->quickComplete, result); + } + RegCloseKey(hKey); + } + HeapFree(GetProcessHeap(), 0, key); + } + + if ((pwszQuickComplete) && (!This->quickComplete)) { + This->quickComplete = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwszQuickComplete)+1)*sizeof(WCHAR)); + lstrcpyW(This->quickComplete, pwszQuickComplete); + } + + return S_OK; +} + +/************************************************************************** + * IAutoComplete_fnVTable + */ +static ICOM_VTABLE (IAutoComplete) acvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IAutoComplete_fnQueryInterface, + IAutoComplete_fnAddRef, + IAutoComplete_fnRelease, + IAutoComplete_fnInit, + IAutoComplete_fnEnable, +}; + +/************************************************************************** + * AutoComplete2_QueryInterface + */ +static HRESULT WINAPI IAutoComplete2_fnQueryInterface( + IAutoComplete2 * iface, + REFIID riid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + return IAutoComplete_QueryInterface((IAutoComplete*)This, riid, ppvObj); +} + +/****************************************************************************** + * IAutoComplete2_fnAddRef + */ +static ULONG WINAPI IAutoComplete2_fnAddRef( + IAutoComplete2 * iface) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl,iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IAutoComplete2_AddRef((IAutoComplete*)This); +} + +/****************************************************************************** + * IAutoComplete2_fnRelease + */ +static ULONG WINAPI IAutoComplete2_fnRelease( + IAutoComplete2 * iface) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl,iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IAutoComplete_Release((IAutoComplete*)This); +} + +/****************************************************************************** + * IAutoComplete2_fnEnable + */ +static HRESULT WINAPI IAutoComplete2_fnEnable( + IAutoComplete2 * iface, + BOOL fEnable) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE ("(%p)->(%s)\n", This, (fEnable)?"true":"false"); + + return IAutoComplete_Enable((IAutoComplete*)This, fEnable); +} + +/****************************************************************************** + * IAutoComplete2_fnInit + */ +static HRESULT WINAPI IAutoComplete2_fnInit( + IAutoComplete2 * iface, + HWND hwndEdit, + IUnknown *punkACL, + LPCOLESTR pwzsRegKeyPath, + LPCOLESTR pwszQuickComplete) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE("(%p)\n", This); + + return IAutoComplete_Init((IAutoComplete*)This, hwndEdit, punkACL, pwzsRegKeyPath, pwszQuickComplete); +} + +/************************************************************************** + * IAutoComplete_fnGetOptions + */ +static HRESULT WINAPI IAutoComplete2_fnGetOptions( + IAutoComplete2 * iface, + DWORD *pdwFlag) +{ + HRESULT hr = S_OK; + + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE("(%p) -> (%p)\n", This, pdwFlag); + + *pdwFlag = This->options; + + return hr; +} + +/************************************************************************** + * IAutoComplete_fnSetOptions + */ +static HRESULT WINAPI IAutoComplete2_fnSetOptions( + IAutoComplete2 * iface, + DWORD dwFlag) +{ + HRESULT hr = S_OK; + + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE("(%p) -> (0x%lx)\n", This, dwFlag); + + This->options = dwFlag; + + return hr; +} + +/************************************************************************** + * IAutoComplete2_fnVTable + */ +static ICOM_VTABLE (IAutoComplete2) ac2vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IAutoComplete2_fnQueryInterface, + IAutoComplete2_fnAddRef, + IAutoComplete2_fnRelease, + IAutoComplete2_fnInit, + IAutoComplete2_fnEnable, + /* IAutoComplete2 */ + IAutoComplete2_fnSetOptions, + IAutoComplete2_fnGetOptions, +}; + +/* + Window procedure for autocompletion + */ +static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + ICOM_THIS(IAutoCompleteImpl, GetWindowLongPtrW(hwnd, GWLP_USERDATA)); + LPOLESTR strs; + HRESULT hr; + WCHAR hwndText[255]; + WCHAR *hwndQCText; + RECT r; + BOOL control, filled, displayall = FALSE; + int cpt, height, sel; + + if (!This->enabled) return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam); + + switch (uMsg) + { + case CB_SHOWDROPDOWN: + ShowWindow(This->hwndListBox, SW_HIDE); + break; + case WM_KILLFOCUS: + if ((This->options && ACO_AUTOSUGGEST) && + ((HWND)wParam != This->hwndListBox)) + { + ShowWindow(This->hwndListBox, SW_HIDE); + } + break; + case WM_KEYUP: + + GetWindowTextW( hwnd, (LPWSTR)hwndText, 255); + + switch(wParam) { + case VK_RETURN: + /* If quickComplete is set and control is pressed, replace the string */ + control = GetKeyState(VK_CONTROL) & 0x8000; + if (control && This->quickComplete) { + hwndQCText = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + (lstrlenW(This->quickComplete)+lstrlenW(hwndText))*sizeof(WCHAR)); + sel = sprintfW(hwndQCText, This->quickComplete, hwndText); + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)hwndQCText); + SendMessageW(hwnd, EM_SETSEL, 0, sel); + HeapFree(GetProcessHeap(), 0, hwndQCText); + } + + ShowWindow(This->hwndListBox, SW_HIDE); + return 0; + case VK_LEFT: + case VK_RIGHT: + return 0; + case VK_UP: + case VK_DOWN: + /* Two cases here : + - if the listbox is not visible, displays it + with all the entries if the style ACO_UPDOWNKEYDROPSLIST + is present but does not select anything. + - if the listbox is visible, change the selection + */ + if ( (This->options & (ACO_AUTOSUGGEST | ACO_UPDOWNKEYDROPSLIST)) + && (!IsWindowVisible(This->hwndListBox) && (! *hwndText)) ) + { + /* We must dispays all the entries */ + displayall = TRUE; + } else { + if (IsWindowVisible(This->hwndListBox)) { + int count; + + count = SendMessageW(This->hwndListBox, LB_GETCOUNT, 0, 0); + /* Change the selection */ + sel = SendMessageW(This->hwndListBox, LB_GETCURSEL, 0, 0); + if (wParam == VK_UP) + sel = ((sel-1)<0)?count-1:sel-1; + else + sel = ((sel+1)>= count)?-1:sel+1; + SendMessageW(This->hwndListBox, LB_SETCURSEL, sel, 0); + if (sel != -1) { + WCHAR *msg; + int len; + + len = SendMessageW(This->hwndListBox, LB_GETTEXTLEN, sel, (LPARAM)NULL); + msg = (WCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len+1)*sizeof(WCHAR)); + SendMessageW(This->hwndListBox, LB_GETTEXT, sel, (LPARAM)msg); + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)msg); + SendMessageW(hwnd, EM_SETSEL, lstrlenW(msg), lstrlenW(msg)); + HeapFree(GetProcessHeap(), 0, msg); + } else { + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)This->txtbackup); + SendMessageW(hwnd, EM_SETSEL, lstrlenW(This->txtbackup), lstrlenW(This->txtbackup)); + } + } + return 0; + } + break; + case VK_BACK: + case VK_DELETE: + if ((! *hwndText) && (This->options & ACO_AUTOSUGGEST)) { + ShowWindow(This->hwndListBox, SW_HIDE); + return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam); + } + if (This->options & ACO_AUTOAPPEND) { + DWORD b; + SendMessageW(hwnd, EM_GETSEL, (WPARAM)&b, (LPARAM)NULL); + if (b>1) { + hwndText[b-1] = '\0'; + } else { + hwndText[0] = '\0'; + SetWindowTextW(hwnd, hwndText); + } + } + break; + default: + ; + } + + SendMessageW(This->hwndListBox, LB_RESETCONTENT, 0, 0); + + HeapFree(GetProcessHeap(), 0, This->txtbackup); + This->txtbackup = (WCHAR*) HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, lstrlenW(hwndText)*sizeof(WCHAR)); + lstrcpyW(This->txtbackup, hwndText); + + /* Returns if there is no text to search and we doesn't want to display all the entries */ + if ((!displayall) && (! *hwndText) ) + break; + + IEnumString_Reset(This->enumstr); + filled = FALSE; + for(cpt = 0;;) { + hr = IEnumString_Next(This->enumstr, 1, &strs, NULL); + if (hr != S_OK) + break; + + if ((LPWSTR)strstrW(strs, hwndText) == strs) { + + if (This->options & ACO_AUTOAPPEND) { + SetWindowTextW(hwnd, strs); + SendMessageW(hwnd, EM_SETSEL, lstrlenW(hwndText), lstrlenW(strs)); + break; + } + + if (This->options & ACO_AUTOSUGGEST) { + SendMessageW(This->hwndListBox, LB_ADDSTRING, 0, (LPARAM)strs); + filled = TRUE; + cpt++; + } + } + } + + if (This->options & ACO_AUTOSUGGEST) { + if (filled) { + height = SendMessageW(This->hwndListBox, LB_GETITEMHEIGHT, 0, 0); + SendMessageW(This->hwndListBox, LB_CARETOFF, 0, 0); + GetWindowRect(hwnd, &r); + SetParent(This->hwndListBox, HWND_DESKTOP); + /* It seems that Windows XP displays 7 lines at most + and otherwise displays a vertical scroll bar */ + SetWindowPos(This->hwndListBox, HWND_TOP, + r.left, r.bottom + 1, r.right - r.left, min(height * 7, height*(cpt+1)), + SWP_SHOWWINDOW ); + } else { + ShowWindow(This->hwndListBox, SW_HIDE); + } + } + + break; + default: + return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam); + + } + + return 0; +} + +static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + ICOM_THIS(IAutoCompleteImpl, GetWindowLongPtrW(hwnd, GWLP_USERDATA)); + WCHAR *msg; + int sel = -1, len; + + switch (uMsg) { + case WM_MOUSEMOVE: + sel = SendMessageW(hwnd, LB_ITEMFROMPOINT, 0, lParam); + SendMessageW(hwnd, LB_SETCURSEL, (WPARAM)sel, (LPARAM)0); + break; + case WM_LBUTTONDOWN: + len = SendMessageW(This->hwndListBox, LB_GETTEXTLEN, sel, (LPARAM)NULL); + msg = (WCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len+1)*sizeof(WCHAR)); + sel = (INT)SendMessageW(hwnd, LB_GETCURSEL, 0, 0); + SendMessageW(hwnd, LB_GETTEXT, sel, (LPARAM)msg); + SendMessageW(This->hwndEdit, WM_SETTEXT, 0, (LPARAM)msg); + SendMessageW(This->hwndEdit, EM_SETSEL, 0, lstrlenW(msg)); + ShowWindow(hwnd, SW_HIDE); + HeapFree(GetProcessHeap(), 0, msg); + break; + default: + return CallWindowProcW(This->wpOrigLBoxProc, hwnd, uMsg, wParam, lParam); + } + return 0; +} From 209e1d76923dd8a61ec6612353fb35d52acd9ab2 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Thu, 1 Jul 2004 01:52:37 +0000 Subject: [PATCH 153/356] cleanup/reformat syscall code, save return value as soon as possible so that eax is freed up, which also simplifies the implementation of KiAfterSystemCallHook(), also removes a couple redundant instructions. svn path=/trunk/; revision=9955 --- reactos/ntoskrnl/ke/i386/syscall.S | 413 +++++++++++++++------------- reactos/ntoskrnl/ke/i386/usercall.c | 12 +- 2 files changed, 222 insertions(+), 203 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/syscall.S b/reactos/ntoskrnl/ke/i386/syscall.S index f843f97599c..db7a885abe7 100644 --- a/reactos/ntoskrnl/ke/i386/syscall.S +++ b/reactos/ntoskrnl/ke/i386/syscall.S @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: syscall.S,v 1.14 2004/04/07 15:35:14 ekohl Exp $ +/* $Id: syscall.S,v 1.15 2004/07/01 01:52:37 royce Exp $ * * FILE: ntoskrnl/hal/x86/syscall.s * PURPOSE: 2E trap handler @@ -28,6 +28,7 @@ #include #include #include +#include #include #define KernelMode (0) @@ -41,250 +42,266 @@ .globl _interrupt_handler2e _interrupt_handler2e: - /* Construct a trap frame on the stack */ + /* Construct a trap frame on the stack */ - /* Error code */ - pushl $0 - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - pushl %fs - /* Load PCR selector into fs */ - movl $PCR_SELECTOR, %ebx - movl %ebx, %fs + /* Error code */ + pushl $0 + pushl %ebp + pushl %ebx + pushl %esi + pushl %edi + pushl %fs + /* Load PCR selector into fs */ + movl $PCR_SELECTOR, %ebx + movl %ebx, %fs - /* Save the old exception list */ - movl %fs:KPCR_EXCEPTION_LIST, %ebx - pushl %ebx - /* Set the exception handler chain terminator */ - movl $0xffffffff, %fs:KPCR_EXCEPTION_LIST - /* Get a pointer to the current thread */ - movl %fs:KPCR_CURRENT_THREAD, %esi - /* Save the old previous mode */ - movl $0, %ebx - movb %ss:KTHREAD_PREVIOUS_MODE(%esi), %bl - pushl %ebx - /* Set the new previous mode based on the saved CS selector */ - movl 0x24(%esp), %ebx - andl $0x0000FFFF, %ebx - cmpl $KERNEL_CS, %ebx - jne L1 - movb $KernelMode, %ss:KTHREAD_PREVIOUS_MODE(%esi) - jmp L3 + /* Save the old exception list */ + movl %fs:KPCR_EXCEPTION_LIST, %ebx + pushl %ebx + /* Set the exception handler chain terminator */ + movl $0xffffffff, %fs:KPCR_EXCEPTION_LIST + /* Get a pointer to the current thread */ + movl %fs:KPCR_CURRENT_THREAD, %esi + /* Save the old previous mode */ + movl $0, %ebx + movb %ss:KTHREAD_PREVIOUS_MODE(%esi), %bl + pushl %ebx + /* Set the new previous mode based on the saved CS selector */ + movl 0x24(%esp), %ebx + andl $0x0000FFFF, %ebx + cmpl $KERNEL_CS, %ebx + jne L1 + movb $KernelMode, %ss:KTHREAD_PREVIOUS_MODE(%esi) + jmp L3 L1: - movb $UserMode, %ss:KTHREAD_PREVIOUS_MODE(%esi) + movb $UserMode, %ss:KTHREAD_PREVIOUS_MODE(%esi) L3: - /* Save other registers */ - pushl %eax - pushl %ecx - pushl %edx - pushl %ds - pushl %es - pushl %gs - pushl $0 /* DR7 */ - pushl $0 /* DR6 */ - pushl $0 /* DR3 */ - pushl $0 /* DR2 */ - pushl $0 /* DR1 */ - pushl $0 /* DR0 */ - pushl $0 /* XXX: TempESP */ - pushl $0 /* XXX: TempCS */ - pushl $0 /* XXX: DebugPointer */ - pushl $0 /* XXX: DebugArgMark */ + /* Save other registers */ + pushl %eax + pushl %ecx + pushl %edx + pushl %ds + pushl %es + pushl %gs + pushl $0 /* DR7 */ + pushl $0 /* DR6 */ + pushl $0 /* DR3 */ + pushl $0 /* DR2 */ + pushl $0 /* DR1 */ + pushl $0 /* DR0 */ + pushl $0 /* XXX: TempESP */ + pushl $0 /* XXX: TempCS */ + pushl $0 /* XXX: DebugPointer */ + pushl $0 /* XXX: DebugArgMark */ #ifdef DBG - /* Trick gdb 6 into backtracing over the system call */ - movl 4(%ebp), %ebx - pushl %ebx /* DebugEIP */ - movl (%ebp), %ebx - pushl %ebx /* DebugEBP */ + /* Trick gdb 6 into backtracing over the system call */ + movl 4(%ebp), %ebx + pushl %ebx /* DebugEIP */ + movl (%ebp), %ebx + pushl %ebx /* DebugEBP */ #else - movl 0x60(%esp), %ebx - pushl %ebx /* DebugEIP */ - pushl %ebp /* DebugEBP */ + movl 0x60(%esp), %ebx + pushl %ebx /* DebugEIP */ + pushl %ebp /* DebugEBP */ #endif - /* Load the segment registers */ - movl $KERNEL_DS, %ebx - movl %ebx, %ds - movl %ebx, %es - movl %ebx, %gs + /* Load the segment registers */ + movl $KERNEL_DS, %ebx + movl %ebx, %ds + movl %ebx, %es + movl %ebx, %gs - /* - * Save the old trap frame pointer over where we would save the EDX - * register. - */ - movl KTHREAD_TRAP_FRAME(%esi), %ebx - movl %ebx, 0x3C(%esp) - - /* Save a pointer to the trap frame in the TCB */ - movl %esp, KTHREAD_TRAP_FRAME(%esi) - - /* Set ES to kernel segment */ - movw $KERNEL_DS,%bx - movw %bx,%es + /* + * Save the old trap frame pointer over where we would save the EDX + * register. + */ + movl KTHREAD_TRAP_FRAME(%esi), %ebx + movl %ebx, KTRAP_FRAME_EDX(%esp) - /* Allocate new Kernel stack frame */ - movl %esp,%ebp + /* Allocate new Kernel stack frame */ + movl %esp,%ebp - /* Users's current stack frame pointer is source */ - movl %edx,%esi + /* Save a pointer to the trap frame in the TCB */ + movl %ebp, KTHREAD_TRAP_FRAME(%esi) - /* Determine system service table to use */ - cmpl $0x0fff, %eax - ja new_useShadowTable + /* Set ES to kernel segment */ + movw $KERNEL_DS,%bx + movw %bx,%es - /* Check to see if EAX is valid/inrange */ - cmpl %es:_KeServiceDescriptorTable + 8, %eax - jbe new_serviceInRange - movl $STATUS_INVALID_SYSTEM_SERVICE, %eax - jmp KeReturnFromSystemCall + /* Users's current stack frame pointer is source */ + movl %edx,%esi + + /* Determine system service table to use */ + cmpl $0x0fff, %eax + ja new_useShadowTable + + /* Check to see if EAX is valid/inrange */ + cmpl %es:_KeServiceDescriptorTable + 8, %eax + jbe new_serviceInRange + movl $STATUS_INVALID_SYSTEM_SERVICE, %eax + movl %eax, KTRAP_FRAME_EAX(%ebp) /* save our return value in PKTRAP_FRAME->Eax */ + jmp KeReturnFromSystemCall new_serviceInRange: #ifdef DBG - /* GDB thinks the function starts here and - wants a standard prolog, so let's give it */ - pushl %ebp - movl %esp,%ebp - popl %ebp + /* GDB thinks the function starts here and + wants a standard prolog, so let's give it */ + pushl %ebp + movl %esp,%ebp + popl %ebp #endif - /* Allocate room for argument list from kernel stack */ - movl %es:_KeServiceDescriptorTable + 12, %ecx - movb %es:(%ecx, %eax), %cl - movzx %cl, %ecx - subl %ecx, %esp + /* Allocate room for argument list from kernel stack */ + movl %es:_KeServiceDescriptorTable + 12, %ecx + movb %es:(%ecx, %eax), %cl + movzx %cl, %ecx + subl %ecx, %esp - /* Copy the arguments from the user stack to the kernel stack */ - movl %esp,%edi - cld - rep movsb + /* Copy the arguments from the user stack to the kernel stack */ + movl %esp,%edi + cld + rep movsb - /* DS is now also kernel segment */ - movw %bx, %ds - - /* Call system call hook */ - pushl %eax - call _KiSystemCallHook - popl %eax + /* DS is now also kernel segment */ + movw %bx, %ds - /* Make the system service call */ - movl %es:_KeServiceDescriptorTable, %ecx - movl %es:(%ecx, %eax, 4), %eax - call *%eax + /* Call system call hook */ + pushl %eax + call _KiSystemCallHook + popl %eax + + /* Make the system service call */ + movl %es:_KeServiceDescriptorTable, %ecx + movl %es:(%ecx, %eax, 4), %eax + call *%eax + movl %eax, KTRAP_FRAME_EAX(%ebp) /* save our return value in PKTRAP_FRAME->Eax */ #if CHECKED - /* Bump Service Counter */ + /* Bump Service Counter */ #endif - /* Deallocate the kernel stack frame */ - movl %ebp,%esp - - /* Call the post system call hook and deliver any pending APCs */ - pushl %ebp - pushl %eax - call _KiAfterSystemCallHook - addl $8,%esp - - jmp KeReturnFromSystemCall + jmp KeDeallocateStackAndReturnFromSystemCallWithHook new_useShadowTable: - subl $0x1000, %eax + subl $0x1000, %eax - /* Check to see if EAX is valid/inrange */ - cmpl %es:_KeServiceDescriptorTableShadow + 24, %eax - jbe new_shadowServiceInRange - movl $STATUS_INVALID_SYSTEM_SERVICE, %eax - jmp KeReturnFromSystemCall + /* Check to see if EAX is valid/inrange */ + cmpl %es:_KeServiceDescriptorTableShadow + 24, %eax + jbe new_shadowServiceInRange + movl $STATUS_INVALID_SYSTEM_SERVICE, %eax + movl %eax, KTRAP_FRAME_EAX(%ebp) /* save our return value in PKTRAP_FRAME->Eax */ + jmp KeReturnFromSystemCall new_shadowServiceInRange: #ifdef DBG - /* GDB thinks the function starts here and - wants a standard prolog, so let's give it */ - pushl %ebp - movl %esp,%ebp - popl %ebp + /* GDB thinks the function starts here and + wants a standard prolog, so let's give it */ + pushl %ebp + movl %esp,%ebp + popl %ebp #endif - /* Allocate room for argument list from kernel stack */ - movl %es:_KeServiceDescriptorTableShadow + 28, %ecx - movb %es:(%ecx, %eax), %cl - movzx %cl, %ecx - subl %ecx, %esp + /* Allocate room for argument list from kernel stack */ + movl %es:_KeServiceDescriptorTableShadow + 28, %ecx + movb %es:(%ecx, %eax), %cl + movzx %cl, %ecx + subl %ecx, %esp - /* Copy the arguments from the user stack to the kernel stack */ - movl %esp,%edi - cld - rep movsb + /* Copy the arguments from the user stack to the kernel stack */ + movl %esp,%edi + cld + rep movsb - /* DS is now also kernel segment */ - movw %bx,%ds + /* DS is now also kernel segment */ + movw %bx,%ds - /* Call system call hook */ -// pushl %eax -// call _KiSystemCallHook -// popl %eax + /* Call system call hook */ +// pushl %eax +// call _KiSystemCallHook +// popl %eax - /* Call service check routine */ - pushl %eax - call _KiServiceCheck - popl %eax - - /* Make the system service call */ - movl %es:_KeServiceDescriptorTableShadow + 16, %ecx - movl %es:(%ecx, %eax, 4), %eax - call *%eax + /* Call service check routine */ + pushl %eax + call _KiServiceCheck + popl %eax + + /* Make the system service call */ + movl %es:_KeServiceDescriptorTableShadow + 16, %ecx + movl %es:(%ecx, %eax, 4), %eax + call *%eax + movl %eax, KTRAP_FRAME_EAX(%ebp) /* save our return value in PKTRAP_FRAME->Eax */ #if CHECKED - /* Bump Service Counter */ + /* Bump Service Counter */ #endif - /* Deallocate the kernel stack frame */ - movl %ebp,%esp +KeDeallocateStackAndReturnFromSystemCallWithHook: + /* Deallocate the kernel stack frame */ + movl %ebp,%esp -KeReturnFromSystemCallWithHook: - /* Call the post system call hook and deliver any pending APCs */ - pushl %esp - pushl %eax - call _KiAfterSystemCallHook - addl $8,%esp +KeReturnFromSystemCallWithHook: + /* Call the post system call hook and deliver any pending APCs */ + pushl %esp + call _KiAfterSystemCallHook + addl $4,%esp KeReturnFromSystemCall: - - /* Restore the user context */ - /* Get a pointer to the current thread */ - movl %fs:0x124, %esi - - /* Restore the old trap frame pointer */ - movl 0x3c(%esp), %ebx - movl %ebx, KTHREAD_TRAP_FRAME(%esi) - - /* Skip debug information and unsaved registers */ - addl $0x30, %esp - popl %gs - popl %es - popl %ds - popl %edx - popl %ecx - addl $0x4, %esp /* Don't restore eax */ - /* Restore the old previous mode */ - popl %ebx - movb %bl, %ss:KTHREAD_PREVIOUS_MODE(%esi) + /* Restore the user context */ + /* Get a pointer to the current thread */ + movl %fs:0x124, %esi - /* Restore the old exception handler list */ - popl %ebx - movl %ebx, %fs:KPCR_EXCEPTION_LIST - - popl %fs - popl %edi - popl %esi - popl %ebx - popl %ebp - addl $0x4, %esp /* Ignore error code */ - - iret + /* Restore the old trap frame pointer */ + movl KTRAP_FRAME_EDX(%esp), %ebx + movl %ebx, KTHREAD_TRAP_FRAME(%esi) + +KiRosTrapReturn: + /* Skip debug information and unsaved registers */ + addl $0x30, %esp + popl %gs + popl %es + popl %ds + popl %edx + popl %ecx + popl %eax + + /* Restore the old previous mode */ + popl %ebx + movb %bl, %ss:KTHREAD_PREVIOUS_MODE(%esi) + + /* Restore the old exception handler list */ + popl %ebx + movl %ebx, %fs:KPCR_EXCEPTION_LIST + + popl %fs + popl %edi + popl %esi + popl %ebx + popl %ebp + addl $0x4, %esp /* Ignore error code */ + + iret + +/* R3: NOTE: This is part of my in-progress attempt at correcting NtContinue + * It is not being called, yet... + */ +.globl @KeRosTrapReturn@8 +@KeRosTrapReturn@8: + /* Call the post system call hook and deliver any pending APCs */ + pushl %esp + call _KiAfterSystemCallHook + addl $4,%esp + + /* Restore the user context */ + /* Get a pointer to the current thread */ + movl %fs:0x124, %esi + /* Restore the old trap frame pointer */ + movl %edx, KTHREAD_TRAP_FRAME(%esi) + + /* point %esp to the trap frame to restore */ + movl %ecx, %esp + jmp KiRosTrapReturn; diff --git a/reactos/ntoskrnl/ke/i386/usercall.c b/reactos/ntoskrnl/ke/i386/usercall.c index 63bc42bd47a..09d79710db9 100644 --- a/reactos/ntoskrnl/ke/i386/usercall.c +++ b/reactos/ntoskrnl/ke/i386/usercall.c @@ -1,4 +1,4 @@ -/* $Id: usercall.c,v 1.26 2004/06/23 22:32:24 ion Exp $ +/* $Id: usercall.c,v 1.27 2004/07/01 01:52:37 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,7 +26,8 @@ /* FUNCTIONS *****************************************************************/ -VOID KiSystemCallHook(ULONG Nr, ...) +VOID +KiSystemCallHook(ULONG Nr, ...) { #if 0 va_list ap; @@ -46,7 +47,8 @@ VOID KiSystemCallHook(ULONG Nr, ...) #endif } -ULONG KiAfterSystemCallHook(ULONG NtStatus, PKTRAP_FRAME TrapFrame) +VOID +KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame) { if (KeGetCurrentThread()->Alerted[1] != 0 && TrapFrame->Cs != KERNEL_CS) { @@ -56,11 +58,11 @@ ULONG KiAfterSystemCallHook(ULONG NtStatus, PKTRAP_FRAME TrapFrame) { KiDeliverUserApc(TrapFrame); } - return(NtStatus); } -VOID KiServiceCheck (ULONG Nr) +VOID +KiServiceCheck (ULONG Nr) { PETHREAD Thread; From fdd518ddace3af1c9879b977bba9017e048754d1 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Thu, 1 Jul 2004 02:40:23 +0000 Subject: [PATCH 154/356] Merging the KJKHyperion-RtlUnwind branch back into HEAD svn path=/trunk/; revision=9956 --- reactos/Makefile | 4 +- reactos/drivers/dd/null/makefile | 10 +- reactos/drivers/dd/null/null.c | 48 ++- reactos/lib/ntdll/makefile | 4 +- reactos/lib/ntdll/rtl/exception.c | 26 +- reactos/lib/pseh/framebased.c | 65 ++-- reactos/lib/pseh/i386/framebased.asm | 8 +- reactos/lib/rtl/i386/.cvsignore | 2 + reactos/lib/rtl/makefile | 5 +- reactos/ntoskrnl/Makefile.i386 | 1 - reactos/ntoskrnl/ke/i386/trap.s | 5 +- reactos/ntoskrnl/ps/thread.c | 6 +- reactos/ntoskrnl/rtl/i386/exception.c | 442 +------------------------- 13 files changed, 96 insertions(+), 530 deletions(-) create mode 100644 reactos/lib/rtl/i386/.cvsignore diff --git a/reactos/Makefile b/reactos/Makefile index 547e13a4db3..da718be5d00 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.231 2004/06/15 22:33:45 gvg Exp $ +# $Id: Makefile,v 1.232 2004/07/01 02:40:21 hyperion Exp $ # # Global makefile # @@ -32,7 +32,7 @@ BUS = acpi isapnp pci LIB_FSLIB = vfatlib # Static libraries -LIB_STATIC = string rosrtl epsapi uuid libwine zlib rtl tgetopt +LIB_STATIC = string rosrtl epsapi uuid libwine zlib rtl tgetopt pseh # Keyboard layout libraries DLLS_KBD = kbddv kbdfr kbdgr kbdse kbduk kbdus diff --git a/reactos/drivers/dd/null/makefile b/reactos/drivers/dd/null/makefile index 7adb9916919..ea0518641d8 100644 --- a/reactos/drivers/dd/null/makefile +++ b/reactos/drivers/dd/null/makefile @@ -1,17 +1,17 @@ -# $Id: makefile,v 1.18 2003/11/17 20:48:22 sedwards Exp $ +# $Id: makefile,v 1.19 2004/07/01 02:40:22 hyperion Exp $ PATH_TO_TOP = ../../.. +include $(PATH_TO_TOP)/rules.mak + TARGET_TYPE = driver TARGET_NAME = null TARGET_OBJECTS = null.o -TARGET_CFLAGS = -Wall -Werror +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -#TARGET_LFLAGS = -Wl,--file-alignment,0x20 -Wl,--section-alignment,0x20 - -include $(PATH_TO_TOP)/rules.mak +TARGET_LIBS = $(SDK_PATH_LIB)/pseh.a include $(TOOLS_PATH)/helper.mk diff --git a/reactos/drivers/dd/null/null.c b/reactos/drivers/dd/null/null.c index d5575508882..b7030a8cf49 100644 --- a/reactos/drivers/dd/null/null.c +++ b/reactos/drivers/dd/null/null.c @@ -1,4 +1,4 @@ -/* $Id: null.c,v 1.13 2004/02/10 16:22:55 navaraf Exp $ +/* $Id: null.c,v 1.14 2004/07/01 02:40:22 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -8,11 +8,15 @@ * UPDATE HISTORY: * 13/08/1998: Created * 29/04/2002: Fixed bugs, added zero-stream device + * 28/06/2004: Compile against the DDK, use PSEH where necessary */ /* INCLUDES */ -#include +#include + #include +#include + #include "null.h" /* OBJECTS */ @@ -27,15 +31,24 @@ NullDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) NTSTATUS nErrCode; nErrCode = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; switch(piosStack->MajorFunction) { /* opening and closing handles to the device */ case IRP_MJ_CREATE: case IRP_MJ_CLOSE: - { + switch(NULL_DEVICE_TYPE(DeviceObject)) + { + case NullBitBucket: + case NullZeroStream: + break; + + default: + ASSERT(FALSE); + } + break; - } /* write data */ case IRP_MJ_WRITE: @@ -47,9 +60,11 @@ NullDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) break; case NullZeroStream: + nErrCode = STATUS_INVALID_DEVICE_REQUEST; + break; + default: - Irp->IoStatus.Information = 0; - nErrCode = STATUS_NOT_IMPLEMENTED; + ASSERT(FALSE); } break; @@ -61,13 +76,21 @@ NullDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) switch(NULL_DEVICE_TYPE(DeviceObject)) { case NullBitBucket: - Irp->IoStatus.Information = 0; nErrCode = STATUS_END_OF_FILE; break; case NullZeroStream: - RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, piosStack->Parameters.Read.Length); - Irp->IoStatus.Information = piosStack->Parameters.Read.Length; + _SEH_TRY + { + RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, piosStack->Parameters.Read.Length); + Irp->IoStatus.Information = piosStack->Parameters.Read.Length; + } + _SEH_HANDLE + { + nErrCode = _SEH_GetExceptionCode(); + } + _SEH_END; + break; default: @@ -78,11 +101,8 @@ NullDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) break; } - /* unsupported operations */ default: - { - nErrCode = STATUS_NOT_IMPLEMENTED; - } + ASSERT(FALSE); } Irp->IoStatus.Status = nErrCode; @@ -96,6 +116,7 @@ NullUnload(PDRIVER_OBJECT DriverObject) { } +/* TODO: \Device\Zero should be memory-mappable */ NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { @@ -109,7 +130,6 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) DriverObject->MajorFunction[IRP_MJ_CREATE] = NullDispatch; DriverObject->MajorFunction[IRP_MJ_WRITE] = NullDispatch; DriverObject->MajorFunction[IRP_MJ_READ] = NullDispatch; - /* DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = NullDispatch; */ DriverObject->DriverUnload = NullUnload; /* create null device */ diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index 99fb8212ff6..15fe23320bb 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.103 2004/06/20 23:22:06 gdalsnes Exp $ +# $Id: makefile,v 1.104 2004/07/01 02:40:22 hyperion Exp $ PATH_TO_TOP = ../.. @@ -57,8 +57,6 @@ RTL_I386_OBJECTS = \ rtl/i386/aullrem.o \ rtl/i386/aullshr.o \ rtl/i386/chkstk.o \ - rtl/i386/exception.o \ - rtl/i386/except.o \ rtl/i386/float.o \ rtl/i386/ftol.o diff --git a/reactos/lib/ntdll/rtl/exception.c b/reactos/lib/ntdll/rtl/exception.c index 43285853751..79e5a9c610b 100644 --- a/reactos/lib/ntdll/rtl/exception.c +++ b/reactos/lib/ntdll/rtl/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.17 2004/04/08 21:14:18 navaraf Exp $ +/* $Id: exception.c,v 1.18 2004/07/01 02:40:22 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -6,8 +6,10 @@ * FILE: lib/ntdll/rtl/exception.c * PROGRAMERS: David Welch * Skywing + * KJK::Hyperion * UPDATES: Skywing, 09/11/2003: Implemented RtlRaiseException and * KiUserRaiseExceptionDispatcher. + * KJK::Hyperion, 22/06/2003: Moved common parts to rtl */ /* INCLUDES *****************************************************************/ @@ -57,28 +59,6 @@ KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord, RtlRaiseException(&NestedExceptionRecord); } -/* implemented in except.s */ -VOID -RtlpCaptureContext(PCONTEXT Context); - -/* - * @implemented - */ -VOID STDCALL -RtlRaiseException(PEXCEPTION_RECORD ExceptionRecord) -{ - CONTEXT Context; - NTSTATUS Status; - - RtlpCaptureContext(&Context); - - ExceptionRecord->ExceptionAddress = (PVOID)(*(((PULONG)Context.Ebp)+1)); - Context.ContextFlags = CONTEXT_FULL; - - Status = ZwRaiseException(ExceptionRecord, &Context, TRUE); - RtlRaiseException(ExceptionRecord); - RtlRaiseStatus(Status); /* If we get to this point, something is seriously wrong... */ -} /* * @implemented diff --git a/reactos/lib/pseh/framebased.c b/reactos/lib/pseh/framebased.c index e858b21680a..8bcbbfd4e50 100644 --- a/reactos/lib/pseh/framebased.c +++ b/reactos/lib/pseh/framebased.c @@ -68,47 +68,50 @@ int __cdecl _SEHFrameHandler /* Handling */ else { + int ret; + if(ExceptionRecord->ExceptionCode) frame->SPF_Code = ExceptionRecord->ExceptionCode; else frame->SPF_Code = 0xC0000001; - if(frame->SPF_Handlers->SH_Filter) + switch((UINT_PTR)frame->SPF_Handlers->SH_Filter) { - int ret; - - switch((UINT_PTR)frame->SPF_Handlers->SH_Filter) + case _SEH_EXECUTE_HANDLER + 1: + case _SEH_CONTINUE_SEARCH + 1: + case _SEH_CONTINUE_EXECUTION + 1: { - case _SEH_EXECUTE_HANDLER + 1: - case _SEH_CONTINUE_SEARCH + 1: - case _SEH_CONTINUE_EXECUTION + 1: - { - ret = (int)((UINT_PTR)frame->SPF_Handlers->SH_Filter) - 1; - break; - } - - default: - { - EXCEPTION_POINTERS ep; - - ep.ExceptionRecord = ExceptionRecord; - ep.ContextRecord = ContextRecord; - - ret = frame->SPF_Handlers->SH_Filter(&ep, frame); - break; - } + ret = (int)((UINT_PTR)frame->SPF_Handlers->SH_Filter) - 1; + break; } - /* _SEH_CONTINUE_EXECUTION */ - if(ret < 0) - return ExceptionContinueExecution; - /* _SEH_EXECUTE_HANDLER */ - else if(ret > 0) - _SEHCallHandler(frame); - /* _SEH_CONTINUE_SEARCH */ - else - /* fall through */; + default: + { + if(frame->SPF_Handlers->SH_Filter) + { + EXCEPTION_POINTERS ep; + + ep.ExceptionRecord = ExceptionRecord; + ep.ContextRecord = ContextRecord; + + ret = frame->SPF_Handlers->SH_Filter(&ep, frame); + } + else + ret = _SEH_CONTINUE_SEARCH; + + break; + } } + + /* _SEH_CONTINUE_EXECUTION */ + if(ret < 0) + return ExceptionContinueExecution; + /* _SEH_EXECUTE_HANDLER */ + else if(ret > 0) + _SEHCallHandler(frame); + /* _SEH_CONTINUE_SEARCH */ + else + /* fall through */; } return ExceptionContinueSearch; diff --git a/reactos/lib/pseh/i386/framebased.asm b/reactos/lib/pseh/i386/framebased.asm index d4d56b20fa9..50adede06e3 100644 --- a/reactos/lib/pseh/i386/framebased.asm +++ b/reactos/lib/pseh/i386/framebased.asm @@ -54,10 +54,10 @@ __SEHUnwind: push ebx xor eax, eax - push eax - push eax - push eax - push ecx + push eax ; ReturnValue + push eax ; ExceptionRecord + push eax ; TargetIp + push ecx ; TargetFrame call [__SEHRtlUnwind] pop ebx diff --git a/reactos/lib/rtl/i386/.cvsignore b/reactos/lib/rtl/i386/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/lib/rtl/i386/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o diff --git a/reactos/lib/rtl/makefile b/reactos/lib/rtl/makefile index e11603524f2..195bf17702c 100644 --- a/reactos/lib/rtl/makefile +++ b/reactos/lib/rtl/makefile @@ -33,7 +33,10 @@ TARGET_OBJECTS = \ version.o \ encode.o \ image.o \ - splaytree.o + splaytree.o \ + exception.o \ + i386/exception.o \ + i386/except.o # atom # registry diff --git a/reactos/ntoskrnl/Makefile.i386 b/reactos/ntoskrnl/Makefile.i386 index 3f86fc56066..0d8870edf2f 100644 --- a/reactos/ntoskrnl/Makefile.i386 +++ b/reactos/ntoskrnl/Makefile.i386 @@ -48,7 +48,6 @@ OBJECTS_RTL_I386 := \ rtl/i386/aulldiv.o \ rtl/i386/aullrem.o \ rtl/i386/aullshr.o \ - rtl/i386/except.o \ rtl/i386/exception.o \ rtl/i386/seh.o diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index c465bdad5c4..6a0e2bf6d34 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: trap.s,v 1.19 2004/03/13 18:21:57 dwelch Exp $ +/* $Id: trap.s,v 1.20 2004/07/01 02:40:23 hyperion Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/trap.s @@ -99,9 +99,6 @@ _KiTrapProlog: movl %fs:KPCR_EXCEPTION_LIST, %ebx pushl %ebx - /* Put the exception handler chain terminator */ - movl $0xffffffff, %fs:KPCR_EXCEPTION_LIST - /* Get a pointer to the current thread */ movl %fs:KPCR_CURRENT_THREAD, %edi diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index 8ed65131e83..a8e33d9b6e8 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.124 2004/01/05 14:28:21 weiden Exp $ +/* $Id: thread.c,v 1.125 2004/07/01 02:40:23 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -739,6 +739,10 @@ NtContinue(IN PCONTEXT Context, KEBUGCHECK(0); } KeContextToTrapFrame(Context, TrapFrame); + + if(TestAlert) + KiTestAlert(); + return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/rtl/i386/exception.c b/reactos/ntoskrnl/rtl/i386/exception.c index 7e2306aed32..fc3b2bb4c25 100755 --- a/reactos/ntoskrnl/rtl/i386/exception.c +++ b/reactos/ntoskrnl/rtl/i386/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.10 2004/02/24 23:51:04 dwelch Exp $ +/* $Id: exception.c,v 1.11 2004/07/01 02:40:23 hyperion Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -73,444 +73,4 @@ __ret_label: #endif /* _MSC_VER */ - -/* Implemented in except.s */ - -VOID -RtlpCaptureContext(PCONTEXT pContext); - -/* Macros that will help streamline the SEH implementations for - kernel mode and user mode */ - -#define SehpGetStackLimits(StackBase, StackLimit) \ -{ \ - (*(StackBase)) = KeGetCurrentKPCR()->StackBase; \ - (*(StackLimit)) = KeGetCurrentKPCR()->StackLimit; \ -} - -#define SehpGetExceptionList() \ - (PEXCEPTION_REGISTRATION)(KeGetCurrentThread()->TrapFrame ->ExceptionList) - -#define SehpSetExceptionList(NewExceptionList) \ - KeGetCurrentThread()->TrapFrame->ExceptionList = (PVOID)(NewExceptionList) - -#define SehpCaptureContext(Context) \ -{ \ - KeTrapFrameToContext(KeGetCurrentThread()->TrapFrame, (Context)); \ -} - -#define SehpContinue(Context, TestAlert) \ - ZwContinue(Context, TestAlert) - -/*** Code below this line is shared with lib/ntdll/rtl/i386/exception.c - please keep in sync ***/ - -VOID STDCALL -AsmDebug(ULONG Value) -{ - DbgPrint("Value 0x%.08x\n", Value); -} - - -/* Declare a few prototypes for the functions in except.s */ - -EXCEPTION_DISPOSITION -RtlpExecuteHandlerForException( - PEXCEPTION_RECORD ExceptionRecord, - PEXCEPTION_REGISTRATION RegistrationFrame, - PCONTEXT Context, - PVOID DispatcherContext, - PEXCEPTION_HANDLER ExceptionHandler); - -EXCEPTION_DISPOSITION -RtlpExecuteHandlerForUnwind( - PEXCEPTION_RECORD ExceptionRecord, - PEXCEPTION_REGISTRATION RegistrationFrame, - PCONTEXT Context, - PVOID DispatcherContext, - PEXCEPTION_HANDLER ExceptionHandler); - - -#ifndef NDEBUG - -VOID RtlpDumpExceptionRegistrations(VOID) -{ - PEXCEPTION_REGISTRATION Current; - - DbgPrint("Dumping exception registrations:\n"); - - Current = SehpGetExceptionList(); - - if ((ULONG_PTR)Current != -1) - { - while ((ULONG_PTR)Current != -1) - { - DbgPrint(" (0x%08X) HANDLER (0x%08X)\n", Current, Current->handler); - Current = Current->prev; - } - DbgPrint(" End-Of-List\n"); - } else { - DbgPrint(" No exception registrations exists.\n"); - } -} - -#endif /* NDEBUG */ - -ULONG -RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context) -{ - PEXCEPTION_REGISTRATION RegistrationFrame; - DWORD DispatcherContext; - DWORD ReturnValue; - - DPRINT("RtlpDispatchException()\n"); - - /* - This could be true very early in the boot process - in which case there is no point in continuing. - */ - if (KeGetCurrentThread() == NULL) - { - return ExceptionContinueExecution; - } - -#ifndef NDEBUG - RtlpDumpExceptionRegistrations(); -#endif /* NDEBUG */ - - RegistrationFrame = SehpGetExceptionList(); - - DPRINT("RegistrationFrame is 0x%X\n", RegistrationFrame); - - /* Check if there are any exception handlers at all. */ - if ((ULONG_PTR)RegistrationFrame == (ULONG_PTR)-1) - { - ExceptionRecord->ExceptionFlags |= EXCEPTION_NONCONTINUABLE; - return ExceptionContinueExecution; - } - - while ((ULONG_PTR)RegistrationFrame != (ULONG_PTR)-1) - { - EXCEPTION_RECORD ExceptionRecord2; - DWORD Temp = 0; - //PVOID RegistrationFrameEnd = (PVOID)RegistrationFrame + 8; - - // Make sure the registration frame is located within the stack - - DPRINT("Error checking\n"); -#if 0 - if (Teb->Tib.StackBase > RegistrationFrameEnd) - { - DPRINT("Teb->Tib.StackBase (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", - Teb->Tib.StackBase, RegistrationFrameEnd); - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return ExceptionContinueExecution; - } - // FIXME: Stack top, correct? - if (Teb->Tib.StackLimit < RegistrationFrameEnd) - { - DPRINT("Teb->Tib.StackLimit (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n", - Teb->Tib.StackLimit, RegistrationFrameEnd); - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return ExceptionContinueExecution; - } - - // Make sure stack is DWORD aligned - if ((ULONG_PTR)RegistrationFrame & 3) - { - DPRINT("RegistrationFrameEnd (0x%.08x) is not DWORD aligned.\n", - RegistrationFrameEnd); - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return ExceptionContinueExecution; - } -#endif - -#if 0 - /* FIXME: */ - if (someFlag) - RtlpLogLastExceptionDisposition( hLog, retValue ); -#endif - - DPRINT("Calling handler at 0x%X\n", RegistrationFrame->handler); - DPRINT("ExceptionRecord 0x%X\n", ExceptionRecord); - DPRINT("RegistrationFrame 0x%X\n", RegistrationFrame); - DPRINT("Context 0x%X\n", Context); - DPRINT("&DispatcherContext 0x%X\n", &DispatcherContext); - - ReturnValue = RtlpExecuteHandlerForException( - ExceptionRecord, - RegistrationFrame, - Context, - &DispatcherContext, - RegistrationFrame->handler); - -#ifndef NDEBUG - - DPRINT("Exception handler said 0x%X\n", ReturnValue); - DPRINT("RegistrationFrame == 0x%.08x\n", RegistrationFrame); - { - PULONG sp = (PULONG)((PVOID)RegistrationFrame - 0x08); - DPRINT("StandardESP == 0x%.08x\n", sp[0]); - DPRINT("Exception Pointers == 0x%.08x\n", sp[1]); - DPRINT("PrevFrame == 0x%.08x\n", sp[2]); - DPRINT("Handler == 0x%.08x\n", sp[3]); - DPRINT("ScopeTable == 0x%.08x\n", sp[4]); - DPRINT("TryLevel == 0x%.08x\n", sp[5]); - DPRINT("EBP == 0x%.08x\n", sp[6]); - } - -#endif - - if (RegistrationFrame == NULL) - { - ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL; // Turn off flag - } - - if (ReturnValue == ExceptionContinueExecution) - { - DPRINT("ReturnValue == ExceptionContinueExecution\n"); - if (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) - { - DPRINT("(ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) == TRUE\n"); - - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - RtlRaiseException(&ExceptionRecord2); - } - else - { - /* Copy the (possibly changed) context back to the trap frame and return */ - SehpContinue(Context, FALSE); - return ExceptionContinueExecution; - } - } - else if (ReturnValue == ExceptionContinueSearch) - { - DPRINT("ReturnValue == ExceptionContinueSearch\n"); - - /* Nothing to do here */ - } - else if (ReturnValue == ExceptionNestedException) - { - DPRINT("ReturnValue == ExceptionNestedException\n"); - - ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND; - if (DispatcherContext > Temp) - { - Temp = DispatcherContext; - } - } - else /* if (ReturnValue == ExceptionCollidedUnwind) */ - { - DPRINT("ReturnValue == ExceptionCollidedUnwind or unknown\n"); - - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - RtlRaiseException(&ExceptionRecord2); - } - - RegistrationFrame = RegistrationFrame->prev; // Go to previous frame - } - - /* No exception handler will handle this exception */ - - DPRINT("RtlpDispatchException(): Return ExceptionContinueExecution\n"); - - return ExceptionContinueExecution; -} - -VOID STDCALL -RtlRaiseStatus(NTSTATUS Status) -{ - EXCEPTION_RECORD ExceptionRecord; - - DPRINT("RtlRaiseStatus(Status 0x%.08x)\n", Status); - - ExceptionRecord.ExceptionCode = Status; - ExceptionRecord.ExceptionRecord = NULL; - ExceptionRecord.NumberParameters = 0; - ExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - RtlRaiseException (& ExceptionRecord); -} - -/* - * @implemented - */ -VOID STDCALL -RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, - PVOID ReturnAddress, - PEXCEPTION_RECORD ExceptionRecord, - DWORD EaxValue) -{ - PEXCEPTION_REGISTRATION ERHead; - PEXCEPTION_RECORD pExceptRec; - EXCEPTION_RECORD TempER; - CONTEXT Context; - - DPRINT("RtlUnwind(). RegistrationFrame 0x%X\n", RegistrationFrame); - -#ifndef NDEBUG - RtlpDumpExceptionRegistrations(); -#endif /* NDEBUG */ - - ERHead = SehpGetExceptionList(); - - DPRINT("ERHead is 0x%X\n", ERHead); - - pExceptRec = &TempER; - - if (ExceptionRecord == NULL) // The normal case - { - DPRINT("ExceptionRecord == NULL (normal)\n"); - - pExceptRec->ExceptionFlags = 0; - pExceptRec->ExceptionCode = STATUS_UNWIND; - pExceptRec->ExceptionRecord = NULL; - pExceptRec->ExceptionAddress = ReturnAddress; - pExceptRec->ExceptionInformation[0] = 0; - } - - if (RegistrationFrame) - pExceptRec->ExceptionFlags |= EXCEPTION_UNWINDING; - else - pExceptRec->ExceptionFlags |= (EXCEPTION_UNWINDING|EXCEPTION_EXIT_UNWIND); - -#ifndef NDEBUG - DPRINT("ExceptionFlags == 0x%x:\n", pExceptRec->ExceptionFlags); - if (pExceptRec->ExceptionFlags & EXCEPTION_UNWINDING) - { - DPRINT(" * EXCEPTION_UNWINDING (0x%x)\n", EXCEPTION_UNWINDING); - } - if (pExceptRec->ExceptionFlags & EXCEPTION_EXIT_UNWIND) - { - DPRINT(" * EXCEPTION_EXIT_UNWIND (0x%x)\n", EXCEPTION_EXIT_UNWIND); - } -#endif /* NDEBUG */ - - Context.ContextFlags = - (CONTEXT_i386 | CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS); - - SehpCaptureContext(&Context); - - DPRINT("Context.Eip = 0x%.08x\n", Context.Eip); - DPRINT("Context.Ebp = 0x%.08x\n", Context.Ebp); - DPRINT("Context.Esp = 0x%.08x\n", Context.Esp); - - Context.Esp += 0x10; - Context.Eax = EaxValue; - - // Begin traversing the list of EXCEPTION_REGISTRATION - while ((ULONG_PTR)ERHead != (ULONG_PTR)-1) - { - EXCEPTION_RECORD er2; - - DPRINT("ERHead 0x%X\n", ERHead); - - if (ERHead == RegistrationFrame) - { - DPRINT("Continueing execution\n"); - SehpContinue(&Context, FALSE); - return; - } - else - { - // If there's an exception frame, but it's lower on the stack - // than the head of the exception list, something's wrong! - if (RegistrationFrame && (RegistrationFrame <= ERHead)) - { - DPRINT("The exception frame is bad\n"); - - // Generate an exception to bail out - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - - RtlRaiseException(&er2); - } - } - -#if 0 - Stack = ERHead + sizeof(EXCEPTION_REGISTRATION); - if ( (Teb->Tib.StackBase <= (PVOID)ERHead ) // Make sure that ERHead - && (Teb->Tib.->StackLimit >= (PVOID)Stack ) // is in range, and a multiple - && (0 == ((ULONG_PTR)ERHead & 3)) ) // of 4 (i.e., sane) - { -#else - if (1) { -#endif - PEXCEPTION_REGISTRATION NewERHead; - PEXCEPTION_REGISTRATION pCurrExceptReg; - EXCEPTION_DISPOSITION ReturnValue; - - DPRINT("Executing handler at 0x%X for unwind\n", ERHead->handler); - - ReturnValue = RtlpExecuteHandlerForUnwind( - pExceptRec, - ERHead, - &Context, - &NewERHead, - ERHead->handler); - - DPRINT("Handler at 0x%X returned 0x%X\n", ERHead->handler, ReturnValue); - - if (ReturnValue != ExceptionContinueSearch) - { - if (ReturnValue != ExceptionCollidedUnwind) - { - DPRINT("Bad return value\n"); - - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_INVALID_DISPOSITION; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - - RtlRaiseException(&er2); - } - else - { - ERHead = NewERHead; - } - } - - pCurrExceptReg = ERHead; - ERHead = ERHead->prev; - - DPRINT("New ERHead is 0x%X\n", ERHead); - - DPRINT("Setting exception registration at 0x%X as current\n", - RegistrationFrame->prev); - - // Unlink the exception handler - SehpSetExceptionList(RegistrationFrame->prev); - } - else // The stack looks goofy! Raise an exception to bail out - { - DPRINT("Bad stack\n"); - - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_BAD_STACK; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - - RtlRaiseException(&er2); - } - } - - // If we get here, we reached the end of the EXCEPTION_REGISTRATION list. - // This shouldn't happen normally. - - DPRINT("Ran out of exception registrations. RegistrationFrame is (0x%X)\n", - RegistrationFrame); - - if ((ULONG_PTR)RegistrationFrame == (ULONG_PTR)-1) - SehpContinue(&Context, FALSE); - else - NtRaiseException(pExceptRec, &Context, 0); -} - /* EOF */ From b4dc709c434695d4577a95c2f8c503d8c0ce2817 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 1 Jul 2004 18:12:47 +0000 Subject: [PATCH 155/356] CVS maintaince svn path=/trunk/; revision=9957 --- reactos/lib/olepro32/.cvsignore | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/reactos/lib/olepro32/.cvsignore b/reactos/lib/olepro32/.cvsignore index 9edd5cbe53b..60c1df8b097 100644 --- a/reactos/lib/olepro32/.cvsignore +++ b/reactos/lib/olepro32/.cvsignore @@ -7,14 +7,4 @@ *.map *.tmp Makefile.ros -idb_hist_large.bmp -idb_hist_small.bmp -idb_std_small.bmp -idb_std_large.bmp -idb_view_large.bmp -idb_view_small.bmp -idc_divider.cur -idc_divideropen.cur -idi_dragarrow.ico -idt_check.bmp -comctl32.spec.def +olepro32.spec.def From 820eaf8fce9ce28977952584d6f99203e299865e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 1 Jul 2004 20:27:50 +0000 Subject: [PATCH 156/356] Fix a typo. Now the 'Advanced' page shows again. svn path=/trunk/; revision=9958 --- reactos/lib/cpl/sysdm/sysdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/cpl/sysdm/sysdm.c b/reactos/lib/cpl/sysdm/sysdm.c index a786ae656b9..c7c96da23cd 100644 --- a/reactos/lib/cpl/sysdm/sysdm.c +++ b/reactos/lib/cpl/sysdm/sysdm.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: sysdm.c,v 1.2 2004/06/30 10:53:05 ekohl Exp $ +/* $Id: sysdm.c,v 1.3 2004/07/01 20:27:50 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/sysdm.c @@ -106,7 +106,7 @@ SystemApplet(VOID) psh.hInstance = hApplet; psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); psh.pszCaption = Caption; - psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); psh.nStartPage = 0; psh.ppsp = psp; psh.pfnCallback = NULL; /* PropSheetProc; */ From 1c2af8076a413b5fcdef3a3fa5f9ede2942e2e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 1 Jul 2004 22:35:35 +0000 Subject: [PATCH 157/356] Handle file names like ./somename in SearchPath() svn path=/trunk/; revision=9959 --- reactos/lib/kernel32/file/dir.c | 169 ++++++++++++++++++++------------ 1 file changed, 107 insertions(+), 62 deletions(-) diff --git a/reactos/lib/kernel32/file/dir.c b/reactos/lib/kernel32/file/dir.c index fe69e74ce61..9f18ffbf979 100644 --- a/reactos/lib/kernel32/file/dir.c +++ b/reactos/lib/kernel32/file/dir.c @@ -1,4 +1,4 @@ -/* $Id: dir.c,v 1.46 2004/06/28 19:46:17 navaraf Exp $ +/* $Id: dir.c,v 1.47 2004/07/01 22:35:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -753,75 +753,120 @@ SearchPathW ( PWCHAR EnvironmentBufferW = NULL; PWCHAR AppPathW = NULL; WCHAR Buffer; - //WCHAR drv[3]; - + BOOL HasExtension; + LPCWSTR p; + PWCHAR Name; DPRINT("SearchPath\n"); - if (lpPath == NULL) + HasExtension = FALSE; + p = lpFileName + wcslen(lpFileName); + while (lpFileName < p && + L'\\' != *(p - 1) && + L'/' != *(p - 1) && + L':' != *(p - 1)) { - - AppPathW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(), - HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY, - MAX_PATH * sizeof(WCHAR)); - - - wcscat (AppPathW, NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer); - - len = wcslen (AppPathW); - - while (len && AppPathW[len - 1] != L'\\') - len--; - - if (len) AppPathW[len-1] = L'\0'; - - len = GetEnvironmentVariableW(L"PATH", &Buffer, 0); - len += 1 + GetCurrentDirectoryW(0, &Buffer); - len += 1 + GetSystemDirectoryW(&Buffer, 0); - len += 1 + GetWindowsDirectoryW(&Buffer, 0); - len += 1 + wcslen(AppPathW) * sizeof(WCHAR); - - EnvironmentBufferW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(), - HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY, - len * sizeof(WCHAR)); - if (EnvironmentBufferW == NULL) + HasExtension = HasExtension || L'.' == *(p - 1); + p--; + } + if (lpFileName < p) + { + if (HasExtension || NULL == lpExtension) { - SetLastError(ERROR_OUTOFMEMORY); - return 0; + Name = (PWCHAR) lpFileName; + } + else + { + Name = RtlAllocateHeap(GetProcessHeap(), + HEAP_GENERATE_EXCEPTIONS, + (wcslen(lpFileName) + wcslen(lpExtension) + 1) + * sizeof(WCHAR)); + if (NULL == Name) + { + SetLastError(ERROR_OUTOFMEMORY); + return 0; + } + wcscat(wcscpy(Name, lpFileName), lpExtension); + } + if (RtlDoesFileExists_U(Name)) + { + retCode = RtlGetFullPathName_U (Name, + nBufferLength * sizeof(WCHAR), + lpBuffer, + lpFilePart); + } + if (Name != lpFileName) + { + RtlFreeHeap(GetProcessHeap(), 0, Name); + } + } + else + { + if (lpPath == NULL) + { + + AppPathW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(), + HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY, + MAX_PATH * sizeof(WCHAR)); + + + wcscat (AppPathW, NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer); + + len = wcslen (AppPathW); + + while (len && AppPathW[len - 1] != L'\\') + len--; + + if (len) AppPathW[len-1] = L'\0'; + + len = GetEnvironmentVariableW(L"PATH", &Buffer, 0); + len += 1 + GetCurrentDirectoryW(0, &Buffer); + len += 1 + GetSystemDirectoryW(&Buffer, 0); + len += 1 + GetWindowsDirectoryW(&Buffer, 0); + len += 1 + wcslen(AppPathW) * sizeof(WCHAR); + + EnvironmentBufferW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(), + HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY, + len * sizeof(WCHAR)); + if (EnvironmentBufferW == NULL) + { + SetLastError(ERROR_OUTOFMEMORY); + return 0; + } + + pos = GetCurrentDirectoryW(len, EnvironmentBufferW); + EnvironmentBufferW[pos++] = L';'; + EnvironmentBufferW[pos] = 0; + pos += GetSystemDirectoryW(&EnvironmentBufferW[pos], len - pos); + EnvironmentBufferW[pos++] = L';'; + EnvironmentBufferW[pos] = 0; + pos += GetWindowsDirectoryW(&EnvironmentBufferW[pos], len - pos); + EnvironmentBufferW[pos++] = L';'; + EnvironmentBufferW[pos] = 0; + pos += GetEnvironmentVariableW(L"PATH", &EnvironmentBufferW[pos], len - pos); + EnvironmentBufferW[pos++] = L';'; + EnvironmentBufferW[pos] = 0; + wcscat (EnvironmentBufferW, AppPathW); + + RtlFreeHeap (RtlGetProcessHeap (), + 0, + AppPathW); + + lpPath = EnvironmentBufferW; + } - pos = GetCurrentDirectoryW(len, EnvironmentBufferW); - EnvironmentBufferW[pos++] = L';'; - EnvironmentBufferW[pos] = 0; - pos += GetSystemDirectoryW(&EnvironmentBufferW[pos], len - pos); - EnvironmentBufferW[pos++] = L';'; - EnvironmentBufferW[pos] = 0; - pos += GetWindowsDirectoryW(&EnvironmentBufferW[pos], len - pos); - EnvironmentBufferW[pos++] = L';'; - EnvironmentBufferW[pos] = 0; - pos += GetEnvironmentVariableW(L"PATH", &EnvironmentBufferW[pos], len - pos); - EnvironmentBufferW[pos++] = L';'; - EnvironmentBufferW[pos] = 0; - wcscat (EnvironmentBufferW, AppPathW); + retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension, + nBufferLength * sizeof(WCHAR), lpBuffer, lpFilePart); - RtlFreeHeap (RtlGetProcessHeap (), - 0, - AppPathW); - - lpPath = EnvironmentBufferW; - - } - - retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension, - nBufferLength * sizeof(WCHAR), lpBuffer, lpFilePart); - - if (EnvironmentBufferW != NULL) - { - RtlFreeHeap(GetProcessHeap(), 0, EnvironmentBufferW); - } - if (retCode == 0) - { - SetLastError(ERROR_FILE_NOT_FOUND); + if (EnvironmentBufferW != NULL) + { + RtlFreeHeap(GetProcessHeap(), 0, EnvironmentBufferW); + } + if (retCode == 0) + { + SetLastError(ERROR_FILE_NOT_FOUND); + } } return retCode / sizeof(WCHAR); } From db3e54f680b8259fd35c33e66c9349aed3a916da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 1 Jul 2004 22:36:16 +0000 Subject: [PATCH 158/356] Don't reset LastError on success svn path=/trunk/; revision=9960 --- reactos/lib/kernel32/file/create.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/reactos/lib/kernel32/file/create.c b/reactos/lib/kernel32/file/create.c index c6c90d4ebc2..3d71034ec8b 100644 --- a/reactos/lib/kernel32/file/create.c +++ b/reactos/lib/kernel32/file/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.35 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: create.c,v 1.36 2004/07/01 22:36:16 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -286,10 +286,6 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName, { SetLastError(ERROR_ALREADY_EXISTS); } - else - { - SetLastError(0); - } return FileHandle; } From ecae0d0647d7b6dc70c1e3ede561b2f82baae6cd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 1 Jul 2004 23:36:57 +0000 Subject: [PATCH 159/356] some little fixes svn path=/trunk/; revision=9961 --- reactos/subsys/system/regedit/hexedit.c | 137 +++++++++++++++--------- 1 file changed, 85 insertions(+), 52 deletions(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 718faaa233c..6333c131438 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -34,6 +34,7 @@ typedef struct DWORD MaxBuffer; DWORD ColumnsPerLine; DWORD nLines; + DWORD nVisibleLinesComplete; DWORD nVisibleLines; INT Position; INT LineHeight; @@ -90,7 +91,7 @@ UnregisterHexEditorClass(HINSTANCE hInstance) /*** Helper functions *********************************************************/ static VOID -HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Line, INT Column, BOOL HexDump) +HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, BOOL Scroll) { SCROLLINFO si; @@ -98,25 +99,28 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Line, INT Column, BOOL HexDump) si.fMask = SIF_POS; GetScrollInfo(hed->hWndSelf, SB_VERT, &si); - if(si.nPos > Line) + if(Scroll) { - si.nPos = Line; - SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); - GetScrollInfo(hed->hWndSelf, SB_VERT, &si); - InvalidateRect(hed->hWndSelf, NULL, TRUE); - } - else if((Line - si.nPos) > hed->nVisibleLines) - { - si.nPos += (Line - si.nPos); - SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); - GetScrollInfo(hed->hWndSelf, SB_VERT, &si); - InvalidateRect(hed->hWndSelf, NULL, TRUE); + if(si.nPos > hed->CaretLine) + { + si.nPos = hed->CaretLine; + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + InvalidateRect(hed->hWndSelf, NULL, TRUE); + } + else if(hed->CaretLine >= (hed->nVisibleLinesComplete + si.nPos)) + { + si.nPos = hed->CaretLine - hed->nVisibleLinesComplete + 1; + SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); + GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + InvalidateRect(hed->hWndSelf, NULL, TRUE); + } } - if(HexDump) - SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing) * hed->CharWidth) - 2, (Line - si.nPos) * hed->LineHeight); + if(hed->EditingField) + SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol)) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight); else - SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine)) * hed->CharWidth) - 2, (Line - si.nPos) * hed->LineHeight); + SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, (hed->CaretLine - si.nPos) * hed->LineHeight); } static VOID @@ -139,7 +143,8 @@ HEXEDIT_Update(PHEXEDIT_DATA hed) if(hed->LineHeight > 0) { - hed->nVisibleLines = cvislines = rcClient.bottom / hed->LineHeight; + hed->nVisibleLinesComplete = cvislines = rcClient.bottom / hed->LineHeight; + hed->nVisibleLines = hed->nVisibleLinesComplete; if(rcClient.bottom % hed->LineHeight) { hed->nVisibleLines++; @@ -527,7 +532,7 @@ static LRESULT HEXEDIT_WM_SETFOCUS(PHEXEDIT_DATA hed) { CreateCaret(hed->hWndSelf, 0, 1, hed->LineHeight); - HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); + HEXEDIT_MoveCaret(hed, FALSE); ShowCaret(hed->hWndSelf); return 0; } @@ -725,35 +730,16 @@ HEXEDIT_WM_MOUSEWHEEL(PHEXEDIT_DATA hed, int cyMoveLines, WORD ButtonsDown, LPPO } static LRESULT -HEXEDIT_WM_SETCURSOR(PHEXEDIT_DATA hed) +HEXEDIT_WM_GETDLGCODE(LPMSG Msg) { - POINTS pt; - DWORD Hit, Pos; - - Pos = GetMessagePos(); - pt = MAKEPOINTS(Pos); - Hit = HEXEDIT_HitRegionTest(hed, pt, NULL); - - switch(Hit) - { - case HEHT_HEXDUMP: - case HEHT_HEXDUMPSPACING: - case HEHT_ASCIIDUMP: - SetCursor(LoadCursor(0, MAKEINTRESOURCE(IDC_IBEAM))); - break; - - default: - SetCursor(LoadCursor(0, MAKEINTRESOURCE(IDC_ARROW))); - break; - } - return TRUE; + return DLGC_WANTARROWS | DLGC_WANTCHARS; } static BOOL HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) { DWORD bufsize; - BOOL shift, control, handled; + BOOL shift, control; if(GetKeyState(VK_MENU) & 0x8000) { @@ -764,7 +750,6 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) control = GetKeyState(VK_CONTROL) & 0x8000; bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); - handled = FALSE; switch(VkCode) { @@ -778,10 +763,8 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) } else hed->Position--; - - HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); } - handled = TRUE; + HEXEDIT_MoveCaret(hed, TRUE); break; case VK_RIGHT: @@ -789,15 +772,54 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) { if(++hed->CaretCol > hed->ColumnsPerLine) { - hed->CaretLine = 0; + hed->CaretCol = 0; hed->CaretLine++; } else hed->Position++; - - HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); } - handled = TRUE; + HEXEDIT_MoveCaret(hed, TRUE); + break; + + case VK_UP: + if(hed->Position > 0) + { + if(hed->CaretLine <= 0) + { + hed->CaretCol = 0; + hed->Position = 0; + } + else + { + hed->CaretLine--; + hed->Position -= hed->ColumnsPerLine; + } + } + HEXEDIT_MoveCaret(hed, TRUE); + break; + + case VK_DOWN: + if(hed->Position <= bufsize) + { + if(hed->CaretLine < hed->nLines - 1) + { + hed->Position += hed->ColumnsPerLine; + hed->CaretLine++; + if(hed->Position > bufsize) + { + hed->Position = bufsize; + hed->CaretLine = (hed->nLines > 0 ? hed->nLines - 1 : 0); + hed->CaretCol = bufsize % hed->ColumnsPerLine; + } + } + else + { + INT tmp = bufsize % hed->ColumnsPerLine; + hed->Position = bufsize; + hed->CaretCol = (tmp == 0 ? hed->ColumnsPerLine : tmp); + } + } + HEXEDIT_MoveCaret(hed, TRUE); break; } @@ -826,9 +848,6 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_PAINT: return HEXEDIT_WM_PAINT(hed); - case WM_SETCURSOR: - return HEXEDIT_WM_SETCURSOR(hed); - case WM_KEYDOWN: return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam); @@ -839,7 +858,18 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return HEXEDIT_WM_SIZE(hed, (DWORD)wParam, LOWORD(lParam), HIWORD(lParam)); case WM_MOUSEWHEEL: - return HEXEDIT_WM_MOUSEWHEEL(hed, ((SHORT)(wParam >> 16) < 0 ? 3 : -3), LOWORD(wParam), &MAKEPOINTS(lParam)); + { + UINT nScrollLines = 3; + int delta = 0; + + SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &nScrollLines, 0); + delta -= (SHORT)HIWORD(wParam); + if(abs(delta) >= WHEEL_DELTA && nScrollLines != 0) + { + return HEXEDIT_WM_MOUSEWHEEL(hed, nScrollLines * (delta / WHEEL_DELTA), LOWORD(wParam), &MAKEPOINTS(lParam)); + } + break; + } case HEM_LOADBUFFER: return HEXEDIT_HEM_LOADBUFFER(hed, (PVOID)wParam, (DWORD)lParam); @@ -856,6 +886,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_KILLFOCUS: return HEXEDIT_WM_KILLFOCUS(hed); + case WM_GETDLGCODE: + return HEXEDIT_WM_GETDLGCODE((LPMSG)lParam); + case WM_SETFONT: return HEXEDIT_WM_SETFONT(hed, (HFONT)wParam, (BOOL)LOWORD(lParam)); From d0ea8e8ce1fc42e9c430af51472a9acf993dd2d6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 1 Jul 2004 23:56:04 +0000 Subject: [PATCH 160/356] merge patch from wine by Robert Shearman (http://www.winehq.org/hypermail/wine-patches/2004/06/0108.html) svn path=/trunk/; revision=9962 --- reactos/subsys/system/regedit/treeview.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/subsys/system/regedit/treeview.c b/reactos/subsys/system/regedit/treeview.c index 7131adb610e..c7cf2e8dcf6 100644 --- a/reactos/subsys/system/regedit/treeview.c +++ b/reactos/subsys/system/regedit/treeview.c @@ -203,6 +203,7 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv) LPCTSTR keyPath; LPTSTR Name; LONG errCode; + HCURSOR hcursorOld; static int expanding; if (expanding) return FALSE; @@ -210,6 +211,8 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv) return TRUE; } expanding = TRUE; + hcursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT)); + SendMessage(hwndTV, WM_SETREDRAW, FALSE, 0); keyPath = GetItemPath(hwndTV, pnmtv->itemNew.hItem, &hRoot); if (!keyPath) goto done; @@ -249,6 +252,8 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv) HeapFree(GetProcessHeap(), 0, Name); done: + SendMessage(hwndTV, WM_SETREDRAW, TRUE, 0); + SetCursor(hcursorOld); expanding = FALSE; return TRUE; From 8467d37d7d6d2bdc437a1a8c59a5b6c3f2666b95 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Thu, 1 Jul 2004 23:58:44 +0000 Subject: [PATCH 161/356] merge in kjk_hyperion's ZwContinue test svn path=/trunk/; revision=9963 --- reactos/apps/tests/zwcontinue/.cvsignore | 6 + reactos/apps/tests/zwcontinue/Makefile | 23 +++ reactos/apps/tests/zwcontinue/i386/.cvsignore | 2 + .../apps/tests/zwcontinue/i386/zwcontinue.asm | 48 +++++ reactos/apps/tests/zwcontinue/zwcontinue.c | 185 ++++++++++++++++++ 5 files changed, 264 insertions(+) create mode 100644 reactos/apps/tests/zwcontinue/.cvsignore create mode 100644 reactos/apps/tests/zwcontinue/Makefile create mode 100644 reactos/apps/tests/zwcontinue/i386/.cvsignore create mode 100644 reactos/apps/tests/zwcontinue/i386/zwcontinue.asm create mode 100644 reactos/apps/tests/zwcontinue/zwcontinue.c diff --git a/reactos/apps/tests/zwcontinue/.cvsignore b/reactos/apps/tests/zwcontinue/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/zwcontinue/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/zwcontinue/Makefile b/reactos/apps/tests/zwcontinue/Makefile new file mode 100644 index 00000000000..a99bb3da2dc --- /dev/null +++ b/reactos/apps/tests/zwcontinue/Makefile @@ -0,0 +1,23 @@ +# $Id: Makefile,v 1.2 2004/07/01 23:58:44 royce Exp $ + +PATH_TO_TOP = ../../.. + +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 diff --git a/reactos/apps/tests/zwcontinue/i386/.cvsignore b/reactos/apps/tests/zwcontinue/i386/.cvsignore new file mode 100644 index 00000000000..6142305dc12 --- /dev/null +++ b/reactos/apps/tests/zwcontinue/i386/.cvsignore @@ -0,0 +1,2 @@ +*.o +*.d diff --git a/reactos/apps/tests/zwcontinue/i386/zwcontinue.asm b/reactos/apps/tests/zwcontinue/i386/zwcontinue.asm new file mode 100644 index 00000000000..c8116412389 --- /dev/null +++ b/reactos/apps/tests/zwcontinue/i386/zwcontinue.asm @@ -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 diff --git a/reactos/apps/tests/zwcontinue/zwcontinue.c b/reactos/apps/tests/zwcontinue/zwcontinue.c new file mode 100644 index 00000000000..637f0221c51 --- /dev/null +++ b/reactos/apps/tests/zwcontinue/zwcontinue.c @@ -0,0 +1,185 @@ +#define WIN32_LEAN_AND_MEAN +#define STRICT +#include + +#include +#include +#include +#include +#include +#include +#include + +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; +} From 837baf14b463d5ed67ae0c125b28649e6f8a5b40 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 2 Jul 2004 00:47:57 +0000 Subject: [PATCH 162/356] NtContinue fixed to return failure on invalid params ( not checking for access violations yet ), but not clobber EAX on success. This patch was made possiblel by the collaborative efforts of myself, kjk_hyperion, Art Yerkes, and Skywing. svn path=/trunk/; revision=9964 --- reactos/ntoskrnl/Makefile.i386 | 5 +- reactos/ntoskrnl/ke/i386/syscall.S | 21 +++++- reactos/ntoskrnl/ps/i386/continue.c | 99 +++++++++++++++++++++++++++++ reactos/ntoskrnl/ps/thread.c | 98 +++++++++++----------------- 4 files changed, 157 insertions(+), 66 deletions(-) create mode 100644 reactos/ntoskrnl/ps/i386/continue.c diff --git a/reactos/ntoskrnl/Makefile.i386 b/reactos/ntoskrnl/Makefile.i386 index 0d8870edf2f..76c401c421d 100644 --- a/reactos/ntoskrnl/Makefile.i386 +++ b/reactos/ntoskrnl/Makefile.i386 @@ -51,7 +51,10 @@ OBJECTS_RTL_I386 := \ rtl/i386/exception.o \ rtl/i386/seh.o +OBJECTS_PS_I386 := \ + ps/i386/continue.o + RTL_EXCLUDE_FILTER := OBJECTS_ARCH = $(OBJECTS_BOOT) $(OBJECTS_EX_I386) $(OBJECTS_KE_I386) $(OBJECTS_MM_I386) \ - $(OBJECTS_RTL_I386) + $(OBJECTS_RTL_I386) $(OBJECTS_PS_I386) diff --git a/reactos/ntoskrnl/ke/i386/syscall.S b/reactos/ntoskrnl/ke/i386/syscall.S index db7a885abe7..78de008b62b 100644 --- a/reactos/ntoskrnl/ke/i386/syscall.S +++ b/reactos/ntoskrnl/ke/i386/syscall.S @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: syscall.S,v 1.15 2004/07/01 01:52:37 royce Exp $ +/* $Id: syscall.S,v 1.16 2004/07/02 00:47:57 royce Exp $ * * FILE: ntoskrnl/hal/x86/syscall.s * PURPOSE: 2E trap handler @@ -94,6 +94,7 @@ L3: pushl $0 /* XXX: TempCS */ pushl $0 /* XXX: DebugPointer */ pushl $0 /* XXX: DebugArgMark */ + #ifdef DBG /* Trick gdb 6 into backtracing over the system call */ movl 4(%ebp), %ebx @@ -260,6 +261,17 @@ KeReturnFromSystemCall: movl %ebx, KTHREAD_TRAP_FRAME(%esi) KiRosTrapReturn: + +#if 0 + mov KTRAP_FRAME_RESERVED1(%ebp), %ax + cmp %ax, SSIDX_NTCONTINUE + jnz KeNoEpilogPrint + movl KTRAP_FRAME_ESP(%ebp), %ecx + movl KTRAP_FRAME_EBP(%ebp), %edx + call @KeRosPrintEspEbp@8 +KeNoEpilogPrint: +#endif + /* Skip debug information and unsaved registers */ addl $0x30, %esp popl %gs @@ -291,6 +303,11 @@ KiRosTrapReturn: */ .globl @KeRosTrapReturn@8 @KeRosTrapReturn@8: + + /* point %esp to the trap frame to restore */ + movl %ecx, %esp + movl %esp, %ebp + /* Call the post system call hook and deliver any pending APCs */ pushl %esp call _KiAfterSystemCallHook @@ -302,6 +319,4 @@ KiRosTrapReturn: /* Restore the old trap frame pointer */ movl %edx, KTHREAD_TRAP_FRAME(%esi) - /* point %esp to the trap frame to restore */ - movl %ecx, %esp jmp KiRosTrapReturn; diff --git a/reactos/ntoskrnl/ps/i386/continue.c b/reactos/ntoskrnl/ps/i386/continue.c new file mode 100644 index 00000000000..00fdd8c5e14 --- /dev/null +++ b/reactos/ntoskrnl/ps/i386/continue.c @@ -0,0 +1,99 @@ +/* $Id: continue.c,v 1.1 2004/07/02 00:47:57 royce Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ps/i386/continue.c + * PURPOSE: i386 implementation of NtContinue() + * PROGRAMMER: Royce Mitchell III, kjk_hyperion + * REVISION HISTORY: + * 29/06/04: Created + */ + +/* INCLUDES ****************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + +#if 1 +VOID +FASTCALL +KeRosTrapReturn ( PKTRAP_FRAME TrapFrame, PKTRAP_FRAME PrevTrapFrame ); + +VOID STDCALL +KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ); + +/* + * @implemented + */ +NTSTATUS STDCALL +NtContinue ( + IN PCONTEXT Context, + IN BOOLEAN TestAlert) +{ + PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; + PKTRAP_FRAME PrevTrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; + + DPRINT1("NtContinue: Context: Eip=0x%x, Esp=0x%x\n", Context->Eip, Context->Esp ); + PULONG Frame = 0; + __asm__("mov %%ebp, %%ebx" : "=b" (Frame) : ); + DbgPrint ( "NtContinue(): Ebp=%x, prev/TF=%x/%x\n", Frame, Frame[0], TrapFrame ); + KeRosDumpStackFrames(NULL,5); + + if ( Context == NULL ) + { + DPRINT1("NtContinue called with NULL Context\n"); + return STATUS_INVALID_PARAMETER; + } + + if ( TrapFrame == NULL ) + { + CPRINT("NtContinue called but TrapFrame was NULL\n"); + KEBUGCHECK(0); + } + + /* + * Copy the supplied context over the register information that was saved + * on entry to kernel mode, it will then be restored on exit + * FIXME: Validate the context + */ + KeContextToTrapFrame ( Context, TrapFrame ); + + KeRosTrapReturn ( TrapFrame, PrevTrapFrame ); + + return STATUS_SUCCESS; /* this doesn't actually happen b/c KeRosTrapReturn() won't return */ +} +#else +NTSTATUS STDCALL +NtContinue ( + IN PCONTEXT Context, + IN BOOLEAN TestAlert) +{ + PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; + PULONG Frame = 0; + __asm__("mov %%ebp, %%ebx" : "=b" (Frame) : ); + DbgPrint ( "NtContinue(): Ebp=%x, prev/TF=%x/%x\n", Frame, Frame[0], TrapFrame ); + + /* + * Copy the supplied context over the register information that was saved + * on entry to kernel mode, it will then be restored on exit + * FIXME: Validate the context + */ + if ( TrapFrame == NULL ) + { + CPRINT("NtContinue called but TrapFrame was NULL\n"); + KEBUGCHECK(0); + } + KeContextToTrapFrame ( Context, TrapFrame ); + return(STATUS_SUCCESS); +} +#endif diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index a8e33d9b6e8..e04ff087bd6 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -1,21 +1,21 @@ -/* $Id: thread.c,v 1.125 2004/07/01 02:40:23 hyperion Exp $ +/* $Id: thread.c,v 1.126 2004/07/02 00:47:57 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/ps/thread.c * PURPOSE: Thread managment * PROGRAMMER: David Welch (welch@mcmail.com) - * REVISION HISTORY: + * REVISION HISTORY: * 23/06/98: Created * 12/10/99: Phillip Susi: Thread priorities, and APC work */ /* * NOTE: - * + * * All of the routines that manipulate the thread queue synchronize on * a single spinlock - * + * */ /* INCLUDES ****************************************************************/ @@ -79,7 +79,7 @@ HANDLE STDCALL PsGetCurrentThreadId(VOID) return(PsGetCurrentThread()->Cid.UniqueThread); } -static VOID +static VOID PsInsertIntoThreadList(KPRIORITY Priority, PETHREAD Thread) { assert(THREAD_STATE_READY == Thread->Tcb.State); @@ -111,16 +111,16 @@ VOID PsDumpThreads(BOOLEAN IncludeSystem) PETHREAD current; ULONG t; ULONG i; - + current_entry = PiThreadListHead.Flink; t = 0; - + while (current_entry != &PiThreadListHead) { PULONG Ebp; PULONG Esp; - current = CONTAINING_RECORD(current_entry, ETHREAD, + current = CONTAINING_RECORD(current_entry, ETHREAD, Tcb.ThreadListEntry); t++; if (t > PiNrThreads) @@ -131,9 +131,9 @@ VOID PsDumpThreads(BOOLEAN IncludeSystem) if (IncludeSystem || current->ThreadsProcess->UniqueProcessId >= 6) { DbgPrint("current->Tcb.State %d PID.TID %d.%d Name %.8s Stack: \n", - current->Tcb.State, + current->Tcb.State, current->ThreadsProcess->UniqueProcessId, - current->Cid.UniqueThread, + current->Cid.UniqueThread, current->ThreadsProcess->ImageFileName); if (current->Tcb.State == THREAD_STATE_READY || current->Tcb.State == THREAD_STATE_SUSPENDED || @@ -227,7 +227,7 @@ VOID PsDispatchThreadNoLock (ULONG NewThreadStatus) DPRINT("PsDispatchThread() %d/%d/%d/%d\n", KeGetCurrentProcessorNumber(), CurrentThread->Cid.UniqueThread, NewThreadStatus, CurrentThread->Tcb.State); - + CurrentThread->Tcb.State = (UCHAR)NewThreadStatus; if (CurrentThread->Tcb.State == THREAD_STATE_READY) { @@ -238,7 +238,7 @@ VOID PsDispatchThreadNoLock (ULONG NewThreadStatus) { PiNrThreadsAwaitingReaping++; } - + Affinity = 1 << KeGetCurrentProcessorNumber(); for (CurrentPriority = HIGH_PRIORITY; CurrentPriority >= LOW_PRIORITY; @@ -256,12 +256,12 @@ VOID PsDispatchThreadNoLock (ULONG NewThreadStatus) PETHREAD OldThread; DPRINT("Scheduling %x(%d)\n",Candidate, CurrentPriority); - + Candidate->Tcb.State = THREAD_STATE_RUNNING; - + OldThread = CurrentThread; CurrentThread = Candidate; -#if 0 +#if 0 /* * This code is moved to the end of KiArchContextSwitch. * It should be execute after the context switch. @@ -271,7 +271,7 @@ VOID PsDispatchThreadNoLock (ULONG NewThreadStatus) { PiWakeupReaperThread(); } -#endif +#endif KiArchContextSwitch(&CurrentThread->Tcb, &OldThread->Tcb); return; } @@ -284,12 +284,12 @@ VOID STDCALL PsDispatchThread(ULONG NewThreadStatus) { KIRQL oldIrql; - + if (!DoneInitYet) { return; } - + KeAcquireSpinLock(&PiThreadListLock, &oldIrql); /* * Save wait IRQL @@ -385,8 +385,8 @@ PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, VOID PsFreezeAllThreads(PEPROCESS Process) /* - * Used by the debugging code to freeze all the process's threads - * while the debugger is examining their state. + * Used by the debugging code to freeze all the process's threads + * while the debugger is examining their state. */ { KIRQL oldIrql; @@ -398,7 +398,7 @@ PsFreezeAllThreads(PEPROCESS Process) current_entry = Process->ThreadListHead.Flink; while (current_entry != &Process->ThreadListHead) { - current = CONTAINING_RECORD(current_entry, ETHREAD, + current = CONTAINING_RECORD(current_entry, ETHREAD, Tcb.ProcessThreadListEntry); /* @@ -408,14 +408,14 @@ PsFreezeAllThreads(PEPROCESS Process) current_entry = current_entry->Flink; } - + KeReleaseSpinLock(&PiThreadListLock, oldIrql); } VOID PsApplicationProcessorInit(VOID) { - ((PIKPCR) KeGetCurrentKPCR())->CurrentThread = + ((PIKPCR) KeGetCurrentKPCR())->CurrentThread = (PVOID)IdleThreads[KeGetCurrentProcessorNumber()]; } @@ -429,7 +429,7 @@ PsPrepareForApplicationProcessorInit(ULONG Id) &IdleThread, &IdleThreadHandle, THREAD_ALL_ACCESS, - NULL, + NULL, TRUE); IdleThread->Tcb.State = THREAD_STATE_RUNNING; IdleThread->Tcb.FreezeCount = 0; @@ -452,7 +452,7 @@ PsInitThreadManagment(VOID) ULONG i; HANDLE FirstThreadHandle; NTSTATUS Status; - + KeInitializeSpinLock(&PiThreadListLock); for (i=0; i < MAXIMUM_PRIORITY; i++) { @@ -460,9 +460,9 @@ PsInitThreadManagment(VOID) } InitializeListHead(&PiThreadListHead); - + PsThreadType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); - + PsThreadType->Tag = TAG('T', 'H', 'R', 'T'); PsThreadType->TotalObjects = 0; PsThreadType->TotalHandles = 0; @@ -481,9 +481,9 @@ PsInitThreadManagment(VOID) PsThreadType->OkayToClose = NULL; PsThreadType->Create = NULL; PsThreadType->DuplicationNotify = NULL; - + RtlRosInitUnicodeStringFromLiteral(&PsThreadType->TypeName, L"Thread"); - + ObpCreateTypeObject(PsThreadType); PsInitializeThread(NULL,&FirstThread,&FirstThreadHandle, @@ -492,9 +492,9 @@ PsInitThreadManagment(VOID) FirstThread->Tcb.FreezeCount = 0; ((PIKPCR) KeGetCurrentKPCR())->CurrentThread = (PVOID)FirstThread; NtClose(FirstThreadHandle); - + DPRINT("FirstThread %x\n",FirstThread); - + DoneInitYet = TRUE; /* @@ -559,12 +559,12 @@ KeSetPriorityThread (PKTHREAD Thread, KPRIORITY Priority) KIRQL oldIrql; PKTHREAD CurrentThread; ULONG Mask; - + if (Priority < LOW_PRIORITY || Priority >= MAXIMUM_PRIORITY) { KEBUGCHECK(0); } - + KeAcquireSpinLock(&PiThreadListLock, &oldIrql); OldPriority = Thread->Priority; @@ -635,7 +635,7 @@ NtAlertThread (IN HANDLE ThreadHandle) PETHREAD Thread; NTSTATUS Status; NTSTATUS ThreadStatus; - + Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_SUSPEND_RESUME, PsThreadType, @@ -646,10 +646,10 @@ NtAlertThread (IN HANDLE ThreadHandle) { return(Status); } - + ThreadStatus = STATUS_ALERTED; (VOID)PsUnblockThread(Thread, &ThreadStatus); - + ObDereferenceObject(Thread); return(STATUS_SUCCESS); } @@ -721,32 +721,6 @@ NtOpenThread(OUT PHANDLE ThreadHandle, return(Status); } -NTSTATUS STDCALL -NtContinue(IN PCONTEXT Context, - IN BOOLEAN TestAlert) -{ - PKTRAP_FRAME TrapFrame; - - /* - * Copy the supplied context over the register information that was saved - * on entry to kernel mode, it will then be restored on exit - * FIXME: Validate the context - */ - TrapFrame = KeGetCurrentThread()->TrapFrame; - if (TrapFrame == NULL) - { - CPRINT("NtContinue called but TrapFrame was NULL\n"); - KEBUGCHECK(0); - } - KeContextToTrapFrame(Context, TrapFrame); - - if(TestAlert) - KiTestAlert(); - - return(STATUS_SUCCESS); -} - - NTSTATUS STDCALL NtYieldExecution(VOID) { From 22755559276b140324414713c0d9df02c6e82752 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 2 Jul 2004 01:23:26 +0000 Subject: [PATCH 163/356] (remove old disabled code) svn path=/trunk/; revision=9965 --- reactos/ntoskrnl/ps/i386/continue.c | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/reactos/ntoskrnl/ps/i386/continue.c b/reactos/ntoskrnl/ps/i386/continue.c index 00fdd8c5e14..8e32a7c9b13 100644 --- a/reactos/ntoskrnl/ps/i386/continue.c +++ b/reactos/ntoskrnl/ps/i386/continue.c @@ -1,4 +1,4 @@ -/* $Id: continue.c,v 1.1 2004/07/02 00:47:57 royce Exp $ +/* $Id: continue.c,v 1.2 2004/07/02 01:23:26 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,7 +24,6 @@ #define NDEBUG #include -#if 1 VOID FASTCALL KeRosTrapReturn ( PKTRAP_FRAME TrapFrame, PKTRAP_FRAME PrevTrapFrame ); @@ -72,28 +71,3 @@ NtContinue ( return STATUS_SUCCESS; /* this doesn't actually happen b/c KeRosTrapReturn() won't return */ } -#else -NTSTATUS STDCALL -NtContinue ( - IN PCONTEXT Context, - IN BOOLEAN TestAlert) -{ - PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; - PULONG Frame = 0; - __asm__("mov %%ebp, %%ebx" : "=b" (Frame) : ); - DbgPrint ( "NtContinue(): Ebp=%x, prev/TF=%x/%x\n", Frame, Frame[0], TrapFrame ); - - /* - * Copy the supplied context over the register information that was saved - * on entry to kernel mode, it will then be restored on exit - * FIXME: Validate the context - */ - if ( TrapFrame == NULL ) - { - CPRINT("NtContinue called but TrapFrame was NULL\n"); - KEBUGCHECK(0); - } - KeContextToTrapFrame ( Context, TrapFrame ); - return(STATUS_SUCCESS); -} -#endif From 6a225669b558a974dacf5d0833e0dd80ec6873a7 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Fri, 2 Jul 2004 01:26:29 +0000 Subject: [PATCH 164/356] Services file for WS2_32.dll, created by Cameron Palmer. svn path=/trunk/; revision=9966 --- reactos/media/drivers/etc/services | 8234 ++++++++++++++++++++++++++++ 1 file changed, 8234 insertions(+) create mode 100644 reactos/media/drivers/etc/services diff --git a/reactos/media/drivers/etc/services b/reactos/media/drivers/etc/services new file mode 100644 index 00000000000..3fc6e36df6f --- /dev/null +++ b/reactos/media/drivers/etc/services @@ -0,0 +1,8234 @@ +# The ReactOS services file +# +# This file contains port numbers for well-known services defined by IANA +# +# The Well Known Ports are thuse from 0 through 1023 +# The Registered Ports are those from 1024 through 49151 +# The Dynamic and/or Private Ports are those from 49152 through 65535 +# +# Format: +# / [aliases...] [#] +# + +tcpmux 1/tcp #TCP Port Service Multiplexer +tcpmux 1/udp #TCP Port Service Multiplexer +compressnet 2/tcp #Management Utility +compressnet 2/udp #Management Utility +compressnet 3/tcp #Compression Process +compressnet 3/udp #Compression Process +rje 5/tcp #Remote Job Entry +rje 5/udp #Remote Job Entry +echo 7/tcp #Echo +echo 7/udp #Echo +discard 9/tcp #Discard +discard 9/udp #Discard +systat 11/tcp #Active Users +systat 11/udp #Active Users +daytime 13/tcp #Daytime (RFC 867) +daytime 13/udp #Daytime (RFC 867) +qotd 17/tcp #Quote of the Day +qotd 17/udp #Quote of the Day +msp 18/tcp #Message Send Protocol +msp 18/udp #Message Send Protocol +chargen 19/tcp #Character Generator +chargen 19/udp #Character Generator +ftp-data 20/tcp #File Transfer [Default Data] +ftp-data 20/udp #File Transfer [Default Data] +ftp 21/tcp #File Transfer [Control] +ftp 21/udp #File Transfer [Control] +ssh 22/tcp #SSH Remote Login Protocol +ssh 22/udp #SSH Remote Login Protocol +telnet 23/tcp #Telnet +telnet 23/udp #Telnet +smtp 25/tcp #Simple Mail Transfer +smtp 25/udp #Simple Mail Transfer +nsw-fe 27/tcp #NSW User System FE +nsw-fe 27/udp #NSW User System FE +msg-icp 29/tcp #MSG ICP +msg-icp 29/udp #MSG ICP +msg-auth 31/tcp #MSG Authentication +msg-auth 31/udp #MSG Authentication +dsp 33/tcp #Display Support Protocol +dsp 33/udp #Display Support Protocol +time 37/tcp #Time +time 37/udp #Time +rap 38/tcp #Route Access Protocol +rap 38/udp #Route Access Protocol +rlp 39/tcp #Resource Location Protocol +rlp 39/udp #Resource Location Protocol +graphics 41/tcp #Graphics +graphics 41/udp #Graphics +name 42/tcp #Host Name Server +name 42/udp #Host Name Server +nameserver 42/tcp #Host Name Server +nameserver 42/udp #Host Name Server +nicname 43/tcp #Who Is +nicname 43/udp #Who Is +mpm-flags 44/tcp #MPM FLAGS Protocol +mpm-flags 44/udp #MPM FLAGS Protocol +mpm 45/tcp #Message Processing Module [recv] +mpm 45/udp #Message Processing Module [recv] +mpm-snd 46/tcp #MPM [default send] +mpm-snd 46/udp #MPM [default send] +ni-ftp 47/tcp #NI FTP +ni-ftp 47/udp #NI FTP +auditd 48/tcp #Digital Audit Daemon +auditd 48/udp #Digital Audit Daemon +tacacs 49/tcp #Login Host Protocol (TACACS) +tacacs 49/udp #Login Host Protocol (TACACS) +re-mail-ck 50/tcp #Remote Mail Checking Protocol +re-mail-ck 50/udp #Remote Mail Checking Protocol +la-maint 51/tcp #IMP Logical Address Maintenance +la-maint 51/udp #IMP Logical Address Maintenance +xns-time 52/tcp #XNS Time Protocol +xns-time 52/udp #XNS Time Protocol +domain 53/tcp #Domain Name Server +domain 53/udp #Domain Name Server +xns-ch 54/tcp #XNS Clearinghouse +xns-ch 54/udp #XNS Clearinghouse +isi-gl 55/tcp #ISI Graphics Language +isi-gl 55/udp #ISI Graphics Language +xns-auth 56/tcp #XNS Authentication +xns-auth 56/udp #XNS Authentication +xns-mail 58/tcp #XNS Mail +xns-mail 58/udp #XNS Mail +ni-mail 61/tcp #NI MAIL +ni-mail 61/udp #NI MAIL +acas 62/tcp #ACA Services +acas 62/udp #ACA Services +whois++ 63/tcp #whois++ +whois++ 63/udp #whois++ +covia 64/tcp #Communications Integrator (CI) +covia 64/udp #Communications Integrator (CI) +tacacs-ds 65/tcp #TACACS-Database Service +tacacs-ds 65/udp #TACACS-Database Service +sql*net 66/tcp #Oracle SQL*NET +sql*net 66/udp #Oracle SQL*NET +bootps 67/tcp #Bootstrap Protocol Server +bootps 67/udp #Bootstrap Protocol Server +bootpc 68/tcp #Bootstrap Protocol Client +bootpc 68/udp #Bootstrap Protocol Client +tftp 69/tcp #Trivial File Transfer +tftp 69/udp #Trivial File Transfer +gopher 70/tcp #Gopher +gopher 70/udp #Gopher +netrjs-1 71/tcp #Remote Job Service +netrjs-1 71/udp #Remote Job Service +netrjs-2 72/tcp #Remote Job Service +netrjs-2 72/udp #Remote Job Service +netrjs-3 73/tcp #Remote Job Service +netrjs-3 73/udp #Remote Job Service +netrjs-4 74/tcp #Remote Job Service +netrjs-4 74/udp #Remote Job Service +deos 76/tcp #Distributed External Object Store +deos 76/udp #Distributed External Object Store +vettcp 78/tcp #vettcp +vettcp 78/udp #vettcp +finger 79/tcp #Finger +finger 79/udp #Finger +http 80/tcp #World Wide Web HTTP +http 80/udp #World Wide Web HTTP +www 80/tcp #World Wide Web HTTP +www 80/udp #World Wide Web HTTP +www-http 80/tcp #World Wide Web HTTP +www-http 80/udp #World Wide Web HTTP +hosts2-ns 81/tcp #HOSTS2 Name Server +hosts2-ns 81/udp #HOSTS2 Name Server +xfer 82/tcp #XFER Utility +xfer 82/udp #XFER Utility +mit-ml-dev 83/tcp #MIT ML Device +mit-ml-dev 83/udp #MIT ML Device +ctf 84/tcp #Common Trace Facility +ctf 84/udp #Common Trace Facility +mit-ml-dev 85/tcp #MIT ML Device +mit-ml-dev 85/udp #MIT ML Device +mfcobol 86/tcp #Micro Focus Cobol +mfcobol 86/udp #Micro Focus Cobol +kerberos 88/tcp #Kerberos +kerberos 88/udp #Kerberos +su-mit-tg 89/tcp #SU/MIT Telnet Gateway +su-mit-tg 89/udp #SU/MIT Telnet Gateway +dnsix 90/tcp #DNSIX Securit Attribute Token Map +dnsix 90/udp #DNSIX Securit Attribute Token Map +mit-dov 91/tcp #MIT Dover Spooler +mit-dov 91/udp #MIT Dover Spooler +npp 92/tcp #Network Printing Protocol +npp 92/udp #Network Printing Protocol +dcp 93/tcp #Device Control Protocol +dcp 93/udp #Device Control Protocol +objcall 94/tcp #Tivoli Object Dispatcher +objcall 94/udp #Tivoli Object Dispatcher +supdup 95/tcp #SUPDUP +supdup 95/udp #SUPDUP +dixie 96/tcp #DIXIE Protocol Specification +dixie 96/udp #DIXIE Protocol Specification +swift-rvf 97/tcp #Swift Remote Virtural File Protocol +swift-rvf 97/udp #Swift Remote Virtural File Protocol +tacnews 98/tcp #TAC News +tacnews 98/udp #TAC News +metagram 99/tcp #Metagram Relay +metagram 99/udp #Metagram Relay +newacct 100/tcp #[unauthorized use] +hostname 101/tcp #NIC Host Name Server +hostname 101/udp #NIC Host Name Server +iso-tsap 102/tcp #ISO-TSAP Class 0 +iso-tsap 102/udp #ISO-TSAP Class 0 +gppitnp 103/tcp #Genesis Point-to-Point Trans Net +gppitnp 103/udp #Genesis Point-to-Point Trans Net +acr-nema 104/tcp #ACR-NEMA Digital Imag. & Comm. 300 +acr-nema 104/udp #ACR-NEMA Digital Imag. & Comm. 300 +cso 105/tcp #CCSO name server protocol +cso 105/udp #CCSO name server protocol +csnet-ns 105/tcp #Mailbox Name Nameserver +csnet-ns 105/udp #Mailbox Name Nameserver +3com-tsmux 106/tcp #3COM-TSMUX +3com-tsmux 106/udp #3COM-TSMUX +rtelnet 107/tcp #Remote Telnet Service +rtelnet 107/udp #Remote Telnet Service +snagas 108/tcp #SNA Gateway Access Server +snagas 108/udp #SNA Gateway Access Server +pop2 109/tcp #Post Office Protocol - Version 2 +pop2 109/udp #Post Office Protocol - Version 2 +pop3 110/tcp #Post Office Protocol - Version 3 +pop3 110/udp #Post Office Protocol - Version 3 +sunrpc 111/tcp #SUN Remote Procedure Call +sunrpc 111/udp #SUN Remote Procedure Call +mcidas 112/tcp #McIDAS Data Transmission Protocol +mcidas 112/udp #McIDAS Data Transmission Protocol +ident 113/tcp +auth 113/tcp #Authentication Service +auth 113/udp #Authentication Service +sftp 115/tcp #Simple File Transfer Protocol +sftp 115/udp #Simple File Transfer Protocol +ansanotify 116/tcp #ANSA REX Notify +ansanotify 116/udp #ANSA REX Notify +uucp-path 117/tcp #UUCP Path Service +uucp-path 117/udp #UUCP Path Service +sqlserv 118/tcp #SQL Services +sqlserv 118/udp #SQL Services +nntp 119/tcp #Network News Transfer Protocol +nntp 119/udp #Network News Transfer Protocol +cfdptkt 120/tcp #CFDPTKT +cfdptkt 120/udp #CFDPTKT +erpc 121/tcp #Encore Expedited Remote Pro.Call +erpc 121/udp #Encore Expedited Remote Pro.Call +smakynet 122/tcp #SMAKYNET +smakynet 122/udp #SMAKYNET +ntp 123/tcp #Network Time Protocol +ntp 123/udp #Network Time Protocol +ansatrader 124/tcp #ANSA REX Trader +ansatrader 124/udp #ANSA REX Trader +locus-map 125/tcp #Locus PC-Interface Net Map Ser +locus-map 125/udp #Locus PC-Interface Net Map Ser +nxedit 126/tcp #NXEdit +nxedit 126/udp #NXEdit +locus-con 127/tcp #Locus PC-Interface Conn Server +locus-con 127/udp #Locus PC-Interface Conn Server +gss-xlicen 128/tcp #GSS X License Verification +gss-xlicen 128/udp #GSS X License Verification +pwdgen 129/tcp #Password Generator Protocol +pwdgen 129/udp #Password Generator Protocol +cisco-fna 130/tcp #cisco FNATIVE +cisco-fna 130/udp #cisco FNATIVE +cisco-tna 131/tcp #cisco TNATIVE +cisco-tna 131/udp #cisco TNATIVE +cisco-sys 132/tcp #cisco SYSMAINT +cisco-sys 132/udp #cisco SYSMAINT +statsrv 133/tcp #Statistics Service +statsrv 133/udp #Statistics Service +ingres-net 134/tcp #INGRES-NET Service +ingres-net 134/udp #INGRES-NET Service +epmap 135/tcp #DCE endpoint resolution +epmap 135/udp #DCE endpoint resolution +profile 136/tcp #PROFILE Naming System +profile 136/udp #PROFILE Naming System +netbios-ns 137/tcp #NETBIOS Name Service +netbios-ns 137/udp #NETBIOS Name Service +netbios-dgm 138/tcp #NETBIOS Datagram Service +netbios-dgm 138/udp #NETBIOS Datagram Service +netbios-ssn 139/tcp #NETBIOS Session Service +netbios-ssn 139/udp #NETBIOS Session Service +emfis-data 140/tcp #EMFIS Data Service +emfis-data 140/udp #EMFIS Data Service +emfis-cntl 141/tcp #EMFIS Control Service +emfis-cntl 141/udp #EMFIS Control Service +bl-idm 142/tcp #Britton-Lee IDM +bl-idm 142/udp #Britton-Lee IDM +imap 143/tcp #Internet Message Access Protocol +imap 143/udp #Internet Message Access Protocol +uma 144/tcp #Universal Management Architecture +uma 144/udp #Universal Management Architecture +uaac 145/tcp #UAAC Protocol +uaac 145/udp #UAAC Protocol +iso-tp0 146/tcp #ISO-IP0 +iso-tp0 146/udp #ISO-IP0 +iso-ip 147/tcp #ISO-IP +iso-ip 147/udp #ISO-IP +jargon 148/tcp #Jargon +jargon 148/udp #Jargon +aed-512 149/tcp #AED 512 Emulation Service +aed-512 149/udp #AED 512 Emulation Service +sql-net 150/tcp #SQL-NET +sql-net 150/udp #SQL-NET +hems 151/tcp #HEMS +hems 151/udp #HEMS +bftp 152/tcp #Background File Transfer Program +bftp 152/udp #Background File Transfer Program +sgmp 153/tcp #SGMP +sgmp 153/udp #SGMP +netsc-prod 154/tcp #NETSC +netsc-prod 154/udp #NETSC +netsc-dev 155/tcp #NETSC +netsc-dev 155/udp #NETSC +sqlsrv 156/tcp #SQL Service +sqlsrv 156/udp #SQL Service +knet-cmp 157/tcp #KNET/VM Command/Message Protocol +knet-cmp 157/udp #KNET/VM Command/Message Protocol +pcmail-srv 158/tcp #PCMail Server +pcmail-srv 158/udp #PCMail Server +nss-routing 159/tcp #NSS-Routing +nss-routing 159/udp #NSS-Routing +sgmp-traps 160/tcp #SGMP-TRAPS +sgmp-traps 160/udp #SGMP-TRAPS +snmp 161/tcp #SNMP +snmp 161/udp #SNMP +snmptrap 162/tcp #SNMPTRAP +snmptrap 162/udp #SNMPTRAP +cmip-man 163/tcp #CMIP/TCP Manager +cmip-man 163/udp #CMIP/TCP Manager +cmip-agent 164/tcp #CMIP/TCP Agent +cmip-agent 164/udp #CMIP/TCP Agent +xns-courier 165/tcp #Xerox +xns-courier 165/udp #Xerox +s-net 166/tcp #Sirius Systems +s-net 166/udp #Sirius Systems +namp 167/tcp #NAMP +namp 167/udp #NAMP +rsvd 168/tcp #RSVD +rsvd 168/udp #RSVD +send 169/tcp #SEND +send 169/udp #SEND +print-srv 170/tcp #Network PostScript +print-srv 170/udp #Network PostScript +multiplex 171/tcp #Network Innovations Multiplex +multiplex 171/udp #Network Innovations Multiplex +xyplex-mux 173/tcp #Xyplex +xyplex-mux 173/udp #Xyplex +mailq 174/tcp #MAILQ +mailq 174/udp #MAILQ +vmnet 175/tcp #VMNET +vmnet 175/udp #VMNET +genrad-mux 176/tcp #GENRAD-MUX +genrad-mux 176/udp #GENRAD-MUX +xdmcp 177/tcp #X Display Manager Control Protocol +xdmcp 177/udp #X Display Manager Control Protocol +nextstep 178/tcp #NextStep Window Server +nextstep 178/udp #NextStep Window Server +bgp 179/tcp #Border Gateway Protocol +bgp 179/udp #Border Gateway Protocol +ris 180/tcp #Intergraph +ris 180/udp #Intergraph +unify 181/tcp #Unify +unify 181/udp #Unify +audit 182/tcp #Unisys Audit SITP +audit 182/udp #Unisys Audit SITP +ocbinder 183/tcp #OCBinder +ocbinder 183/udp #OCBinder +ocserver 184/tcp #OCServer +ocserver 184/udp #OCServer +remote-kis 185/tcp #Remote-KIS +remote-kis 185/udp #Remote-KIS +kis 186/tcp #KIS Protocol +kis 186/udp #KIS Protocol +aci 187/tcp #Application Communication Interface +aci 187/udp #Application Communication Interface +mumps 188/tcp #Plus Five's MUMPS +mumps 188/udp #Plus Five's MUMPS +qft 189/tcp #Queued File Transport +qft 189/udp #Queued File Transport +gacp 190/tcp #Gateway Access Control Protocol +gacp 190/udp #Gateway Access Control Protocol +prospero 191/tcp #Prospero Directory Service +prospero 191/udp #Prospero Directory Service +osu-nms 192/tcp #OSU Network Monitoring System +osu-nms 192/udp #OSU Network Monitoring System +srmp 193/tcp #Spider Remote Monitoring Protocol +srmp 193/udp #Spider Remote Monitoring Protocol +irc 194/tcp #Internet Relay Chat Protocol +irc 194/udp #Internet Relay Chat Protocol +dn6-nlm-aud 195/tcp #DNSIX Network Level Module Audit +dn6-nlm-aud 195/udp #DNSIX Network Level Module Audit +dn6-smm-red 196/tcp #DNSIX Session Mgt Module Audit Redir +dn6-smm-red 196/udp #DNSIX Session Mgt Module Audit Redir +dls 197/tcp #Directory Location Service +dls 197/udp #Directory Location Service +dls-mon 198/tcp #Directory Location Service Monitor +dls-mon 198/udp #Directory Location Service Monitor +smux 199/tcp #SMUX +smux 199/udp #SMUX +src 200/tcp #IBM System Resource Controller +src 200/udp #IBM System Resource Controller +at-rtmp 201/tcp #AppleTalk Routing Maintenance +at-rtmp 201/udp #AppleTalk Routing Maintenance +at-nbp 202/tcp #AppleTalk Name Binding +at-nbp 202/udp #AppleTalk Name Binding +at-3 203/tcp #AppleTalk Unused +at-3 203/udp #AppleTalk Unused +at-echo 204/tcp #AppleTalk Echo +at-echo 204/udp #AppleTalk Echo +at-5 205/tcp #AppleTalk Unused +at-5 205/udp #AppleTalk Unused +at-zis 206/tcp #AppleTalk Zone Information +at-zis 206/udp #AppleTalk Zone Information +at-7 207/tcp #AppleTalk Unused +at-7 207/udp #AppleTalk Unused +at-8 208/tcp #AppleTalk Unused +at-8 208/udp #AppleTalk Unused +qmtp 209/tcp #The Quick Mail Transfer Protocol +qmtp 209/udp #The Quick Mail Transfer Protocol +z39.50 210/tcp #ANSI Z39.50 +z39.50 210/udp #ANSI Z39.50 +anet 212/tcp #ATEXSSTR +anet 212/udp #ATEXSSTR +ipx 213/tcp #IPX +ipx 213/udp #IPX +vmpwscs 214/tcp #VM PWSCS +vmpwscs 214/udp #VM PWSCS +softpc 215/tcp #Insignia Solutions +softpc 215/udp #Insignia Solutions +dbase 217/tcp #dBASE Unix +dbase 217/udp #dBASE Unix +mpp 218/tcp #Netix Message Posting Protocol +mpp 218/udp #Netix Message Posting Protocol +uarps 219/tcp #Unisys ARPs +uarps 219/udp #Unisys ARPs +imap3 220/tcp #Interactive Mail Access Protocol v3 +imap3 220/udp #Interactive Mail Access Protocol v3 +fln-spx 221/tcp #Berkeley rlogind with SPX auth +fln-spx 221/udp #Berkeley rlogind with SPX auth +rsh-spx 222/tcp #Berkeley rshd with SPX auth +rsh-spx 222/udp #Berkeley rshd with SPX auth +cdc 223/tcp #Certificate Distribution Center +cdc 223/udp #Certificate Distribution Center +masqdialer 224/tcp #masqdialer +masqdialer 224/udp #masqdialer +direct 242/tcp #Direct +direct 242/udp #Direct +sur-meas 243/tcp #Survey Measurement +sur-meas 243/udp #Survey Measurement +inbusiness 244/tcp #inbusiness +inbusiness 244/udp #inbusiness +link 245/tcp #LINK +link 245/udp #LINK +dsp3270 246/tcp #Display Systems Protocol +dsp3270 246/udp #Display Systems Protocol +subntbcst_tftp 247/tcp #SUBNTBCST_TFTP +subntbcst_tftp 247/udp #SUBNTBCST_TFTP +bhfhs 248/tcp #bhfhs +bhfhs 248/udp #bhfhs +rap 256/tcp #RAP +rap 256/udp #RAP +set 257/tcp #Secure Electronic Transaction +set 257/udp #Secure Electronic Transaction +yak-chat 258/tcp #Yak Winsock Personal Chat +yak-chat 258/udp #Yak Winsock Personal Chat +esro-gen 259/tcp #Efficient Short Remote Operations +esro-gen 259/udp #Efficient Short Remote Operations +openport 260/tcp #Openport +openport 260/udp #Openport +nsiiops 261/tcp #IIOP Name Service over TLS/SSL +nsiiops 261/udp #IIOP Name Service over TLS/SSL +arcisdms 262/tcp #Arcisdms +arcisdms 262/udp #Arcisdms +hdap 263/tcp #HDAP +hdap 263/udp #HDAP +bgmp 264/tcp #BGMP +bgmp 264/udp #BGMP +x-bone-ctl 265/tcp #X-Bone CTL +x-bone-ctl 265/udp #X-Bone CTL +sst 266/tcp #SCSI on ST +sst 266/udp #SCSI on ST +td-service 267/tcp #Tobit David Service Layer +td-service 267/udp #Tobit David Service Layer +td-replica 268/tcp #Tobit David Replica +td-replica 268/udp #Tobit David Replica +http-mgmt 280/tcp #http-mgmt +http-mgmt 280/udp #http-mgmt +personal-link 281/tcp #Personal Link +personal-link 281/udp #Personal Link +cableport-ax 282/tcp #Cable Port A/X +cableport-ax 282/udp #Cable Port A/X +rescap 283/tcp #rescap +rescap 283/udp #rescap +corerjd 284/tcp #corerjd +corerjd 284/udp #corerjd +fxp 286/tcp #FXP Communication +fxp 286/udp #FXP Communication +k-block 287/tcp #K-BLOCK +k-block 287/udp #K-BLOCK +novastorbakcup 308/tcp #Novastor Backup +novastorbakcup 308/udp #Novastor Backup +entrusttime 309/tcp #EntrustTime +entrusttime 309/udp #EntrustTime +bhmds 310/tcp #bhmds +bhmds 310/udp #bhmds +asip-webadmin 311/tcp #AppleShare IP WebAdmin +asip-webadmin 311/udp #AppleShare IP WebAdmin +vslmp 312/tcp #VSLMP +vslmp 312/udp #VSLMP +magenta-logic 313/tcp #Magenta Logic +magenta-logic 313/udp #Magenta Logic +opalis-robot 314/tcp #Opalis Robot +opalis-robot 314/udp #Opalis Robot +dpsi 315/tcp #DPSI +dpsi 315/udp #DPSI +decauth 316/tcp #decAuth +decauth 316/udp #decAuth +zannet 317/tcp #Zannet +zannet 317/udp #Zannet +pkix-timestamp 318/tcp #PKIX TimeStamp +pkix-timestamp 318/udp #PKIX TimeStamp +ptp-event 319/tcp #PTP Event +ptp-event 319/udp #PTP Event +ptp-general 320/tcp #PTP General +ptp-general 320/udp #PTP General +pip 321/tcp #PIP +pip 321/udp #PIP +rtsps 322/tcp #RTSPS +rtsps 322/udp #RTSPS +texar 333/tcp #Texar Security Port +texar 333/udp #Texar Security Port +pdap 344/tcp #Prospero Data Access Protocol +pdap 344/udp #Prospero Data Access Protocol +pawserv 345/tcp #Perf Analysis Workbench +pawserv 345/udp #Perf Analysis Workbench +zserv 346/tcp #Zebra server +zserv 346/udp #Zebra server +fatserv 347/tcp #Fatmen Server +fatserv 347/udp #Fatmen Server +csi-sgwp 348/tcp #Cabletron Management Protocol +csi-sgwp 348/udp #Cabletron Management Protocol +mftp 349/tcp #mftp +mftp 349/udp #mftp +matip-type-a 350/tcp #MATIP Type A +matip-type-a 350/udp #MATIP Type A +matip-type-b 351/tcp #MATIP Type B +matip-type-b 351/udp #MATIP Type B +bhoetty 351/tcp #bhoetty (added 5/21/97) +bhoetty 351/udp #bhoetty +dtag-ste-sb 352/tcp #DTAG (assigned long ago) +dtag-ste-sb 352/udp #DTAG +bhoedap4 352/tcp #bhoedap4 (added 5/21/97) +bhoedap4 352/udp #bhoedap4 +ndsauth 353/tcp #NDSAUTH +ndsauth 353/udp #NDSAUTH +bh611 354/tcp #bh611 +bh611 354/udp #bh611 +datex-asn 355/tcp #DATEX-ASN +datex-asn 355/udp #DATEX-ASN +cloanto-net-1 356/tcp #Cloanto Net 1 +cloanto-net-1 356/udp #Cloanto Net 1 +bhevent 357/tcp #bhevent +bhevent 357/udp #bhevent +shrinkwrap 358/tcp #Shrinkwrap +shrinkwrap 358/udp #Shrinkwrap +nsrmp 359/tcp #Network Security Risk Management Protocol +nsrmp 359/udp #Network Security Risk Management Protocol +scoi2odialog 360/tcp #scoi2odialog +scoi2odialog 360/udp #scoi2odialog +semantix 361/tcp #Semantix +semantix 361/udp #Semantix +srssend 362/tcp #SRS Send +srssend 362/udp #SRS Send +rsvp_tunnel 363/tcp #RSVP Tunnel +rsvp_tunnel 363/udp #RSVP Tunnel +aurora-cmgr 364/tcp #Aurora CMGR +aurora-cmgr 364/udp #Aurora CMGR +dtk 365/tcp #DTK +dtk 365/udp #DTK +odmr 366/tcp #ODMR +odmr 366/udp #ODMR +mortgageware 367/tcp #MortgageWare +mortgageware 367/udp #MortgageWare +qbikgdp 368/tcp #QbikGDP +qbikgdp 368/udp #QbikGDP +rpc2portmap 369/tcp #rpc2portmap +rpc2portmap 369/udp #rpc2portmap +codaauth2 370/tcp #codaauth2 +codaauth2 370/udp #codaauth2 +clearcase 371/tcp #Clearcase +clearcase 371/udp #Clearcase +ulistproc 372/tcp #ListProcessor +ulistproc 372/udp #ListProcessor +legent-1 373/tcp #Legent Corporation +legent-1 373/udp #Legent Corporation +legent-2 374/tcp #Legent Corporation +legent-2 374/udp #Legent Corporation +hassle 375/tcp #Hassle +hassle 375/udp #Hassle +nip 376/tcp #Amiga Envoy Network Inquiry Proto +nip 376/udp #Amiga Envoy Network Inquiry Proto +tnETOS 377/tcp #NEC Corporation +tnETOS 377/udp #NEC Corporation +dsETOS 378/tcp #NEC Corporation +dsETOS 378/udp #NEC Corporation +is99c 379/tcp #TIA/EIA/IS-99 modem client +is99c 379/udp #TIA/EIA/IS-99 modem client +is99s 380/tcp #TIA/EIA/IS-99 modem server +is99s 380/udp #TIA/EIA/IS-99 modem server +hp-collector 381/tcp #hp performance data collector +hp-collector 381/udp #hp performance data collector +hp-managed-node 382/tcp #hp performance data managed node +hp-managed-node 382/udp #hp performance data managed node +hp-alarm-mgr 383/tcp #hp performance data alarm manager +hp-alarm-mgr 383/udp #hp performance data alarm manager +arns 384/tcp #A Remote Network Server System +arns 384/udp #A Remote Network Server System +ibm-app 385/tcp #IBM Application +ibm-app 385/udp #IBM Application +asa 386/tcp #ASA Message Router Object Def. +asa 386/udp #ASA Message Router Object Def. +aurp 387/tcp #Appletalk Update-Based Routing Pro. +aurp 387/udp #Appletalk Update-Based Routing Pro. +unidata-ldm 388/tcp #Unidata LDM +unidata-ldm 388/udp #Unidata LDM +ldap 389/tcp #Lightweight Directory Access Protocol +ldap 389/udp #Lightweight Directory Access Protocol +uis 390/tcp #UIS +uis 390/udp #UIS +synotics-relay 391/tcp #SynOptics SNMP Relay Port +synotics-relay 391/udp #SynOptics SNMP Relay Port +synotics-broker 392/tcp #SynOptics Port Broker Port +synotics-broker 392/udp #SynOptics Port Broker Port +meta5 393/tcp #Meta5 +meta5 393/udp #Meta5 +embl-ndt 394/tcp #EMBL Nucleic Data Transfer +embl-ndt 394/udp #EMBL Nucleic Data Transfer +netcp 395/tcp #NETscout Control Protocol +netcp 395/udp #NETscout Control Protocol +netware-ip 396/tcp #Novell Netware over IP +netware-ip 396/udp #Novell Netware over IP +mptn 397/tcp #Multi Protocol Trans. Net. +mptn 397/udp #Multi Protocol Trans. Net. +kryptolan 398/tcp #Kryptolan +kryptolan 398/udp #Kryptolan +iso-tsap-c2 399/tcp #ISO Transport Class 2 Non-Control over TCP +iso-tsap-c2 399/udp #ISO Transport Class 2 Non-Control over UDP +work-sol 400/tcp #Workstation Solutions +work-sol 400/udp #Workstation Solutions +ups 401/tcp #Uninterruptible Power Supply +ups 401/udp #Uninterruptible Power Supply +genie 402/tcp #Genie Protocol +genie 402/udp #Genie Protocol +decap 403/tcp #decap +decap 403/udp #decap +nced 404/tcp #nced +nced 404/udp #nced +ncld 405/tcp #ncld +ncld 405/udp #ncld +imsp 406/tcp #Interactive Mail Support Protocol +imsp 406/udp #Interactive Mail Support Protocol +timbuktu 407/tcp #Timbuktu +timbuktu 407/udp #Timbuktu +prm-sm 408/tcp #Prospero Resource Manager Sys. Man. +prm-sm 408/udp #Prospero Resource Manager Sys. Man. +prm-nm 409/tcp #Prospero Resource Manager Node Man. +prm-nm 409/udp #Prospero Resource Manager Node Man. +decladebug 410/tcp #DECLadebug Remote Debug Protocol +decladebug 410/udp #DECLadebug Remote Debug Protocol +rmt 411/tcp #Remote MT Protocol +rmt 411/udp #Remote MT Protocol +synoptics-trap 412/tcp #Trap Convention Port +synoptics-trap 412/udp #Trap Convention Port +smsp 413/tcp #Storage Management Services Protocol +smsp 413/udp #Storage Management Services Protocol +infoseek 414/tcp #InfoSeek +infoseek 414/udp #InfoSeek +bnet 415/tcp #BNet +bnet 415/udp #BNet +silverplatter 416/tcp #Silverplatter +silverplatter 416/udp #Silverplatter +onmux 417/tcp #Onmux +onmux 417/udp #Onmux +hyper-g 418/tcp #Hyper-G +hyper-g 418/udp #Hyper-G +ariel1 419/tcp #Ariel 1 +ariel1 419/udp #Ariel 1 +smpte 420/tcp #SMPTE +smpte 420/udp #SMPTE +ariel2 421/tcp #Ariel 2 +ariel2 421/udp #Ariel 2 +ariel3 422/tcp #Ariel 3 +ariel3 422/udp #Ariel 3 +opc-job-start 423/tcp #IBM Operations Planning and Control Start +opc-job-start 423/udp #IBM Operations Planning and Control Start +opc-job-track 424/tcp #IBM Operations Planning and Control Track +opc-job-track 424/udp #IBM Operations Planning and Control Track +icad-el 425/tcp #ICAD +icad-el 425/udp #ICAD +smartsdp 426/tcp #smartsdp +smartsdp 426/udp #smartsdp +svrloc 427/tcp #Server Location +svrloc 427/udp #Server Location +ocs_cmu 428/tcp #OCS_CMU +ocs_cmu 428/udp #OCS_CMU +ocs_amu 429/tcp #OCS_AMU +ocs_amu 429/udp #OCS_AMU +utmpsd 430/tcp #UTMPSD +utmpsd 430/udp #UTMPSD +utmpcd 431/tcp #UTMPCD +utmpcd 431/udp #UTMPCD +iasd 432/tcp #IASD +iasd 432/udp #IASD +nnsp 433/tcp #NNSP +nnsp 433/udp #NNSP +mobileip-agent 434/tcp #MobileIP-Agent +mobileip-agent 434/udp #MobileIP-Agent +mobilip-mn 435/tcp #MobilIP-MN +mobilip-mn 435/udp #MobilIP-MN +dna-cml 436/tcp #DNA-CML +dna-cml 436/udp #DNA-CML +comscm 437/tcp #comscm +comscm 437/udp #comscm +dsfgw 438/tcp #dsfgw +dsfgw 438/udp #dsfgw +dasp 439/tcp #dasp Thomas Obermair +dasp 439/udp #dasp tommy@inlab.m.eunet.de +sgcp 440/tcp #sgcp +sgcp 440/udp #sgcp +decvms-sysmgt 441/tcp #decvms-sysmgt +decvms-sysmgt 441/udp #decvms-sysmgt +cvc_hostd 442/tcp #cvc_hostd +cvc_hostd 442/udp #cvc_hostd +https 443/tcp #http protocol over TLS/SSL +https 443/udp #http protocol over TLS/SSL +snpp 444/tcp #Simple Network Paging Protocol +snpp 444/udp #Simple Network Paging Protocol +microsoft-ds 445/tcp #Microsoft-DS +microsoft-ds 445/udp #Microsoft-DS +ddm-rdb 446/tcp #DDM-Remote Relational Database Access +ddm-rdb 446/udp #DDM-Remote Relational Database Access +ddm-dfm 447/tcp #DDM-Distributed File Management +ddm-dfm 447/udp #DDM-Distributed File Management +ddm-ssl 448/tcp #DDM-Remote DB Access Using Secure Sockets +ddm-ssl 448/udp #DDM-Remote DB Access Using Secure Sockets +as-servermap 449/tcp #AS Server Mapper +as-servermap 449/udp #AS Server Mapper +tserver 450/tcp #Computer Supported Telecomunication Applications +tserver 450/udp #Computer Supported Telecomunication Applications +sfs-smp-net 451/tcp #Cray Network Semaphore server +sfs-smp-net 451/udp #Cray Network Semaphore server +sfs-config 452/tcp #Cray SFS config server +sfs-config 452/udp #Cray SFS config server +creativeserver 453/tcp #CreativeServer +creativeserver 453/udp #CreativeServer +contentserver 454/tcp #ContentServer +contentserver 454/udp #ContentServer +creativepartnr 455/tcp #CreativePartnr +creativepartnr 455/udp #CreativePartnr +macon-tcp 456/tcp #macon-tcp +macon-udp 456/udp #macon-udp +scohelp 457/tcp #scohelp +scohelp 457/udp #scohelp +appleqtc 458/tcp #apple quick time +appleqtc 458/udp #apple quick time +ampr-rcmd 459/tcp #ampr-rcmd +ampr-rcmd 459/udp #ampr-rcmd +skronk 460/tcp #skronk +skronk 460/udp #skronk +datasurfsrv 461/tcp #DataRampSrv +datasurfsrv 461/udp #DataRampSrv +datasurfsrvsec 462/tcp #DataRampSrvSec +datasurfsrvsec 462/udp #DataRampSrvSec +alpes 463/tcp #alpes +alpes 463/udp #alpes +kpasswd 464/tcp #kpasswd +kpasswd 464/udp #kpasswd +urd 465/tcp #URL Rendesvous Directory for SSM +igmpv3lite 465/udp #IGMP over UDP for SSM +digital-vrc 466/tcp #digital-vrc +digital-vrc 466/udp #digital-vrc +mylex-mapd 467/tcp #mylex-mapd +mylex-mapd 467/udp #mylex-mapd +photuris 468/tcp #proturis +photuris 468/udp #proturis +rcp 469/tcp #Radio Control Protocol +rcp 469/udp #Radio Control Protocol +scx-proxy 470/tcp #scx-proxy +scx-proxy 470/udp #scx-proxy +mondex 471/tcp #Mondex +mondex 471/udp #Mondex +ljk-login 472/tcp #ljk-login +ljk-login 472/udp #ljk-login +hybrid-pop 473/tcp #hybrid-pop +hybrid-pop 473/udp #hybrid-pop +tn-tl-w1 474/tcp #tn-tl-w1 +tn-tl-w2 474/udp #tn-tl-w2 +tcpnethaspsrv 475/tcp #tcpnethaspsrv +tcpnethaspsrv 475/udp #tcpnethaspsrv +tn-tl-fd1 476/tcp #tn-tl-fd1 +tn-tl-fd1 476/udp #tn-tl-fd1 +ss7ns 477/tcp #ss7ns +ss7ns 477/udp #ss7ns +spsc 478/tcp #spsc +spsc 478/udp #spsc +iafserver 479/tcp #iafserver +iafserver 479/udp #iafserver +iafdbase 480/tcp #iafdbase +iafdbase 480/udp #iafdbase +ph 481/tcp #Ph service +ph 481/udp #Ph service +bgs-nsi 482/tcp #bgs-nsi +bgs-nsi 482/udp #bgs-nsi +ulpnet 483/tcp #ulpnet +ulpnet 483/udp #ulpnet +integra-sme 484/tcp #Integra Software Management Environment +integra-sme 484/udp #Integra Software Management Environment +powerburst 485/tcp #Air Soft Power Burst +powerburst 485/udp #Air Soft Power Burst +avian 486/tcp #avian +avian 486/udp #avian +saft 487/tcp #saft Simple Asynchronous File Transfer +saft 487/udp #saft Simple Asynchronous File Transfer +gss-http 488/tcp #gss-http +gss-http 488/udp #gss-http +nest-protocol 489/tcp #nest-protocol +nest-protocol 489/udp #nest-protocol +micom-pfs 490/tcp #micom-pfs +micom-pfs 490/udp #micom-pfs +go-login 491/tcp #go-login +go-login 491/udp #go-login +ticf-1 492/tcp #Transport Independent Convergence for FNA +ticf-1 492/udp #Transport Independent Convergence for FNA +ticf-2 493/tcp #Transport Independent Convergence for FNA +ticf-2 493/udp #Transport Independent Convergence for FNA +pov-ray 494/tcp #POV-Ray +pov-ray 494/udp #POV-Ray +intecourier 495/tcp #intecourier +intecourier 495/udp #intecourier +pim-rp-disc 496/tcp #PIM-RP-DISC +pim-rp-disc 496/udp #PIM-RP-DISC +dantz 497/tcp #dantz +dantz 497/udp #dantz +siam 498/tcp #siam +siam 498/udp #siam +iso-ill 499/tcp #ISO ILL Protocol +iso-ill 499/udp #ISO ILL Protocol +isakmp 500/tcp #isakmp +isakmp 500/udp #isakmp +stmf 501/tcp #STMF +stmf 501/udp #STMF +asa-appl-proto 502/tcp #asa-appl-proto +asa-appl-proto 502/udp #asa-appl-proto +intrinsa 503/tcp #Intrinsa +intrinsa 503/udp #Intrinsa +citadel 504/tcp #citadel +citadel 504/udp #citadel +mailbox-lm 505/tcp #mailbox-lm +mailbox-lm 505/udp #mailbox-lm +ohimsrv 506/tcp #ohimsrv +ohimsrv 506/udp #ohimsrv +crs 507/tcp #crs +crs 507/udp #crs +xvttp 508/tcp #xvttp +xvttp 508/udp #xvttp +snare 509/tcp #snare +snare 509/udp #snare +fcp 510/tcp #FirstClass Protocol +fcp 510/udp #FirstClass Protocol +passgo 511/tcp #PassGo +passgo 511/udp #PassGo +exec 512/tcp #remote process execution; +biff 512/udp #used by mail system to notify users +login 513/tcp #remote login a la telnet; +who 513/udp #maintains data bases showing who's +shell 514/tcp #cmd +printer 515/tcp #spooler +printer 515/udp #spooler +videotex 516/tcp #videotex +videotex 516/udp #videotex +talk 517/tcp #like tenex link, but across +talk 517/udp #like tenex link, but across +utime 519/tcp #unixtime +utime 519/udp #unixtime +efs 520/tcp #extended file name server +router 520/udp #local routing process (on site); +ripng 521/tcp #ripng +ripng 521/udp #ripng +ulp 522/tcp #ULP +ulp 522/udp #ULP +ibm-db2 523/tcp #IBM-DB2 +ibm-db2 523/udp #IBM-DB2 +ncp 524/tcp #NCP +ncp 524/udp #NCP +timed 525/tcp #timeserver +timed 525/udp #timeserver +tempo 526/tcp #newdate +tempo 526/udp #newdate +stx 527/tcp #Stock IXChange +stx 527/udp #Stock IXChange +custix 528/tcp #Customer IXChange +custix 528/udp #Customer IXChange +irc-serv 529/tcp #IRC-SERV +irc-serv 529/udp #IRC-SERV +courier 530/tcp #rpc +courier 530/udp #rpc +conference 531/tcp #chat +conference 531/udp #chat +netnews 532/tcp #readnews +netnews 532/udp #readnews +netwall 533/tcp #for emergency broadcasts +netwall 533/udp #for emergency broadcasts +mm-admin 534/tcp #MegaMedia Admin +mm-admin 534/udp #MegaMedia Admin +iiop 535/tcp #iiop +iiop 535/udp #iiop +opalis-rdv 536/tcp #opalis-rdv +opalis-rdv 536/udp #opalis-rdv +nmsp 537/tcp #Networked Media Streaming Protocol +nmsp 537/udp #Networked Media Streaming Protocol +gdomap 538/tcp #gdomap +gdomap 538/udp #gdomap +apertus-ldp 539/tcp #Apertus Technologies Load Determination +apertus-ldp 539/udp #Apertus Technologies Load Determination +uucp 540/tcp #uucpd +uucp 540/udp #uucpd +uucp-rlogin 541/tcp #uucp-rlogin +uucp-rlogin 541/udp #uucp-rlogin +commerce 542/tcp #commerce +commerce 542/udp #commerce +kshell 544/tcp #krcmd +kshell 544/udp #krcmd +appleqtcsrvr 545/tcp #appleqtcsrvr +appleqtcsrvr 545/udp #appleqtcsrvr +dhcpv6-client 546/tcp #DHCPv6 Client +dhcpv6-client 546/udp #DHCPv6 Client +dhcpv6-server 547/tcp #DHCPv6 Server +dhcpv6-server 547/udp #DHCPv6 Server +afpovertcp 548/tcp #AFP over TCP +afpovertcp 548/udp #AFP over TCP +idfp 549/tcp #IDFP +idfp 549/udp #IDFP +new-rwho 550/tcp #new-who +new-rwho 550/udp #new-who +cybercash 551/tcp #cybercash +cybercash 551/udp #cybercash +devshr-nts 552/tcp #DeviceShare +devshr-nts 552/udp #DeviceShare +pirp 553/tcp #pirp +pirp 553/udp #pirp +rtsp 554/tcp #Real Time Stream Control Protocol +rtsp 554/udp #Real Time Stream Control Protocol +remotefs 556/tcp #rfs server +remotefs 556/udp #rfs server +openvms-sysipc 557/tcp #openvms-sysipc +openvms-sysipc 557/udp #openvms-sysipc +sdnskmp 558/tcp #SDNSKMP +sdnskmp 558/udp #SDNSKMP +teedtap 559/tcp #TEEDTAP +teedtap 559/udp #TEEDTAP +rmonitor 560/tcp #rmonitord +rmonitor 560/udp #rmonitord +chshell 562/tcp #chcmd +chshell 562/udp #chcmd +nntps 563/tcp #nntp protocol over TLS/SSL (was snntp) +nntps 563/udp #nntp protocol over TLS/SSL (was snntp) +9pfs 564/tcp #plan 9 file service +9pfs 564/udp #plan 9 file service +whoami 565/tcp #whoami +whoami 565/udp #whoami +streettalk 566/tcp #streettalk +streettalk 566/udp #streettalk +banyan-rpc 567/tcp #banyan-rpc +banyan-rpc 567/udp #banyan-rpc +ms-shuttle 568/tcp #microsoft shuttle +ms-shuttle 568/udp #microsoft shuttle +ms-rome 569/tcp #microsoft rome +ms-rome 569/udp #microsoft rome +meter 570/tcp #demon +meter 570/udp #demon +meter 571/tcp #udemon +meter 571/udp #udemon +sonar 572/tcp #sonar +sonar 572/udp #sonar +banyan-vip 573/tcp #banyan-vip +banyan-vip 573/udp #banyan-vip +ftp-agent 574/tcp #FTP Software Agent System +ftp-agent 574/udp #FTP Software Agent System +vemmi 575/tcp #VEMMI +vemmi 575/udp #VEMMI +ipcd 576/tcp #ipcd +ipcd 576/udp #ipcd +vnas 577/tcp #vnas +vnas 577/udp #vnas +ipdd 578/tcp #ipdd +ipdd 578/udp #ipdd +decbsrv 579/tcp #decbsrv +decbsrv 579/udp #decbsrv +sntp-heartbeat 580/tcp #SNTP HEARTBEAT +sntp-heartbeat 580/udp #SNTP HEARTBEAT +bdp 581/tcp #Bundle Discovery Protocol +bdp 581/udp #Bundle Discovery Protocol +scc-security 582/tcp #SCC Security +scc-security 582/udp #SCC Security +philips-vc 583/tcp #Philips Video-Conferencing +philips-vc 583/udp #Philips Video-Conferencing +keyserver 584/tcp #Key Server +keyserver 584/udp #Key Server +imap4-ssl 585/tcp #IMAP4+SSL (use 993 instead) +imap4-ssl 585/udp #IMAP4+SSL (use 993 instead) +password-chg 586/tcp #Password Change +password-chg 586/udp #Password Change +submission 587/tcp #Submission +submission 587/udp #Submission +cal 588/tcp #CAL +cal 588/udp #CAL +eyelink 589/tcp #EyeLink +eyelink 589/udp #EyeLink +tns-cml 590/tcp #TNS CML +tns-cml 590/udp #TNS CML +http-alt 591/tcp #FileMaker, Inc. - HTTP Alternate (see Port 80) +http-alt 591/udp #FileMaker, Inc. - HTTP Alternate (see Port 80) +eudora-set 592/tcp #Eudora Set +eudora-set 592/udp #Eudora Set +http-rpc-epmap 593/tcp #HTTP RPC Ep Map +http-rpc-epmap 593/udp #HTTP RPC Ep Map +tpip 594/tcp #TPIP +tpip 594/udp #TPIP +cab-protocol 595/tcp #CAB Protocol +cab-protocol 595/udp #CAB Protocol +smsd 596/tcp #SMSD +smsd 596/udp #SMSD +ptcnameservice 597/tcp #PTC Name Service +ptcnameservice 597/udp #PTC Name Service +sco-websrvrmg3 598/tcp #SCO Web Server Manager 3 +sco-websrvrmg3 598/udp #SCO Web Server Manager 3 +acp 599/tcp #Aeolon Core Protocol +acp 599/udp #Aeolon Core Protocol +ipcserver 600/tcp #Sun IPC server +ipcserver 600/udp #Sun IPC server +syslog-conn 601/tcp #Reliable Syslog Service +syslog-conn 601/udp #Reliable Syslog Service +xmlrpc-beep 602/tcp #XML-RPC over BEEP +xmlrpc-beep 602/udp #XML-RPC over BEEP +idxp 603/tcp #IDXP +idxp 603/udp #IDXP +tunnel 604/tcp #TUNNEL +tunnel 604/udp #TUNNEL +soap-beep 605/tcp #SOAP over BEEP +soap-beep 605/udp #SOAP over BEEP +urm 606/tcp #Cray Unified Resource Manager +urm 606/udp #Cray Unified Resource Manager +nqs 607/tcp #nqs +nqs 607/udp #nqs +sift-uft 608/tcp #Sender-Initiated/Unsolicited File Transfer +sift-uft 608/udp #Sender-Initiated/Unsolicited File Transfer +npmp-trap 609/tcp #npmp-trap +npmp-trap 609/udp #npmp-trap +npmp-local 610/tcp #npmp-local +npmp-local 610/udp #npmp-local +npmp-gui 611/tcp #npmp-gui +npmp-gui 611/udp #npmp-gui +hmmp-ind 612/tcp #HMMP Indication +hmmp-ind 612/udp #HMMP Indication +hmmp-op 613/tcp #HMMP Operation +hmmp-op 613/udp #HMMP Operation +sshell 614/tcp #SSLshell +sshell 614/udp #SSLshell +sco-inetmgr 615/tcp #Internet Configuration Manager +sco-inetmgr 615/udp #Internet Configuration Manager +sco-sysmgr 616/tcp #SCO System Administration Server +sco-sysmgr 616/udp #SCO System Administration Server +sco-dtmgr 617/tcp #SCO Desktop Administration Server +sco-dtmgr 617/udp #SCO Desktop Administration Server +dei-icda 618/tcp #DEI-ICDA +dei-icda 618/udp #DEI-ICDA +compaq-evm 619/tcp #Compaq EVM +compaq-evm 619/udp #Compaq EVM +sco-websrvrmgr 620/tcp #SCO WebServer Manager +sco-websrvrmgr 620/udp #SCO WebServer Manager +escp-ip 621/tcp #ESCP +escp-ip 621/udp #ESCP +collaborator 622/tcp #Collaborator +collaborator 622/udp #Collaborator +asf-rmcp 623/tcp #ASF Remote Management and Control Protocol +asf-rmcp 623/udp #ASF Remote Management and Control Protocol +cryptoadmin 624/tcp #Crypto Admin +cryptoadmin 624/udp #Crypto Admin +dec_dlm 625/tcp #DEC DLM +dec_dlm 625/udp #DEC DLM +asia 626/tcp #ASIA +asia 626/udp #ASIA +passgo-tivoli 627/tcp #PassGo Tivoli +passgo-tivoli 627/udp #PassGo Tivoli +qmqp 628/tcp #QMQP +qmqp 628/udp #QMQP +3com-amp3 629/tcp #3Com AMP3 +3com-amp3 629/udp #3Com AMP3 +rda 630/tcp #RDA +rda 630/udp #RDA +ipp 631/tcp #IPP (Internet Printing Protocol) +ipp 631/udp #IPP (Internet Printing Protocol) +bmpp 632/tcp #bmpp +bmpp 632/udp #bmpp +servstat 633/tcp #Service Status update (Sterling Software) +servstat 633/udp #Service Status update (Sterling Software) +ginad 634/tcp #ginad +ginad 634/udp #ginad +rlzdbase 635/tcp #RLZ DBase +rlzdbase 635/udp #RLZ DBase +ldaps 636/tcp #ldap protocol over TLS/SSL (was sldap) +ldaps 636/udp #ldap protocol over TLS/SSL (was sldap) +lanserver 637/tcp #lanserver +lanserver 637/udp #lanserver +mcns-sec 638/tcp #mcns-sec +mcns-sec 638/udp #mcns-sec +msdp 639/tcp #MSDP +msdp 639/udp #MSDP +entrust-sps 640/tcp #entrust-sps +entrust-sps 640/udp #entrust-sps +repcmd 641/tcp #repcmd +repcmd 641/udp #repcmd +esro-emsdp 642/tcp #ESRO-EMSDP V1.3 +esro-emsdp 642/udp #ESRO-EMSDP V1.3 +sanity 643/tcp #SANity +sanity 643/udp #SANity +dwr 644/tcp #dwr +dwr 644/udp #dwr +pssc 645/tcp #PSSC +pssc 645/udp #PSSC +ldp 646/tcp #LDP +ldp 646/udp #LDP +dhcp-failover 647/tcp #DHCP Failover +dhcp-failover 647/udp #DHCP Failover +rrp 648/tcp #Registry Registrar Protocol (RRP) +rrp 648/udp #Registry Registrar Protocol (RRP) +cadview-3d 649/tcp #Cadview-3d - streaming 3d models over the internet +cadview-3d 649/udp #Cadview-3d - streaming 3d models over the internet +obex 650/tcp #OBEX +obex 650/udp #OBEX +ieee-mms 651/tcp #IEEE MMS +ieee-mms 651/udp #IEEE MMS +hello-port 652/tcp #HELLO_PORT +hello-port 652/udp #HELLO_PORT +repscmd 653/tcp #RepCmd +repscmd 653/udp #RepCmd +aodv 654/tcp #AODV +aodv 654/udp #AODV +tinc 655/tcp #TINC +tinc 655/udp #TINC +spmp 656/tcp #SPMP +spmp 656/udp #SPMP +rmc 657/tcp #RMC +rmc 657/udp #RMC +tenfold 658/tcp #TenFold +tenfold 658/udp #TenFold +mac-srvr-admin 660/tcp #MacOS Server Admin +mac-srvr-admin 660/udp #MacOS Server Admin +hap 661/tcp #HAP +hap 661/udp #HAP +pftp 662/tcp #PFTP +pftp 662/udp #PFTP +purenoise 663/tcp #PureNoise +purenoise 663/udp #PureNoise +asf-secure-rmcp 664/tcp #ASF Secure Remote Management and Control Protocol +asf-secure-rmcp 664/udp #ASF Secure Remote Management and Control Protocol +sun-dr 665/tcp #Sun DR +sun-dr 665/udp #Sun DR +mdqs 666/tcp +mdqs 666/udp +doom 666/tcp #doom Id Software +doom 666/udp #doom Id Software +disclose 667/tcp #campaign contribution disclosures - SDR Technologies +disclose 667/udp #campaign contribution disclosures - SDR Technologies +mecomm 668/tcp #MeComm +mecomm 668/udp #MeComm +meregister 669/tcp #MeRegister +meregister 669/udp #MeRegister +vacdsm-sws 670/tcp #VACDSM-SWS +vacdsm-sws 670/udp #VACDSM-SWS +vacdsm-app 671/tcp #VACDSM-APP +vacdsm-app 671/udp #VACDSM-APP +vpps-qua 672/tcp #VPPS-QUA +vpps-qua 672/udp #VPPS-QUA +cimplex 673/tcp #CIMPLEX +cimplex 673/udp #CIMPLEX +acap 674/tcp #ACAP +acap 674/udp #ACAP +dctp 675/tcp #DCTP +dctp 675/udp #DCTP +vpps-via 676/tcp #VPPS Via +vpps-via 676/udp #VPPS Via +vpp 677/tcp #Virtual Presence Protocol +vpp 677/udp #Virtual Presence Protocol +ggf-ncp 678/tcp #GNU Generation Foundation NCP +ggf-ncp 678/udp #GNU Generation Foundation NCP +mrm 679/tcp #MRM +mrm 679/udp #MRM +entrust-aaas 680/tcp #entrust-aaas +entrust-aaas 680/udp #entrust-aaas +entrust-aams 681/tcp #entrust-aams +entrust-aams 681/udp #entrust-aams +xfr 682/tcp #XFR +xfr 682/udp #XFR +corba-iiop 683/tcp #CORBA IIOP +corba-iiop 683/udp #CORBA IIOP +corba-iiop-ssl 684/tcp #CORBA IIOP SSL +corba-iiop-ssl 684/udp #CORBA IIOP SSL +mdc-portmapper 685/tcp #MDC Port Mapper +mdc-portmapper 685/udp #MDC Port Mapper +hcp-wismar 686/tcp #Hardware Control Protocol Wismar +hcp-wismar 686/udp #Hardware Control Protocol Wismar +asipregistry 687/tcp #asipregistry +asipregistry 687/udp #asipregistry +realm-rusd 688/tcp #REALM-RUSD +realm-rusd 688/udp #REALM-RUSD +nmap 689/tcp #NMAP +nmap 689/udp #NMAP +vatp 690/tcp #VATP +vatp 690/udp #VATP +msexch-routing 691/tcp #MS Exchange Routing +msexch-routing 691/udp #MS Exchange Routing +hyperwave-isp 692/tcp #Hyperwave-ISP +hyperwave-isp 692/udp #Hyperwave-ISP +connendp 693/tcp #connendp +connendp 693/udp #connendp +ha-cluster 694/tcp #ha-cluster +ha-cluster 694/udp #ha-cluster +ieee-mms-ssl 695/tcp #IEEE-MMS-SSL +ieee-mms-ssl 695/udp #IEEE-MMS-SSL +rushd 696/tcp #RUSHD +rushd 696/udp #RUSHD +uuidgen 697/tcp #UUIDGEN +uuidgen 697/udp #UUIDGEN +olsr 698/tcp #OLSR +olsr 698/udp #OLSR +accessnetwork 699/tcp #Access Network +accessnetwork 699/udp #Access Network +epp 700/tcp #Extensible Provisioning Protocol +epp 700/udp #Extensible Provisioning Protocol +lmp 701/tcp #Link Management Protocol (LMP) +lmp 701/udp #Link Management Protocol (LMP) +elcsd 704/tcp #errlog copy/server daemon +elcsd 704/udp #errlog copy/server daemon +agentx 705/tcp #AgentX +agentx 705/udp #AgentX +silc 706/tcp #SILC +silc 706/udp #SILC +borland-dsj 707/tcp #Borland DSJ +borland-dsj 707/udp #Borland DSJ +entrust-kmsh 709/tcp #Entrust Key Management Service Handler +entrust-kmsh 709/udp #Entrust Key Management Service Handler +entrust-ash 710/tcp #Entrust Administration Service Handler +entrust-ash 710/udp #Entrust Administration Service Handler +cisco-tdp 711/tcp #Cisco TDP +cisco-tdp 711/udp #Cisco TDP +tbrpf 712/tcp #TBRPF +tbrpf 712/udp #TBRPF +netviewdm1 729/tcp #IBM NetView DM/6000 Server/Client +netviewdm1 729/udp #IBM NetView DM/6000 Server/Client +netviewdm2 730/tcp #IBM NetView DM/6000 send/tcp +netviewdm2 730/udp #IBM NetView DM/6000 send/tcp +netviewdm3 731/tcp #IBM NetView DM/6000 receive/tcp +netviewdm3 731/udp #IBM NetView DM/6000 receive/tcp +netgw 741/tcp #netGW +netgw 741/udp #netGW +netrcs 742/tcp #Network based Rev. Cont. Sys. +netrcs 742/udp #Network based Rev. Cont. Sys. +flexlm 744/tcp #Flexible License Manager +flexlm 744/udp #Flexible License Manager +fujitsu-dev 747/tcp #Fujitsu Device Control +fujitsu-dev 747/udp #Fujitsu Device Control +ris-cm 748/tcp #Russell Info Sci Calendar Manager +ris-cm 748/udp #Russell Info Sci Calendar Manager +kerberos-adm 749/tcp #kerberos administration +kerberos-adm 749/udp #kerberos administration +kerberos-iv 750/udp #kerberos version iv +tell 754/tcp #send +tell 754/udp #send +phonebook 767/tcp #phone +phonebook 767/udp #phone +multiling-http 777/tcp #Multiling HTTP +multiling-http 777/udp #Multiling HTTP +mdbs_daemon 800/tcp +mdbs_daemon 800/udp +fcp-udp 810/tcp #FCP +fcp-udp 810/udp #FCP Datagram +itm-mcell-s 828/tcp #itm-mcell-s +itm-mcell-s 828/udp #itm-mcell-s +pkix-3-ca-ra 829/tcp #PKIX-3 CA/RA +pkix-3-ca-ra 829/udp #PKIX-3 CA/RA +dhcp-failover2 847/tcp #dhcp-failover 2 +dhcp-failover2 847/udp #dhcp-failover 2 +gdoi 848/tcp #GDOI +gdoi 848/udp #GDOI +iscsi 860/tcp #iSCSI +iscsi 860/udp #iSCSI +rsync 873/tcp #rsync +rsync 873/udp #rsync +iclcnet-locate 886/tcp #ICL coNETion locate server +iclcnet-locate 886/udp #ICL coNETion locate server +iclcnet_svinfo 887/tcp #ICL coNETion server info +iclcnet_svinfo 887/udp #ICL coNETion server info +accessbuilder 888/tcp #AccessBuilder +accessbuilder 888/udp #AccessBuilder +cddbp 888/tcp #CD Database Protocol +omginitialrefs 900/tcp #OMG Initial Refs +omginitialrefs 900/udp #OMG Initial Refs +smpnameres 901/tcp #SMPNAMERES +smpnameres 901/udp #SMPNAMERES +ideafarm-chat 902/tcp #IDEAFARM-CHAT +ideafarm-chat 902/udp #IDEAFARM-CHAT +ideafarm-catch 903/tcp #IDEAFARM-CATCH +ideafarm-catch 903/udp #IDEAFARM-CATCH +xact-backup 911/tcp #xact-backup +xact-backup 911/udp #xact-backup +apex-mesh 912/tcp #APEX relay-relay service +apex-mesh 912/udp #APEX relay-relay service +apex-edge 913/tcp #APEX endpoint-relay service +apex-edge 913/udp #APEX endpoint-relay service +ftps-data 989/tcp #ftp protocol, data, over TLS/SSL +ftps-data 989/udp #ftp protocol, data, over TLS/SSL +ftps 990/tcp #ftp protocol, control, over TLS/SSL +ftps 990/udp #ftp protocol, control, over TLS/SSL +nas 991/tcp #Netnews Administration System +nas 991/udp #Netnews Administration System +telnets 992/tcp #telnet protocol over TLS/SSL +telnets 992/udp #telnet protocol over TLS/SSL +imaps 993/tcp #imap4 protocol over TLS/SSL +imaps 993/udp #imap4 protocol over TLS/SSL +ircs 994/tcp #irc protocol over TLS/SSL +ircs 994/udp #irc protocol over TLS/SSL +pop3s 995/tcp #pop3 protocol over TLS/SSL (was spop3) +pop3s 995/udp #pop3 protocol over TLS/SSL (was spop3) +vsinet 996/tcp #vsinet +vsinet 996/udp #vsinet +applix 999/udp #Applix ac +surf 1010/tcp #surf +surf 1010/udp #surf +blackjack 1025/tcp #network blackjack +blackjack 1025/udp #network blackjack +cap 1026/tcp #Calender Access Protocol +cap 1026/udp #Calender Access Protocol +exosee 1027/tcp #ExoSee +exosee 1027/udp #ExoSee +iad1 1030/tcp #BBN IAD +iad1 1030/udp #BBN IAD +iad2 1031/tcp #BBN IAD +iad2 1031/udp #BBN IAD +iad3 1032/tcp #BBN IAD +iad3 1032/udp #BBN IAD +netinfo-local 1033/tcp #local netinfo port +netinfo-local 1033/udp #local netinfo port +activesync 1034/tcp #ActiveSync Notifications +activesync 1034/udp #ActiveSync Notifications +mxxrlogin 1035/tcp #MX-XR RPC +mxxrlogin 1035/udp #MX-XR RPC +nsstp 1036/tcp #Nebula Secure Segment Transfer Protocol +nsstp 1036/udp #Nebula Secure Segment Transfer Protocol +ams 1037/tcp #AMS +ams 1037/udp #AMS +netarx 1040/tcp #Netarx +netarx 1040/udp #Netarx +fpitp 1045/tcp #Fingerprint Image Transfer Protocol +fpitp 1045/udp #Fingerprint Image Transfer Protocol +neod1 1047/tcp #Sun's NEO Object Request Broker +neod1 1047/udp #Sun's NEO Object Request Broker +neod2 1048/tcp #Sun's NEO Object Request Broker +neod2 1048/udp #Sun's NEO Object Request Broker +td-postman 1049/tcp #Tobit David Postman VPMN +td-postman 1049/udp #Tobit David Postman VPMN +cma 1050/tcp #CORBA Management Agent +cma 1050/udp #CORBA Management Agent +optima-vnet 1051/tcp #Optima VNET +optima-vnet 1051/udp #Optima VNET +ddt 1052/tcp #Dynamic DNS Tools +ddt 1052/udp #Dynamic DNS Tools +remote-as 1053/tcp #Remote Assistant (RA) +remote-as 1053/udp #Remote Assistant (RA) +brvread 1054/tcp #BRVREAD +brvread 1054/udp #BRVREAD +ansyslmd 1055/tcp #ANSYS - License Manager +ansyslmd 1055/udp #ANSYS - License Manager +vfo 1056/tcp #VFO +vfo 1056/udp #VFO +startron 1057/tcp #STARTRON +startron 1057/udp #STARTRON +nim 1058/tcp #nim +nim 1058/udp #nim +nimreg 1059/tcp #nimreg +nimreg 1059/udp #nimreg +polestar 1060/tcp #POLESTAR +polestar 1060/udp #POLESTAR +kiosk 1061/tcp #KIOSK +kiosk 1061/udp #KIOSK +veracity 1062/tcp #Veracity +veracity 1062/udp #Veracity +kyoceranetdev 1063/tcp #KyoceraNetDev +kyoceranetdev 1063/udp #KyoceraNetDev +jstel 1064/tcp #JSTEL +jstel 1064/udp #JSTEL +syscomlan 1065/tcp #SYSCOMLAN +syscomlan 1065/udp #SYSCOMLAN +fpo-fns 1066/tcp #FPO-FNS +fpo-fns 1066/udp #FPO-FNS +instl_boots 1067/tcp #Installation Bootstrap Proto. Serv. +instl_boots 1067/udp #Installation Bootstrap Proto. Serv. +instl_bootc 1068/tcp #Installation Bootstrap Proto. Cli. +instl_bootc 1068/udp #Installation Bootstrap Proto. Cli. +cognex-insight 1069/tcp #COGNEX-INSIGHT +cognex-insight 1069/udp #COGNEX-INSIGHT +gmrupdateserv 1070/tcp #GMRUpdateSERV +gmrupdateserv 1070/udp #GMRUpdateSERV +bsquare-voip 1071/tcp #BSQUARE-VOIP +bsquare-voip 1071/udp #BSQUARE-VOIP +cardax 1072/tcp #CARDAX +cardax 1072/udp #CARDAX +bridgecontrol 1073/tcp #Bridge Control +bridgecontrol 1073/udp #Bridge Control +fastechnologlm 1074/tcp #FASTechnologies License Manager +fastechnologlm 1074/udp #FASTechnologies License Manager +rdrmshc 1075/tcp #RDRMSHC +rdrmshc 1075/udp #RDRMSHC +dab-sti-c 1076/tcp #DAB STI-C +dab-sti-c 1076/udp #DAB STI-C +imgames 1077/tcp #IMGames +imgames 1077/udp #IMGames +avocent-proxy 1078/tcp #Avocent Proxy Protocol +avocent-proxy 1078/udp #Avocent Proxy Protocol +asprovatalk 1079/tcp #ASPROVATalk +asprovatalk 1079/udp #ASPROVATalk +socks 1080/tcp #Socks +socks 1080/udp #Socks +pvuniwien 1081/tcp #PVUNIWIEN +pvuniwien 1081/udp #PVUNIWIEN +amt-esd-prot 1082/tcp #AMT-ESD-PROT +amt-esd-prot 1082/udp #AMT-ESD-PROT +ansoft-lm-1 1083/tcp #Anasoft License Manager +ansoft-lm-1 1083/udp #Anasoft License Manager +ansoft-lm-2 1084/tcp #Anasoft License Manager +ansoft-lm-2 1084/udp #Anasoft License Manager +webobjects 1085/tcp #Web Objects +webobjects 1085/udp #Web Objects +cplscrambler-lg 1086/tcp #CPL Scrambler Logging +cplscrambler-lg 1086/udp #CPL Scrambler Logging +cplscrambler-in 1087/tcp #CPL Scrambler Internal +cplscrambler-in 1087/udp #CPL Scrambler Internal +cplscrambler-al 1088/tcp #CPL Scrambler Alarm Log +cplscrambler-al 1088/udp #CPL Scrambler Alarm Log +ff-annunc 1089/tcp #FF Annunciation +ff-annunc 1089/udp #FF Annunciation +ff-fms 1090/tcp #FF Fieldbus Message Specification +ff-fms 1090/udp #FF Fieldbus Message Specification +ff-sm 1091/tcp #FF System Management +ff-sm 1091/udp #FF System Management +obrpd 1092/tcp #Open Business Reporting Protocol +obrpd 1092/udp #Open Business Reporting Protocol +proofd 1093/tcp #PROOFD +proofd 1093/udp #PROOFD +rootd 1094/tcp #ROOTD +rootd 1094/udp #ROOTD +nicelink 1095/tcp #NICELink +nicelink 1095/udp #NICELink +cnrprotocol 1096/tcp #Common Name Resolution Protocol +cnrprotocol 1096/udp #Common Name Resolution Protocol +sunclustermgr 1097/tcp #Sun Cluster Manager +sunclustermgr 1097/udp #Sun Cluster Manager +rmiactivation 1098/tcp #RMI Activation +rmiactivation 1098/udp #RMI Activation +rmiregistry 1099/tcp #RMI Registry +rmiregistry 1099/udp #RMI Registry +mctp 1100/tcp #MCTP +mctp 1100/udp #MCTP +pt2-discover 1101/tcp #PT2-DISCOVER +pt2-discover 1101/udp #PT2-DISCOVER +adobeserver-1 1102/tcp #ADOBE SERVER 1 +adobeserver-1 1102/udp #ADOBE SERVER 1 +adobeserver-2 1103/tcp #ADOBE SERVER 2 +adobeserver-2 1103/udp #ADOBE SERVER 2 +xrl 1104/tcp #XRL +xrl 1104/udp #XRL +ftranhc 1105/tcp #FTRANHC +ftranhc 1105/udp #FTRANHC +isoipsigport-1 1106/tcp #ISOIPSIGPORT-1 +isoipsigport-1 1106/udp #ISOIPSIGPORT-1 +isoipsigport-2 1107/tcp #ISOIPSIGPORT-2 +isoipsigport-2 1107/udp #ISOIPSIGPORT-2 +ratio-adp 1108/tcp #ratio-adp +ratio-adp 1108/udp #ratio-adp +nfsd-status 1110/tcp #Cluster status info +nfsd-keepalive 1110/udp #Client status info +lmsocialserver 1111/tcp #LM Social Server +lmsocialserver 1111/udp #LM Social Server +icp 1112/tcp #Intelligent Communication Protocol +icp 1112/udp #Intelligent Communication Protocol +mini-sql 1114/tcp #Mini SQL +mini-sql 1114/udp #Mini SQL +ardus-trns 1115/tcp #ARDUS Transfer +ardus-trns 1115/udp #ARDUS Transfer +ardus-cntl 1116/tcp #ARDUS Control +ardus-cntl 1116/udp #ARDUS Control +ardus-mtrns 1117/tcp #ARDUS Multicast Transfer +ardus-mtrns 1117/udp #ARDUS Multicast Transfer +sacred 1118/tcp #SACRED +sacred 1118/udp #SACRED +rmpp 1121/tcp #Datalode RMPP +rmpp 1121/udp #Datalode RMPP +availant-mgr 1122/tcp #availant-mgr +availant-mgr 1122/udp #availant-mgr +murray 1123/tcp #Murray +murray 1123/udp #Murray +nfa 1155/tcp #Network File Access +nfa 1155/udp #Network File Access +health-polling 1161/tcp #Health Polling +health-polling 1161/udp #Health Polling +health-trap 1162/tcp #Health Trap +health-trap 1162/udp #Health Trap +vchat 1168/tcp #VChat Conference Service +vchat 1168/udp #VChat Conference Service +tripwire 1169/tcp #TRIPWIRE +tripwire 1169/udp #TRIPWIRE +atc-lm 1170/tcp #AT+C License Manager +atc-lm 1170/udp #AT+C License Manager +atc-appserver 1171/tcp #AT+C FmiApplicationServer +atc-appserver 1171/udp #AT+C FmiApplicationServer +mc-client 1180/tcp #Millicent Client Proxy +mc-client 1180/udp #Millicent Client Proxy +llsurfup-http 1183/tcp #LL Surfup HTTP +llsurfup-http 1183/udp #LL Surfup HTTP +llsurfup-https 1184/tcp #LL Surfup HTTPS +llsurfup-https 1184/udp #LL Surfup HTTPS +catchpole 1185/tcp #Catchpole port +catchpole 1185/udp #Catchpole port +hp-webadmin 1188/tcp #HP Web Admin +hp-webadmin 1188/udp #HP Web Admin +dmidi 1199/tcp #DMIDI +dmidi 1199/udp #DMIDI +scol 1200/tcp #SCOL +scol 1200/udp #SCOL +nucleus-sand 1201/tcp #Nucleus Sand +nucleus-sand 1201/udp #Nucleus Sand +caiccipc 1202/tcp #caiccipc +caiccipc 1202/udp #caiccipc +ssslic-mgr 1203/tcp #License Validation +ssslic-mgr 1203/udp #License Validation +ssslog-mgr 1204/tcp #Log Request Listener +ssslog-mgr 1204/udp #Log Request Listener +accord-mgc 1205/tcp #Accord-MGC +accord-mgc 1205/udp #Accord-MGC +anthony-data 1206/tcp #Anthony Data +anthony-data 1206/udp #Anthony Data +metasage 1207/tcp #MetaSage +metasage 1207/udp #MetaSage +seagull-ais 1208/tcp #SEAGULL AIS +seagull-ais 1208/udp #SEAGULL AIS +ipcd3 1209/tcp #IPCD3 +ipcd3 1209/udp #IPCD3 +eoss 1210/tcp #EOSS +eoss 1210/udp #EOSS +groove-dpp 1211/tcp #Groove DPP +groove-dpp 1211/udp #Groove DPP +lupa 1212/tcp #lupa +lupa 1212/udp #lupa +mpc-lifenet 1213/tcp #MPC LIFENET +mpc-lifenet 1213/udp #MPC LIFENET +kazaa 1214/tcp #KAZAA +kazaa 1214/udp #KAZAA +scanstat-1 1215/tcp #scanSTAT 1.0 +scanstat-1 1215/udp #scanSTAT 1.0 +etebac5 1216/tcp #ETEBAC 5 +etebac5 1216/udp #ETEBAC 5 +hpss-ndapi 1217/tcp #HPSS-NDAPI +hpss-ndapi 1217/udp #HPSS-NDAPI +aeroflight-ads 1218/tcp #AeroFlight-ADs +aeroflight-ads 1218/udp #AeroFlight-ADs +aeroflight-ret 1219/tcp #AeroFlight-Ret +aeroflight-ret 1219/udp #AeroFlight-Ret +qt-serveradmin 1220/tcp #QT SERVER ADMIN +qt-serveradmin 1220/udp #QT SERVER ADMIN +sweetware-apps 1221/tcp #SweetWARE Apps +sweetware-apps 1221/udp #SweetWARE Apps +nerv 1222/tcp #SNI R&D network +nerv 1222/udp #SNI R&D network +tgp 1223/tcp #TGP +tgp 1223/udp #TGP +vpnz 1224/tcp #VPNz +vpnz 1224/udp #VPNz +slinkysearch 1225/tcp #SLINKYSEARCH +slinkysearch 1225/udp #SLINKYSEARCH +stgxfws 1226/tcp #STGXFWS +stgxfws 1226/udp #STGXFWS +dns2go 1227/tcp #DNS2Go +dns2go 1227/udp #DNS2Go +florence 1228/tcp #FLORENCE +florence 1228/udp #FLORENCE +novell-zfs 1229/tcp #Novell ZFS +novell-zfs 1229/udp #Novell ZFS +periscope 1230/tcp #Periscope +periscope 1230/udp #Periscope +menandmice-lpm 1231/tcp #menandmice-lpm +menandmice-lpm 1231/udp #menandmice-lpm +univ-appserver 1233/tcp #Universal App Server +univ-appserver 1233/udp #Universal App Server +search-agent 1234/tcp #Infoseek Search Agent +search-agent 1234/udp #Infoseek Search Agent +mosaicsyssvc1 1235/tcp #mosaicsyssvc1 +mosaicsyssvc1 1235/udp #mosaicsyssvc1 +bvcontrol 1236/tcp #bvcontrol +bvcontrol 1236/udp #bvcontrol +tsdos390 1237/tcp #tsdos390 +tsdos390 1237/udp #tsdos390 +hacl-qs 1238/tcp #hacl-qs +hacl-qs 1238/udp #hacl-qs +nmsd 1239/tcp #NMSD +nmsd 1239/udp #NMSD +instantia 1240/tcp #Instantia +instantia 1240/udp #Instantia +nessus 1241/tcp #nessus +nessus 1241/udp #nessus +nmasoverip 1242/tcp #NMAS over IP +nmasoverip 1242/udp #NMAS over IP +serialgateway 1243/tcp #SerialGateway +serialgateway 1243/udp #SerialGateway +isbconference1 1244/tcp #isbconference1 +isbconference1 1244/udp #isbconference1 +isbconference2 1245/tcp #isbconference2 +isbconference2 1245/udp #isbconference2 +payrouter 1246/tcp #payrouter +payrouter 1246/udp #payrouter +visionpyramid 1247/tcp #VisionPyramid +visionpyramid 1247/udp #VisionPyramid +hermes 1248/tcp #hermes +hermes 1248/udp #hermes +mesavistaco 1249/tcp #Mesa Vista Co +mesavistaco 1249/udp #Mesa Vista Co +swldy-sias 1250/tcp #swldy-sias +swldy-sias 1250/udp #swldy-sias +servergraph 1251/tcp #servergraph +servergraph 1251/udp #servergraph +bspne-pcc 1252/tcp #bspne-pcc +bspne-pcc 1252/udp #bspne-pcc +q55-pcc 1253/tcp #q55-pcc +q55-pcc 1253/udp #q55-pcc +de-noc 1254/tcp #de-noc +de-noc 1254/udp #de-noc +de-cache-query 1255/tcp #de-cache-query +de-cache-query 1255/udp #de-cache-query +de-server 1256/tcp #de-server +de-server 1256/udp #de-server +shockwave2 1257/tcp #Shockwave 2 +shockwave2 1257/udp #Shockwave 2 +opennl 1258/tcp #Open Network Library +opennl 1258/udp #Open Network Library +opennl-voice 1259/tcp #Open Network Library Voice +opennl-voice 1259/udp #Open Network Library Voice +ibm-ssd 1260/tcp #ibm-ssd +ibm-ssd 1260/udp #ibm-ssd +mpshrsv 1261/tcp #mpshrsv +mpshrsv 1261/udp #mpshrsv +qnts-orb 1262/tcp #QNTS-ORB +qnts-orb 1262/udp #QNTS-ORB +dka 1263/tcp #dka +dka 1263/udp #dka +prat 1264/tcp #PRAT +prat 1264/udp #PRAT +dssiapi 1265/tcp #DSSIAPI +dssiapi 1265/udp #DSSIAPI +dellpwrappks 1266/tcp #DELLPWRAPPKS +dellpwrappks 1266/udp #DELLPWRAPPKS +epc 1267/tcp #eTrust Policy Compliance +epc 1267/udp #eTrust Policy Compliance +propel-msgsys 1268/tcp #PROPEL-MSGSYS +propel-msgsys 1268/udp #PROPEL-MSGSYS +watilapp 1269/tcp #WATiLaPP +watilapp 1269/udp #WATiLaPP +opsmgr 1270/tcp #Microsoft Operations Manager +opsmgr 1270/udp #Microsoft Operations Manager +excw 1271/tcp #eXcW +excw 1271/udp #eXcW +cspmlockmgr 1272/tcp #CSPMLockMgr +cspmlockmgr 1272/udp #CSPMLockMgr +emc-gateway 1273/tcp #EMC-Gateway +emc-gateway 1273/udp #EMC-Gateway +t1distproc 1274/tcp #t1distproc +t1distproc 1274/udp #t1distproc +ivcollector 1275/tcp #ivcollector +ivcollector 1275/udp #ivcollector +ivmanager 1276/tcp #ivmanager +ivmanager 1276/udp #ivmanager +miva-mqs 1277/tcp #mqs +miva-mqs 1277/udp #mqs +dellwebadmin-1 1278/tcp #Dell Web Admin 1 +dellwebadmin-1 1278/udp #Dell Web Admin 1 +dellwebadmin-2 1279/tcp #Dell Web Admin 2 +dellwebadmin-2 1279/udp #Dell Web Admin 2 +pictrography 1280/tcp #Pictrography +pictrography 1280/udp #Pictrography +healthd 1281/tcp #healthd +healthd 1281/udp #healthd +emperion 1282/tcp #Emperion +emperion 1282/udp #Emperion +productinfo 1283/tcp #ProductInfo +productinfo 1283/udp #ProductInfo +iee-qfx 1284/tcp #IEE-QFX +iee-qfx 1284/udp #IEE-QFX +neoiface 1285/tcp #neoiface +neoiface 1285/udp #neoiface +netuitive 1286/tcp #netuitive +netuitive 1286/udp #netuitive +navbuddy 1288/tcp #NavBuddy +navbuddy 1288/udp #NavBuddy +jwalkserver 1289/tcp #JWalkServer +jwalkserver 1289/udp #JWalkServer +winjaserver 1290/tcp #WinJaServer +winjaserver 1290/udp #WinJaServer +seagulllms 1291/tcp #SEAGULLLMS +seagulllms 1291/udp #SEAGULLLMS +dsdn 1292/tcp #dsdn +dsdn 1292/udp #dsdn +pkt-krb-ipsec 1293/tcp #PKT-KRB-IPSec +pkt-krb-ipsec 1293/udp #PKT-KRB-IPSec +cmmdriver 1294/tcp #CMMdriver +cmmdriver 1294/udp #CMMdriver +ehtp 1295/tcp #End-by-Hop Transmission Protocol +ehtp 1295/udp #End-by-Hop Transmission Protocol +dproxy 1296/tcp #dproxy +dproxy 1296/udp #dproxy +sdproxy 1297/tcp #sdproxy +sdproxy 1297/udp #sdproxy +lpcp 1298/tcp #lpcp +lpcp 1298/udp #lpcp +hp-sci 1299/tcp #hp-sci +hp-sci 1299/udp #hp-sci +h323hostcallsc 1300/tcp #H323 Host Call Secure +h323hostcallsc 1300/udp #H323 Host Call Secure +ci3-software-1 1301/tcp #CI3-Software-1 +ci3-software-1 1301/udp #CI3-Software-1 +ci3-software-2 1302/tcp #CI3-Software-2 +ci3-software-2 1302/udp #CI3-Software-2 +sftsrv 1303/tcp #sftsrv +sftsrv 1303/udp #sftsrv +boomerang 1304/tcp #Boomerang +boomerang 1304/udp #Boomerang +pe-mike 1305/tcp #pe-mike +pe-mike 1305/udp #pe-mike +re-conn-proto 1306/tcp #RE-Conn-Proto +re-conn-proto 1306/udp #RE-Conn-Proto +pacmand 1307/tcp #Pacmand +pacmand 1307/udp #Pacmand +odsi 1308/tcp #Optical Domain Service Interconnect (ODSI) +odsi 1308/udp #Optical Domain Service Interconnect (ODSI) +jtag-server 1309/tcp #JTAG server +jtag-server 1309/udp #JTAG server +husky 1310/tcp #Husky +husky 1310/udp #Husky +rxmon 1311/tcp #RxMon +rxmon 1311/udp #RxMon +sti-envision 1312/tcp #STI Envision +sti-envision 1312/udp #STI Envision +bmc_patroldb 1313/tcp #BMC_PATROLDB +bmc_patroldb 1313/udp #BMC_PATROLDB +pdps 1314/tcp #Photoscript Distributed Printing System +pdps 1314/udp #Photoscript Distributed Printing System +els 1315/tcp #E.L.S., Event Listener Service +els 1315/udp #E.L.S., Event Listener Service +exbit-escp 1316/tcp #Exbit-ESCP +exbit-escp 1316/udp #Exbit-ESCP +vrts-ipcserver 1317/tcp #vrts-ipcserver +vrts-ipcserver 1317/udp #vrts-ipcserver +krb5gatekeeper 1318/tcp #krb5gatekeeper +krb5gatekeeper 1318/udp #krb5gatekeeper +panja-icsp 1319/tcp #Panja-ICSP +panja-icsp 1319/udp #Panja-ICSP +panja-axbnet 1320/tcp #Panja-AXBNET +panja-axbnet 1320/udp #Panja-AXBNET +pip 1321/tcp #PIP +pip 1321/udp #PIP +novation 1322/tcp #Novation +novation 1322/udp #Novation +brcd 1323/tcp #brcd +brcd 1323/udp #brcd +delta-mcp 1324/tcp #delta-mcp +delta-mcp 1324/udp #delta-mcp +dx-instrument 1325/tcp #DX-Instrument +dx-instrument 1325/udp #DX-Instrument +wimsic 1326/tcp #WIMSIC +wimsic 1326/udp #WIMSIC +ultrex 1327/tcp #Ultrex +ultrex 1327/udp #Ultrex +ewall 1328/tcp #EWALL +ewall 1328/udp #EWALL +netdb-export 1329/tcp #netdb-export +netdb-export 1329/udp #netdb-export +streetperfect 1330/tcp #StreetPerfect +streetperfect 1330/udp #StreetPerfect +intersan 1331/tcp #intersan +intersan 1331/udp #intersan +pcia-rxp-b 1332/tcp #PCIA RXP-B +pcia-rxp-b 1332/udp #PCIA RXP-B +passwrd-policy 1333/tcp #Password Policy +passwrd-policy 1333/udp #Password Policy +writesrv 1334/tcp #writesrv +writesrv 1334/udp #writesrv +digital-notary 1335/tcp #Digital Notary Protocol +digital-notary 1335/udp #Digital Notary Protocol +ischat 1336/tcp #Instant Service Chat +ischat 1336/udp #Instant Service Chat +menandmice-dns 1337/tcp #menandmice DNS +menandmice-dns 1337/udp #menandmice DNS +wmc-log-svc 1338/tcp #WMC-log-svr +wmc-log-svc 1338/udp #WMC-log-svr +kjtsiteserver 1339/tcp #kjtsiteserver +kjtsiteserver 1339/udp #kjtsiteserver +naap 1340/tcp #NAAP +naap 1340/udp #NAAP +qubes 1341/tcp #QuBES +qubes 1341/udp #QuBES +esbroker 1342/tcp #ESBroker +esbroker 1342/udp #ESBroker +re101 1343/tcp #re101 +re101 1343/udp #re101 +icap 1344/tcp #ICAP +icap 1344/udp #ICAP +vpjp 1345/tcp #VPJP +vpjp 1345/udp #VPJP +alta-ana-lm 1346/tcp #Alta Analytics License Manager +alta-ana-lm 1346/udp #Alta Analytics License Manager +bbn-mmc 1347/tcp #multi media conferencing +bbn-mmc 1347/udp #multi media conferencing +bbn-mmx 1348/tcp #multi media conferencing +bbn-mmx 1348/udp #multi media conferencing +sbook 1349/tcp #Registration Network Protocol +sbook 1349/udp #Registration Network Protocol +editbench 1350/tcp #Registration Network Protocol +editbench 1350/udp #Registration Network Protocol +equationbuilder 1351/tcp #Digital Tool Works (MIT) +equationbuilder 1351/udp #Digital Tool Works (MIT) +lotusnote 1352/tcp #Lotus Note +lotusnote 1352/udp #Lotus Note +relief 1353/tcp #Relief Consulting +relief 1353/udp #Relief Consulting +intuitive-edge 1355/tcp #Intuitive Edge +intuitive-edge 1355/udp #Intuitive Edge +cuillamartin 1356/tcp #CuillaMartin Company +cuillamartin 1356/udp #CuillaMartin Company +pegboard 1357/tcp #Electronic PegBoard +pegboard 1357/udp #Electronic PegBoard +connlcli 1358/tcp #CONNLCLI +connlcli 1358/udp #CONNLCLI +ftsrv 1359/tcp #FTSRV +ftsrv 1359/udp #FTSRV +mimer 1360/tcp #MIMER +mimer 1360/udp #MIMER +linx 1361/tcp #LinX +linx 1361/udp #LinX +timeflies 1362/tcp #TimeFlies +timeflies 1362/udp #TimeFlies +ndm-requester 1363/tcp #Network DataMover Requester +ndm-requester 1363/udp #Network DataMover Requester +ndm-server 1364/tcp #Network DataMover Server +ndm-server 1364/udp #Network DataMover Server +adapt-sna 1365/tcp #Network Software Associates +adapt-sna 1365/udp #Network Software Associates +netware-csp 1366/tcp #Novell NetWare Comm Service Platform +netware-csp 1366/udp #Novell NetWare Comm Service Platform +dcs 1367/tcp #DCS +dcs 1367/udp #DCS +screencast 1368/tcp #ScreenCast +screencast 1368/udp #ScreenCast +gv-us 1369/tcp #GlobalView to Unix Shell +gv-us 1369/udp #GlobalView to Unix Shell +us-gv 1370/tcp #Unix Shell to GlobalView +us-gv 1370/udp #Unix Shell to GlobalView +fc-cli 1371/tcp #Fujitsu Config Protocol +fc-cli 1371/udp #Fujitsu Config Protocol +fc-ser 1372/tcp #Fujitsu Config Protocol +fc-ser 1372/udp #Fujitsu Config Protocol +chromagrafx 1373/tcp #Chromagrafx +chromagrafx 1373/udp #Chromagrafx +molly 1374/tcp #EPI Software Systems +molly 1374/udp #EPI Software Systems +bytex 1375/tcp #Bytex +bytex 1375/udp #Bytex +ibm-pps 1376/tcp #IBM Person to Person Software +ibm-pps 1376/udp #IBM Person to Person Software +cichlid 1377/tcp #Cichlid License Manager +cichlid 1377/udp #Cichlid License Manager +elan 1378/tcp #Elan License Manager +elan 1378/udp #Elan License Manager +dbreporter 1379/tcp #Integrity Solutions +dbreporter 1379/udp #Integrity Solutions +telesis-licman 1380/tcp #Telesis Network License Manager +telesis-licman 1380/udp #Telesis Network License Manager +apple-licman 1381/tcp #Apple Network License Manager +apple-licman 1381/udp #Apple Network License Manager +udt_os 1382/tcp #udt_os +udt_os 1382/udp #udt_os +gwha 1383/tcp #GW Hannaway Network License Manager +gwha 1383/udp #GW Hannaway Network License Manager +os-licman 1384/tcp #Objective Solutions License Manager +os-licman 1384/udp #Objective Solutions License Manager +atex_elmd 1385/tcp #Atex Publishing License Manager +atex_elmd 1385/udp #Atex Publishing License Manager +checksum 1386/tcp #CheckSum License Manager +checksum 1386/udp #CheckSum License Manager +cadsi-lm 1387/tcp #Computer Aided Design Software Inc LM +cadsi-lm 1387/udp #Computer Aided Design Software Inc LM +objective-dbc 1388/tcp #Objective Solutions DataBase Cache +objective-dbc 1388/udp #Objective Solutions DataBase Cache +iclpv-dm 1389/tcp #Document Manager +iclpv-dm 1389/udp #Document Manager +iclpv-sc 1390/tcp #Storage Controller +iclpv-sc 1390/udp #Storage Controller +iclpv-sas 1391/tcp #Storage Access Server +iclpv-sas 1391/udp #Storage Access Server +iclpv-pm 1392/tcp #Print Manager +iclpv-pm 1392/udp #Print Manager +iclpv-nls 1393/tcp #Network Log Server +iclpv-nls 1393/udp #Network Log Server +iclpv-nlc 1394/tcp #Network Log Client +iclpv-nlc 1394/udp #Network Log Client +iclpv-wsm 1395/tcp #PC Workstation Manager software +iclpv-wsm 1395/udp #PC Workstation Manager software +dvl-activemail 1396/tcp #DVL Active Mail +dvl-activemail 1396/udp #DVL Active Mail +audio-activmail 1397/tcp #Audio Active Mail +audio-activmail 1397/udp #Audio Active Mail +video-activmail 1398/tcp #Video Active Mail +video-activmail 1398/udp #Video Active Mail +cadkey-licman 1399/tcp #Cadkey License Manager +cadkey-licman 1399/udp #Cadkey License Manager +cadkey-tablet 1400/tcp #Cadkey Tablet Daemon +cadkey-tablet 1400/udp #Cadkey Tablet Daemon +goldleaf-licman 1401/tcp #Goldleaf License Manager +goldleaf-licman 1401/udp #Goldleaf License Manager +prm-sm-np 1402/tcp #Prospero Resource Manager +prm-sm-np 1402/udp #Prospero Resource Manager +prm-nm-np 1403/tcp #Prospero Resource Manager +prm-nm-np 1403/udp #Prospero Resource Manager +igi-lm 1404/tcp #Infinite Graphics License Manager +igi-lm 1404/udp #Infinite Graphics License Manager +ibm-res 1405/tcp #IBM Remote Execution Starter +ibm-res 1405/udp #IBM Remote Execution Starter +netlabs-lm 1406/tcp #NetLabs License Manager +netlabs-lm 1406/udp #NetLabs License Manager +dbsa-lm 1407/tcp #DBSA License Manager +dbsa-lm 1407/udp #DBSA License Manager +sophia-lm 1408/tcp #Sophia License Manager +sophia-lm 1408/udp #Sophia License Manager +here-lm 1409/tcp #Here License Manager +here-lm 1409/udp #Here License Manager +hiq 1410/tcp #HiQ License Manager +hiq 1410/udp #HiQ License Manager +af 1411/tcp #AudioFile +af 1411/udp #AudioFile +innosys 1412/tcp #InnoSys +innosys 1412/udp #InnoSys +innosys-acl 1413/tcp #Innosys-ACL +innosys-acl 1413/udp #Innosys-ACL +ibm-mqseries 1414/tcp #IBM MQSeries +ibm-mqseries 1414/udp #IBM MQSeries +dbstar 1415/tcp #DBStar +dbstar 1415/udp #DBStar +novell-lu6.2 1416/tcp #Novell LU6.2 +novell-lu6.2 1416/udp #Novell LU6.2 +timbuktu-srv1 1417/tcp #Timbuktu Service 1 Port +timbuktu-srv1 1417/udp #Timbuktu Service 1 Port +timbuktu-srv2 1418/tcp #Timbuktu Service 2 Port +timbuktu-srv2 1418/udp #Timbuktu Service 2 Port +timbuktu-srv3 1419/tcp #Timbuktu Service 3 Port +timbuktu-srv3 1419/udp #Timbuktu Service 3 Port +timbuktu-srv4 1420/tcp #Timbuktu Service 4 Port +timbuktu-srv4 1420/udp #Timbuktu Service 4 Port +gandalf-lm 1421/tcp #Gandalf License Manager +gandalf-lm 1421/udp #Gandalf License Manager +autodesk-lm 1422/tcp #Autodesk License Manager +autodesk-lm 1422/udp #Autodesk License Manager +essbase 1423/tcp #Essbase Arbor Software +essbase 1423/udp #Essbase Arbor Software +hybrid 1424/tcp #Hybrid Encryption Protocol +hybrid 1424/udp #Hybrid Encryption Protocol +zion-lm 1425/tcp #Zion Software License Manager +zion-lm 1425/udp #Zion Software License Manager +sais 1426/tcp #Satellite-data Acquisition System 1 +sais 1426/udp #Satellite-data Acquisition System 1 +mloadd 1427/tcp #mloadd monitoring tool +mloadd 1427/udp #mloadd monitoring tool +informatik-lm 1428/tcp #Informatik License Manager +informatik-lm 1428/udp #Informatik License Manager +nms 1429/tcp #Hypercom NMS +nms 1429/udp #Hypercom NMS +tpdu 1430/tcp #Hypercom TPDU +tpdu 1430/udp #Hypercom TPDU +rgtp 1431/tcp #Reverse Gossip Transport +rgtp 1431/udp #Reverse Gossip Transport +blueberry-lm 1432/tcp #Blueberry Software License Manager +blueberry-lm 1432/udp #Blueberry Software License Manager +ms-sql-s 1433/tcp #Microsoft-SQL-Server +ms-sql-s 1433/udp #Microsoft-SQL-Server +ms-sql-m 1434/tcp #Microsoft-SQL-Monitor +ms-sql-m 1434/udp #Microsoft-SQL-Monitor +ibm-cics 1435/tcp #IBM CICS +ibm-cics 1435/udp #IBM CICS +saism 1436/tcp #Satellite-data Acquisition System 2 +saism 1436/udp #Satellite-data Acquisition System 2 +tabula 1437/tcp #Tabula +tabula 1437/udp #Tabula +eicon-server 1438/tcp #Eicon Security Agent/Server +eicon-server 1438/udp #Eicon Security Agent/Server +eicon-x25 1439/tcp #Eicon X25/SNA Gateway +eicon-x25 1439/udp #Eicon X25/SNA Gateway +eicon-slp 1440/tcp #Eicon Service Location Protocol +eicon-slp 1440/udp #Eicon Service Location Protocol +cadis-1 1441/tcp #Cadis License Management +cadis-1 1441/udp #Cadis License Management +cadis-2 1442/tcp #Cadis License Management +cadis-2 1442/udp #Cadis License Management +ies-lm 1443/tcp #Integrated Engineering Software +ies-lm 1443/udp #Integrated Engineering Software +marcam-lm 1444/tcp #Marcam License Management +marcam-lm 1444/udp #Marcam License Management +proxima-lm 1445/tcp #Proxima License Manager +proxima-lm 1445/udp #Proxima License Manager +ora-lm 1446/tcp #Optical Research Associates License Manager +ora-lm 1446/udp #Optical Research Associates License Manager +apri-lm 1447/tcp #Applied Parallel Research LM +apri-lm 1447/udp #Applied Parallel Research LM +oc-lm 1448/tcp #OpenConnect License Manager +oc-lm 1448/udp #OpenConnect License Manager +peport 1449/tcp #PEport +peport 1449/udp #PEport +dwf 1450/tcp #Tandem Distributed Workbench Facility +dwf 1450/udp #Tandem Distributed Workbench Facility +infoman 1451/tcp #IBM Information Management +infoman 1451/udp #IBM Information Management +gtegsc-lm 1452/tcp #GTE Government Systems License Man +gtegsc-lm 1452/udp #GTE Government Systems License Man +genie-lm 1453/tcp #Genie License Manager +genie-lm 1453/udp #Genie License Manager +interhdl_elmd 1454/tcp #interHDL License Manager +interhdl_elmd 1454/udp #interHDL License Manager +esl-lm 1455/tcp #ESL License Manager +esl-lm 1455/udp #ESL License Manager +dca 1456/tcp #DCA +dca 1456/udp #DCA +valisys-lm 1457/tcp #Valisys License Manager +valisys-lm 1457/udp #Valisys License Manager +nrcabq-lm 1458/tcp #Nichols Research Corp. +nrcabq-lm 1458/udp #Nichols Research Corp. +proshare1 1459/tcp #Proshare Notebook Application +proshare1 1459/udp #Proshare Notebook Application +proshare2 1460/tcp #Proshare Notebook Application +proshare2 1460/udp #Proshare Notebook Application +ibm_wrless_lan 1461/tcp #IBM Wireless LAN +ibm_wrless_lan 1461/udp #IBM Wireless LAN +world-lm 1462/tcp #World License Manager +world-lm 1462/udp #World License Manager +nucleus 1463/tcp #Nucleus +nucleus 1463/udp #Nucleus +msl_lmd 1464/tcp #MSL License Manager +msl_lmd 1464/udp #MSL License Manager +pipes 1465/tcp #Pipes Platform +pipes 1465/udp #Pipes Platform mfarlin@peerlogic.com +oceansoft-lm 1466/tcp #Ocean Software License Manager +oceansoft-lm 1466/udp #Ocean Software License Manager +csdmbase 1467/tcp #CSDMBASE +csdmbase 1467/udp #CSDMBASE +csdm 1468/tcp #CSDM +csdm 1468/udp #CSDM +aal-lm 1469/tcp #Active Analysis Limited License Manager +aal-lm 1469/udp #Active Analysis Limited License Manager +uaiact 1470/tcp #Universal Analytics +uaiact 1470/udp #Universal Analytics +csdmbase 1471/tcp #csdmbase +csdmbase 1471/udp #csdmbase +csdm 1472/tcp #csdm +csdm 1472/udp #csdm +openmath 1473/tcp #OpenMath +openmath 1473/udp #OpenMath +telefinder 1474/tcp #Telefinder +telefinder 1474/udp #Telefinder +taligent-lm 1475/tcp #Taligent License Manager +taligent-lm 1475/udp #Taligent License Manager +clvm-cfg 1476/tcp #clvm-cfg +clvm-cfg 1476/udp #clvm-cfg +ms-sna-server 1477/tcp #ms-sna-server +ms-sna-server 1477/udp #ms-sna-server +ms-sna-base 1478/tcp #ms-sna-base +ms-sna-base 1478/udp #ms-sna-base +dberegister 1479/tcp #dberegister +dberegister 1479/udp #dberegister +pacerforum 1480/tcp #PacerForum +pacerforum 1480/udp #PacerForum +airs 1481/tcp #AIRS +airs 1481/udp #AIRS +miteksys-lm 1482/tcp #Miteksys License Manager +miteksys-lm 1482/udp #Miteksys License Manager +afs 1483/tcp #AFS License Manager +afs 1483/udp #AFS License Manager +confluent 1484/tcp #Confluent License Manager +confluent 1484/udp #Confluent License Manager +lansource 1485/tcp #LANSource +lansource 1485/udp #LANSource +nms_topo_serv 1486/tcp #nms_topo_serv +nms_topo_serv 1486/udp #nms_topo_serv +localinfosrvr 1487/tcp #LocalInfoSrvr +localinfosrvr 1487/udp #LocalInfoSrvr +docstor 1488/tcp #DocStor +docstor 1488/udp #DocStor +dmdocbroker 1489/tcp #dmdocbroker +dmdocbroker 1489/udp #dmdocbroker +insitu-conf 1490/tcp #insitu-conf +insitu-conf 1490/udp #insitu-conf +anynetgateway 1491/tcp #anynetgateway +anynetgateway 1491/udp #anynetgateway +stone-design-1 1492/tcp #stone-design-1 +stone-design-1 1492/udp #stone-design-1 +netmap_lm 1493/tcp #netmap_lm +netmap_lm 1493/udp #netmap_lm +ica 1494/tcp #ica +ica 1494/udp #ica +cvc 1495/tcp #cvc +cvc 1495/udp #cvc +liberty-lm 1496/tcp #liberty-lm +liberty-lm 1496/udp #liberty-lm +rfx-lm 1497/tcp #rfx-lm +rfx-lm 1497/udp #rfx-lm +sybase-sqlany 1498/tcp #Sybase SQL Any +sybase-sqlany 1498/udp #Sybase SQL Any +fhc 1499/tcp #Federico Heinz Consultora +fhc 1499/udp #Federico Heinz Consultora +vlsi-lm 1500/tcp #VLSI License Manager +vlsi-lm 1500/udp #VLSI License Manager +saiscm 1501/tcp #Satellite-data Acquisition System 3 +saiscm 1501/udp #Satellite-data Acquisition System 3 +shivadiscovery 1502/tcp #Shiva +shivadiscovery 1502/udp #Shiva +imtc-mcs 1503/tcp #Databeam +imtc-mcs 1503/udp #Databeam +evb-elm 1504/tcp #EVB Software Engineering License Manager +evb-elm 1504/udp #EVB Software Engineering License Manager +funkproxy 1505/tcp #Funk Software, Inc. +funkproxy 1505/udp #Funk Software, Inc. +utcd 1506/tcp #Universal Time daemon (utcd) +utcd 1506/udp #Universal Time daemon (utcd) +symplex 1507/tcp #symplex +symplex 1507/udp #symplex +diagmond 1508/tcp #diagmond +diagmond 1508/udp #diagmond +robcad-lm 1509/tcp #Robcad, Ltd. License Manager +robcad-lm 1509/udp #Robcad, Ltd. License Manager +mvx-lm 1510/tcp #Midland Valley Exploration Ltd. Lic. Man. +mvx-lm 1510/udp #Midland Valley Exploration Ltd. Lic. Man. +3l-l1 1511/tcp #3l-l1 +3l-l1 1511/udp #3l-l1 +wins 1512/tcp #Microsoft's Windows Internet Name Service +wins 1512/udp #Microsoft's Windows Internet Name Service +fujitsu-dtc 1513/tcp #Fujitsu Systems Business of America, Inc +fujitsu-dtc 1513/udp #Fujitsu Systems Business of America, Inc +fujitsu-dtcns 1514/tcp #Fujitsu Systems Business of America, Inc +fujitsu-dtcns 1514/udp #Fujitsu Systems Business of America, Inc +ifor-protocol 1515/tcp #ifor-protocol +ifor-protocol 1515/udp #ifor-protocol +vpad 1516/tcp #Virtual Places Audio data +vpad 1516/udp #Virtual Places Audio data +vpac 1517/tcp #Virtual Places Audio control +vpac 1517/udp #Virtual Places Audio control +vpvd 1518/tcp #Virtual Places Video data +vpvd 1518/udp #Virtual Places Video data +vpvc 1519/tcp #Virtual Places Video control +vpvc 1519/udp #Virtual Places Video control +atm-zip-office 1520/tcp #atm zip office +atm-zip-office 1520/udp #atm zip office +ncube-lm 1521/tcp #nCube License Manager +ncube-lm 1521/udp #nCube License Manager +ricardo-lm 1522/tcp #Ricardo North America License Manager +ricardo-lm 1522/udp #Ricardo North America License Manager +cichild-lm 1523/tcp #cichild +cichild-lm 1523/udp #cichild +ingreslock 1524/tcp #ingres +ingreslock 1524/udp #ingres +orasrv 1525/tcp #oracle +orasrv 1525/udp #oracle +prospero-np 1525/tcp #Prospero Directory Service non-priv +prospero-np 1525/udp #Prospero Directory Service non-priv +pdap-np 1526/tcp #Prospero Data Access Prot non-priv +pdap-np 1526/udp #Prospero Data Access Prot non-priv +tlisrv 1527/tcp #oracle +tlisrv 1527/udp #oracle +mciautoreg 1528/tcp #micautoreg +mciautoreg 1528/udp #micautoreg +coauthor 1529/tcp #oracle +coauthor 1529/udp #oracle +rap-service 1530/tcp #rap-service +rap-service 1530/udp #rap-service +rap-listen 1531/tcp #rap-listen +rap-listen 1531/udp #rap-listen +miroconnect 1532/tcp #miroconnect +miroconnect 1532/udp #miroconnect +virtual-places 1533/tcp #Virtual Places Software +virtual-places 1533/udp #Virtual Places Software +micromuse-lm 1534/tcp #micromuse-lm +micromuse-lm 1534/udp #micromuse-lm +ampr-info 1535/tcp #ampr-info +ampr-info 1535/udp #ampr-info +ampr-inter 1536/tcp #ampr-inter +ampr-inter 1536/udp #ampr-inter +sdsc-lm 1537/tcp #isi-lm +sdsc-lm 1537/udp #isi-lm +3ds-lm 1538/tcp #3ds-lm +3ds-lm 1538/udp #3ds-lm +intellistor-lm 1539/tcp #Intellistor License Manager +intellistor-lm 1539/udp #Intellistor License Manager +rds 1540/tcp #rds +rds 1540/udp #rds +rds2 1541/tcp #rds2 +rds2 1541/udp #rds2 +gridgen-elmd 1542/tcp #gridgen-elmd +gridgen-elmd 1542/udp #gridgen-elmd +simba-cs 1543/tcp #simba-cs +simba-cs 1543/udp #simba-cs +aspeclmd 1544/tcp #aspeclmd +aspeclmd 1544/udp #aspeclmd +vistium-share 1545/tcp #vistium-share +vistium-share 1545/udp #vistium-share +abbaccuray 1546/tcp #abbaccuray +abbaccuray 1546/udp #abbaccuray +laplink 1547/tcp #laplink +laplink 1547/udp #laplink +axon-lm 1548/tcp #Axon License Manager +axon-lm 1548/udp #Axon License Manager +shivahose 1549/tcp #Shiva Hose +shivasound 1549/udp #Shiva Sound +3m-image-lm 1550/tcp #Image Storage license manager 3M Company +3m-image-lm 1550/udp #Image Storage license manager 3M Company +hecmtl-db 1551/tcp #HECMTL-DB +hecmtl-db 1551/udp #HECMTL-DB +pciarray 1552/tcp #pciarray +pciarray 1552/udp #pciarray +sna-cs 1553/tcp #sna-cs +sna-cs 1553/udp #sna-cs +caci-lm 1554/tcp #CACI Products Company License Manager +caci-lm 1554/udp #CACI Products Company License Manager +livelan 1555/tcp #livelan +livelan 1555/udp #livelan +veritas_pbx 1556/tcp #VERITAS Private Branch Exchange +veritas_pbx 1556/udp #VERITAS Private Branch Exchange +arbortext-lm 1557/tcp #ArborText License Manager +arbortext-lm 1557/udp #ArborText License Manager +xingmpeg 1558/tcp #xingmpeg +xingmpeg 1558/udp #xingmpeg +web2host 1559/tcp #web2host +web2host 1559/udp #web2host +asci-val 1560/tcp #ASCI-RemoteSHADOW +asci-val 1560/udp #ASCI-RemoteSHADOW +facilityview 1561/tcp #facilityview +facilityview 1561/udp #facilityview +pconnectmgr 1562/tcp #pconnectmgr +pconnectmgr 1562/udp #pconnectmgr +cadabra-lm 1563/tcp #Cadabra License Manager +cadabra-lm 1563/udp #Cadabra License Manager +pay-per-view 1564/tcp #Pay-Per-View +pay-per-view 1564/udp #Pay-Per-View +winddlb 1565/tcp #WinDD +winddlb 1565/udp #WinDD +corelvideo 1566/tcp #CORELVIDEO +corelvideo 1566/udp #CORELVIDEO +jlicelmd 1567/tcp #jlicelmd +jlicelmd 1567/udp #jlicelmd +tsspmap 1568/tcp #tsspmap +tsspmap 1568/udp #tsspmap +ets 1569/tcp #ets +ets 1569/udp #ets +orbixd 1570/tcp #orbixd +orbixd 1570/udp #orbixd +rdb-dbs-disp 1571/tcp #Oracle Remote Data Base +rdb-dbs-disp 1571/udp #Oracle Remote Data Base +chip-lm 1572/tcp #Chipcom License Manager +chip-lm 1572/udp #Chipcom License Manager +itscomm-ns 1573/tcp #itscomm-ns +itscomm-ns 1573/udp #itscomm-ns +mvel-lm 1574/tcp #mvel-lm +mvel-lm 1574/udp #mvel-lm +oraclenames 1575/tcp #oraclenames +oraclenames 1575/udp #oraclenames +moldflow-lm 1576/tcp #moldflow-lm +moldflow-lm 1576/udp #moldflow-lm +hypercube-lm 1577/tcp #hypercube-lm +hypercube-lm 1577/udp #hypercube-lm +jacobus-lm 1578/tcp #Jacobus License Manager +jacobus-lm 1578/udp #Jacobus License Manager +ioc-sea-lm 1579/tcp #ioc-sea-lm +ioc-sea-lm 1579/udp #ioc-sea-lm +tn-tl-r1 1580/tcp #tn-tl-r1 +tn-tl-r2 1580/udp #tn-tl-r2 +mil-2045-47001 1581/tcp #MIL-2045-47001 +mil-2045-47001 1581/udp #MIL-2045-47001 +msims 1582/tcp #MSIMS +msims 1582/udp #MSIMS +simbaexpress 1583/tcp #simbaexpress +simbaexpress 1583/udp #simbaexpress +tn-tl-fd2 1584/tcp #tn-tl-fd2 +tn-tl-fd2 1584/udp #tn-tl-fd2 +intv 1585/tcp #intv +intv 1585/udp #intv +ibm-abtact 1586/tcp #ibm-abtact +ibm-abtact 1586/udp #ibm-abtact +pra_elmd 1587/tcp #pra_elmd +pra_elmd 1587/udp #pra_elmd +triquest-lm 1588/tcp #triquest-lm +triquest-lm 1588/udp #triquest-lm +vqp 1589/tcp #VQP +vqp 1589/udp #VQP +gemini-lm 1590/tcp #gemini-lm +gemini-lm 1590/udp #gemini-lm +ncpm-pm 1591/tcp #ncpm-pm +ncpm-pm 1591/udp #ncpm-pm +commonspace 1592/tcp #commonspace +commonspace 1592/udp #commonspace +mainsoft-lm 1593/tcp #mainsoft-lm +mainsoft-lm 1593/udp #mainsoft-lm +sixtrak 1594/tcp #sixtrak +sixtrak 1594/udp #sixtrak +radio 1595/tcp #radio +radio 1595/udp #radio +radio-sm 1596/tcp #radio-sm +radio-bc 1596/udp #radio-bc +orbplus-iiop 1597/tcp #orbplus-iiop +orbplus-iiop 1597/udp #orbplus-iiop +picknfs 1598/tcp #picknfs +picknfs 1598/udp #picknfs +simbaservices 1599/tcp #simbaservices +simbaservices 1599/udp #simbaservices +aas 1601/tcp #aas +aas 1601/udp #aas +inspect 1602/tcp #inspect +inspect 1602/udp #inspect +picodbc 1603/tcp #pickodbc +picodbc 1603/udp #pickodbc +icabrowser 1604/tcp #icabrowser +icabrowser 1604/udp #icabrowser +slp 1605/tcp #Salutation Manager (Salutation Protocol) +slp 1605/udp #Salutation Manager (Salutation Protocol) +slm-api 1606/tcp #Salutation Manager (SLM-API) +slm-api 1606/udp #Salutation Manager (SLM-API) +stt 1607/tcp #stt +stt 1607/udp #stt +smart-lm 1608/tcp #Smart Corp. License Manager +smart-lm 1608/udp #Smart Corp. License Manager +isysg-lm 1609/tcp #isysg-lm +isysg-lm 1609/udp #isysg-lm +taurus-wh 1610/tcp #taurus-wh +taurus-wh 1610/udp #taurus-wh +ill 1611/tcp #Inter Library Loan +ill 1611/udp #Inter Library Loan +netbill-trans 1612/tcp #NetBill Transaction Server +netbill-trans 1612/udp #NetBill Transaction Server +netbill-keyrep 1613/tcp #NetBill Key Repository +netbill-keyrep 1613/udp #NetBill Key Repository +netbill-cred 1614/tcp #NetBill Credential Server +netbill-cred 1614/udp #NetBill Credential Server +netbill-auth 1615/tcp #NetBill Authorization Server +netbill-auth 1615/udp #NetBill Authorization Server +netbill-prod 1616/tcp #NetBill Product Server +netbill-prod 1616/udp #NetBill Product Server +nimrod-agent 1617/tcp #Nimrod Inter-Agent Communication +nimrod-agent 1617/udp #Nimrod Inter-Agent Communication +skytelnet 1618/tcp #skytelnet +skytelnet 1618/udp #skytelnet +xs-openstorage 1619/tcp #xs-openstorage +xs-openstorage 1619/udp #xs-openstorage +faxportwinport 1620/tcp #faxportwinport +faxportwinport 1620/udp #faxportwinport +softdataphone 1621/tcp #softdataphone +softdataphone 1621/udp #softdataphone +ontime 1622/tcp #ontime +ontime 1622/udp #ontime +jaleosnd 1623/tcp #jaleosnd +jaleosnd 1623/udp #jaleosnd +udp-sr-port 1624/tcp #udp-sr-port +udp-sr-port 1624/udp #udp-sr-port +svs-omagent 1625/tcp #svs-omagent +svs-omagent 1625/udp #svs-omagent +shockwave 1626/tcp #Shockwave +shockwave 1626/udp #Shockwave +t128-gateway 1627/tcp #T.128 Gateway +t128-gateway 1627/udp #T.128 Gateway +lontalk-norm 1628/tcp #LonTalk normal +lontalk-norm 1628/udp #LonTalk normal +lontalk-urgnt 1629/tcp #LonTalk urgent +lontalk-urgnt 1629/udp #LonTalk urgent +oraclenet8cman 1630/tcp #Oracle Net8 Cman +oraclenet8cman 1630/udp #Oracle Net8 Cman +visitview 1631/tcp #Visit view +visitview 1631/udp #Visit view +pammratc 1632/tcp #PAMMRATC +pammratc 1632/udp #PAMMRATC +pammrpc 1633/tcp #PAMMRPC +pammrpc 1633/udp #PAMMRPC +loaprobe 1634/tcp #Log On America Probe +loaprobe 1634/udp #Log On America Probe +edb-server1 1635/tcp #EDB Server 1 +edb-server1 1635/udp #EDB Server 1 +cncp 1636/tcp #CableNet Control Protocol +cncp 1636/udp #CableNet Control Protocol +cnap 1637/tcp #CableNet Admin Protocol +cnap 1637/udp #CableNet Admin Protocol +cnip 1638/tcp #CableNet Info Protocol +cnip 1638/udp #CableNet Info Protocol +cert-initiator 1639/tcp #cert-initiator +cert-initiator 1639/udp #cert-initiator +cert-responder 1640/tcp #cert-responder +cert-responder 1640/udp #cert-responder +invision 1641/tcp #InVision +invision 1641/udp #InVision +isis-am 1642/tcp #isis-am +isis-am 1642/udp #isis-am +isis-ambc 1643/tcp #isis-ambc +isis-ambc 1643/udp #isis-ambc +saiseh 1644/tcp #Satellite-data Acquisition System 4 +sightline 1645/tcp #SightLine +sightline 1645/udp #SightLine +sa-msg-port 1646/tcp #sa-msg-port +sa-msg-port 1646/udp #sa-msg-port +rsap 1647/tcp #rsap +rsap 1647/udp #rsap +concurrent-lm 1648/tcp #concurrent-lm +concurrent-lm 1648/udp #concurrent-lm +kermit 1649/tcp #kermit +kermit 1649/udp #kermit +nkd 1650/tcp #nkdn +nkd 1650/udp #nkd +shiva_confsrvr 1651/tcp #shiva_confsrvr +shiva_confsrvr 1651/udp #shiva_confsrvr +xnmp 1652/tcp #xnmp +xnmp 1652/udp #xnmp +alphatech-lm 1653/tcp #alphatech-lm +alphatech-lm 1653/udp #alphatech-lm +stargatealerts 1654/tcp #stargatealerts +stargatealerts 1654/udp #stargatealerts +dec-mbadmin 1655/tcp #dec-mbadmin +dec-mbadmin 1655/udp #dec-mbadmin +dec-mbadmin-h 1656/tcp #dec-mbadmin-h +dec-mbadmin-h 1656/udp #dec-mbadmin-h +fujitsu-mmpdc 1657/tcp #fujitsu-mmpdc +fujitsu-mmpdc 1657/udp #fujitsu-mmpdc +sixnetudr 1658/tcp #sixnetudr +sixnetudr 1658/udp #sixnetudr +sg-lm 1659/tcp #Silicon Grail License Manager +sg-lm 1659/udp #Silicon Grail License Manager +skip-mc-gikreq 1660/tcp #skip-mc-gikreq +skip-mc-gikreq 1660/udp #skip-mc-gikreq +netview-aix-1 1661/tcp #netview-aix-1 +netview-aix-1 1661/udp #netview-aix-1 +netview-aix-2 1662/tcp #netview-aix-2 +netview-aix-2 1662/udp #netview-aix-2 +netview-aix-3 1663/tcp #netview-aix-3 +netview-aix-3 1663/udp #netview-aix-3 +netview-aix-4 1664/tcp #netview-aix-4 +netview-aix-4 1664/udp #netview-aix-4 +netview-aix-5 1665/tcp #netview-aix-5 +netview-aix-5 1665/udp #netview-aix-5 +netview-aix-6 1666/tcp #netview-aix-6 +netview-aix-6 1666/udp #netview-aix-6 +netview-aix-7 1667/tcp #netview-aix-7 +netview-aix-7 1667/udp #netview-aix-7 +netview-aix-8 1668/tcp #netview-aix-8 +netview-aix-8 1668/udp #netview-aix-8 +netview-aix-9 1669/tcp #netview-aix-9 +netview-aix-9 1669/udp #netview-aix-9 +netview-aix-10 1670/tcp #netview-aix-10 +netview-aix-10 1670/udp #netview-aix-10 +netview-aix-11 1671/tcp #netview-aix-11 +netview-aix-11 1671/udp #netview-aix-11 +netview-aix-12 1672/tcp #netview-aix-12 +netview-aix-12 1672/udp #netview-aix-12 +proshare-mc-1 1673/tcp #Intel Proshare Multicast +proshare-mc-1 1673/udp #Intel Proshare Multicast +proshare-mc-2 1674/tcp #Intel Proshare Multicast +proshare-mc-2 1674/udp #Intel Proshare Multicast +pdp 1675/tcp #Pacific Data Products +pdp 1675/udp #Pacific Data Products +netcomm1 1676/tcp #netcomm1 +netcomm2 1676/udp #netcomm2 +groupwise 1677/tcp #groupwise +groupwise 1677/udp #groupwise +prolink 1678/tcp #prolink +prolink 1678/udp #prolink +darcorp-lm 1679/tcp #darcorp-lm +darcorp-lm 1679/udp #darcorp-lm +microcom-sbp 1680/tcp #microcom-sbp +microcom-sbp 1680/udp #microcom-sbp +sd-elmd 1681/tcp #sd-elmd +sd-elmd 1681/udp #sd-elmd +lanyon-lantern 1682/tcp #lanyon-lantern +lanyon-lantern 1682/udp #lanyon-lantern +ncpm-hip 1683/tcp #ncpm-hip +ncpm-hip 1683/udp #ncpm-hip +snaresecure 1684/tcp #SnareSecure +snaresecure 1684/udp #SnareSecure +n2nremote 1685/tcp #n2nremote +n2nremote 1685/udp #n2nremote +cvmon 1686/tcp #cvmon +cvmon 1686/udp #cvmon +nsjtp-ctrl 1687/tcp #nsjtp-ctrl +nsjtp-ctrl 1687/udp #nsjtp-ctrl +nsjtp-data 1688/tcp #nsjtp-data +nsjtp-data 1688/udp #nsjtp-data +firefox 1689/tcp #firefox +firefox 1689/udp #firefox +ng-umds 1690/tcp #ng-umds +ng-umds 1690/udp #ng-umds +empire-empuma 1691/tcp #empire-empuma +empire-empuma 1691/udp #empire-empuma +sstsys-lm 1692/tcp #sstsys-lm +sstsys-lm 1692/udp #sstsys-lm +rrirtr 1693/tcp #rrirtr +rrirtr 1693/udp #rrirtr +rrimwm 1694/tcp #rrimwm +rrimwm 1694/udp #rrimwm +rrilwm 1695/tcp #rrilwm +rrilwm 1695/udp #rrilwm +rrifmm 1696/tcp #rrifmm +rrifmm 1696/udp #rrifmm +rrisat 1697/tcp #rrisat +rrisat 1697/udp #rrisat +rsvp-encap-1 1698/tcp #RSVP-ENCAPSULATION-1 +rsvp-encap-1 1698/udp #RSVP-ENCAPSULATION-1 +rsvp-encap-2 1699/tcp #RSVP-ENCAPSULATION-2 +rsvp-encap-2 1699/udp #RSVP-ENCAPSULATION-2 +mps-raft 1700/tcp #mps-raft +mps-raft 1700/udp #mps-raft +l2f 1701/tcp #l2f +l2f 1701/udp #l2f +l2tp 1701/tcp #l2tp +l2tp 1701/udp #l2tp +deskshare 1702/tcp #deskshare +deskshare 1702/udp #deskshare +hb-engine 1703/tcp #hb-engine +hb-engine 1703/udp #hb-engine +bcs-broker 1704/tcp #bcs-broker +bcs-broker 1704/udp #bcs-broker +slingshot 1705/tcp #slingshot +slingshot 1705/udp #slingshot +jetform 1706/tcp #jetform +jetform 1706/udp #jetform +vdmplay 1707/tcp #vdmplay +vdmplay 1707/udp #vdmplay +gat-lmd 1708/tcp #gat-lmd +gat-lmd 1708/udp #gat-lmd +centra 1709/tcp #centra +centra 1709/udp #centra +impera 1710/tcp #impera +impera 1710/udp #impera +pptconference 1711/tcp #pptconference +pptconference 1711/udp #pptconference +registrar 1712/tcp #resource monitoring service +registrar 1712/udp #resource monitoring service +conferencetalk 1713/tcp #ConferenceTalk +conferencetalk 1713/udp #ConferenceTalk +sesi-lm 1714/tcp #sesi-lm +sesi-lm 1714/udp #sesi-lm +houdini-lm 1715/tcp #houdini-lm +houdini-lm 1715/udp #houdini-lm +xmsg 1716/tcp #xmsg +xmsg 1716/udp #xmsg +fj-hdnet 1717/tcp #fj-hdnet +fj-hdnet 1717/udp #fj-hdnet +h323gatedisc 1718/tcp #h323gatedisc +h323gatedisc 1718/udp #h323gatedisc +h323gatestat 1719/tcp #h323gatestat +h323gatestat 1719/udp #h323gatestat +h323hostcall 1720/tcp #h323hostcall +h323hostcall 1720/udp #h323hostcall +caicci 1721/tcp #caicci +caicci 1721/udp #caicci +hks-lm 1722/tcp #HKS License Manager +hks-lm 1722/udp #HKS License Manager +pptp 1723/tcp #pptp +pptp 1723/udp #pptp +csbphonemaster 1724/tcp #csbphonemaster +csbphonemaster 1724/udp #csbphonemaster +iden-ralp 1725/tcp #iden-ralp +iden-ralp 1725/udp #iden-ralp +iberiagames 1726/tcp #IBERIAGAMES +iberiagames 1726/udp #IBERIAGAMES +winddx 1727/tcp #winddx +winddx 1727/udp #winddx +telindus 1728/tcp #TELINDUS +telindus 1728/udp #TELINDUS +citynl 1729/tcp #CityNL License Management +citynl 1729/udp #CityNL License Management +roketz 1730/tcp #roketz +roketz 1730/udp #roketz +msiccp 1731/tcp #MSICCP +msiccp 1731/udp #MSICCP +proxim 1732/tcp #proxim +proxim 1732/udp #proxim +siipat 1733/tcp #SIMS - SIIPAT Protocol for Alarm Transmission +siipat 1733/udp #SIMS - SIIPAT Protocol for Alarm Transmission +cambertx-lm 1734/tcp #Camber Corporation License Management +cambertx-lm 1734/udp #Camber Corporation License Management +privatechat 1735/tcp #PrivateChat +privatechat 1735/udp #PrivateChat +street-stream 1736/tcp #street-stream +street-stream 1736/udp #street-stream +ultimad 1737/tcp #ultimad +ultimad 1737/udp #ultimad +gamegen1 1738/tcp #GameGen1 +gamegen1 1738/udp #GameGen1 +webaccess 1739/tcp #webaccess +webaccess 1739/udp #webaccess +encore 1740/tcp #encore +encore 1740/udp #encore +cisco-net-mgmt 1741/tcp #cisco-net-mgmt +cisco-net-mgmt 1741/udp #cisco-net-mgmt +3Com-nsd 1742/tcp #3Com-nsd +3Com-nsd 1742/udp #3Com-nsd +cinegrfx-lm 1743/tcp #Cinema Graphics License Manager +cinegrfx-lm 1743/udp #Cinema Graphics License Manager +ncpm-ft 1744/tcp #ncpm-ft +ncpm-ft 1744/udp #ncpm-ft +remote-winsock 1745/tcp #remote-winsock +remote-winsock 1745/udp #remote-winsock +ftrapid-1 1746/tcp #ftrapid-1 +ftrapid-1 1746/udp #ftrapid-1 +ftrapid-2 1747/tcp #ftrapid-2 +ftrapid-2 1747/udp #ftrapid-2 +oracle-em1 1748/tcp #oracle-em1 +oracle-em1 1748/udp #oracle-em1 +aspen-services 1749/tcp #aspen-services +aspen-services 1749/udp #aspen-services +sslp 1750/tcp #Simple Socket Library's PortMaster +sslp 1750/udp #Simple Socket Library's PortMaster +swiftnet 1751/tcp #SwiftNet +swiftnet 1751/udp #SwiftNet +lofr-lm 1752/tcp #Leap of Faith Research License Manager +lofr-lm 1752/udp #Leap of Faith Research License Manager +oracle-em2 1754/tcp #oracle-em2 +oracle-em2 1754/udp #oracle-em2 +ms-streaming 1755/tcp #ms-streaming +ms-streaming 1755/udp #ms-streaming +capfast-lmd 1756/tcp #capfast-lmd +capfast-lmd 1756/udp #capfast-lmd +cnhrp 1757/tcp #cnhrp +cnhrp 1757/udp #cnhrp +tftp-mcast 1758/tcp #tftp-mcast +tftp-mcast 1758/udp #tftp-mcast +spss-lm 1759/tcp #SPSS License Manager +spss-lm 1759/udp #SPSS License Manager +www-ldap-gw 1760/tcp #www-ldap-gw +www-ldap-gw 1760/udp #www-ldap-gw +cft-0 1761/tcp #cft-0 +cft-0 1761/udp #cft-0 +cft-1 1762/tcp #cft-1 +cft-1 1762/udp #cft-1 +cft-2 1763/tcp #cft-2 +cft-2 1763/udp #cft-2 +cft-3 1764/tcp #cft-3 +cft-3 1764/udp #cft-3 +cft-4 1765/tcp #cft-4 +cft-4 1765/udp #cft-4 +cft-5 1766/tcp #cft-5 +cft-5 1766/udp #cft-5 +cft-6 1767/tcp #cft-6 +cft-6 1767/udp #cft-6 +cft-7 1768/tcp #cft-7 +cft-7 1768/udp #cft-7 +bmc-net-adm 1769/tcp #bmc-net-adm +bmc-net-adm 1769/udp #bmc-net-adm +bmc-net-svc 1770/tcp #bmc-net-svc +bmc-net-svc 1770/udp #bmc-net-svc +vaultbase 1771/tcp #vaultbase +vaultbase 1771/udp #vaultbase +essweb-gw 1772/tcp #EssWeb Gateway +essweb-gw 1772/udp #EssWeb Gateway +kmscontrol 1773/tcp #KMSControl +kmscontrol 1773/udp #KMSControl +global-dtserv 1774/tcp #global-dtserv +global-dtserv 1774/udp #global-dtserv +femis 1776/tcp #Federal Emergency Management Information System +femis 1776/udp #Federal Emergency Management Information System +powerguardian 1777/tcp #powerguardian +powerguardian 1777/udp #powerguardian +prodigy-intrnet 1778/tcp #prodigy-internet +prodigy-intrnet 1778/udp #prodigy-internet +pharmasoft 1779/tcp #pharmasoft +pharmasoft 1779/udp #pharmasoft +dpkeyserv 1780/tcp #dpkeyserv +dpkeyserv 1780/udp #dpkeyserv +answersoft-lm 1781/tcp #answersoft-lm +answersoft-lm 1781/udp #answersoft-lm +hp-hcip 1782/tcp #hp-hcip +hp-hcip 1782/udp #hp-hcip +finle-lm 1784/tcp #Finle License Manager +finle-lm 1784/udp #Finle License Manager +windlm 1785/tcp #Wind River Systems License Manager +windlm 1785/udp #Wind River Systems License Manager +funk-logger 1786/tcp #funk-logger +funk-logger 1786/udp #funk-logger +funk-license 1787/tcp #funk-license +funk-license 1787/udp #funk-license +psmond 1788/tcp #psmond +psmond 1788/udp #psmond +hello 1789/tcp #hello +hello 1789/udp #hello +nmsp 1790/tcp #Narrative Media Streaming Protocol +nmsp 1790/udp #Narrative Media Streaming Protocol +ea1 1791/tcp #EA1 +ea1 1791/udp #EA1 +ibm-dt-2 1792/tcp #ibm-dt-2 +ibm-dt-2 1792/udp #ibm-dt-2 +rsc-robot 1793/tcp #rsc-robot +rsc-robot 1793/udp #rsc-robot +cera-bcm 1794/tcp #cera-bcm +cera-bcm 1794/udp #cera-bcm +dpi-proxy 1795/tcp #dpi-proxy +dpi-proxy 1795/udp #dpi-proxy +vocaltec-admin 1796/tcp #Vocaltec Server Administration +vocaltec-admin 1796/udp #Vocaltec Server Administration +uma 1797/tcp #UMA +uma 1797/udp #UMA +etp 1798/tcp #Event Transfer Protocol +etp 1798/udp #Event Transfer Protocol +netrisk 1799/tcp #NETRISK +netrisk 1799/udp #NETRISK +ansys-lm 1800/tcp #ANSYS-License manager +ansys-lm 1800/udp #ANSYS-License manager +msmq 1801/tcp #Microsoft Message Que +msmq 1801/udp #Microsoft Message Que +concomp1 1802/tcp #ConComp1 +concomp1 1802/udp #ConComp1 +hp-hcip-gwy 1803/tcp #HP-HCIP-GWY +hp-hcip-gwy 1803/udp #HP-HCIP-GWY +enl 1804/tcp #ENL +enl 1804/udp #ENL +enl-name 1805/tcp #ENL-Name +enl-name 1805/udp #ENL-Name +musiconline 1806/tcp #Musiconline +musiconline 1806/udp #Musiconline +fhsp 1807/tcp #Fujitsu Hot Standby Protocol +fhsp 1807/udp #Fujitsu Hot Standby Protocol +oracle-vp2 1808/tcp #Oracle-VP2 +oracle-vp2 1808/udp #Oracle-VP2 +oracle-vp1 1809/tcp #Oracle-VP1 +oracle-vp1 1809/udp #Oracle-VP1 +jerand-lm 1810/tcp #Jerand License Manager +jerand-lm 1810/udp #Jerand License Manager +scientia-sdb 1811/tcp #Scientia-SDB +scientia-sdb 1811/udp #Scientia-SDB +radius 1812/tcp #RADIUS +radius 1812/udp #RADIUS +radius-acct 1813/tcp #RADIUS Accounting +radius-acct 1813/udp #RADIUS Accounting +tdp-suite 1814/tcp #TDP Suite +tdp-suite 1814/udp #TDP Suite +mmpft 1815/tcp #MMPFT +mmpft 1815/udp #MMPFT +harp 1816/tcp #HARP +harp 1816/udp #HARP +rkb-oscs 1817/tcp #RKB-OSCS +rkb-oscs 1817/udp #RKB-OSCS +etftp 1818/tcp #Enhanced Trivial File Transfer Protocol +etftp 1818/udp #Enhanced Trivial File Transfer Protocol +plato-lm 1819/tcp #Plato License Manager +plato-lm 1819/udp #Plato License Manager +mcagent 1820/tcp #mcagent +mcagent 1820/udp #mcagent +donnyworld 1821/tcp #donnyworld +donnyworld 1821/udp #donnyworld +es-elmd 1822/tcp #es-elmd +es-elmd 1822/udp #es-elmd +unisys-lm 1823/tcp #Unisys Natural Language License Manager +unisys-lm 1823/udp #Unisys Natural Language License Manager +metrics-pas 1824/tcp #metrics-pas +metrics-pas 1824/udp #metrics-pas +direcpc-video 1825/tcp #DirecPC Video +direcpc-video 1825/udp #DirecPC Video +ardt 1826/tcp #ARDT +ardt 1826/udp #ARDT +asi 1827/tcp #ASI +asi 1827/udp #ASI +itm-mcell-u 1828/tcp #itm-mcell-u +itm-mcell-u 1828/udp #itm-mcell-u +optika-emedia 1829/tcp #Optika eMedia +optika-emedia 1829/udp #Optika eMedia +net8-cman 1830/tcp #Oracle Net8 CMan Admin +net8-cman 1830/udp #Oracle Net8 CMan Admin +myrtle 1831/tcp #Myrtle +myrtle 1831/udp #Myrtle +tht-treasure 1832/tcp #ThoughtTreasure +tht-treasure 1832/udp #ThoughtTreasure +udpradio 1833/tcp #udpradio +udpradio 1833/udp #udpradio +ardusuni 1834/tcp #ARDUS Unicast +ardusuni 1834/udp #ARDUS Unicast +ardusmul 1835/tcp #ARDUS Multicast +ardusmul 1835/udp #ARDUS Multicast +ste-smsc 1836/tcp #ste-smsc +ste-smsc 1836/udp #ste-smsc +csoft1 1837/tcp #csoft1 +csoft1 1837/udp #csoft1 +talnet 1838/tcp #TALNET +talnet 1838/udp #TALNET +netopia-vo1 1839/tcp #netopia-vo1 +netopia-vo1 1839/udp #netopia-vo1 +netopia-vo2 1840/tcp #netopia-vo2 +netopia-vo2 1840/udp #netopia-vo2 +netopia-vo3 1841/tcp #netopia-vo3 +netopia-vo3 1841/udp #netopia-vo3 +netopia-vo4 1842/tcp #netopia-vo4 +netopia-vo4 1842/udp #netopia-vo4 +netopia-vo5 1843/tcp #netopia-vo5 +netopia-vo5 1843/udp #netopia-vo5 +direcpc-dll 1844/tcp #DirecPC-DLL +direcpc-dll 1844/udp #DirecPC-DLL +altalink 1845/tcp #altalink +altalink 1845/udp #altalink +tunstall-pnc 1846/tcp #Tunstall PNC +tunstall-pnc 1846/udp #Tunstall PNC +slp-notify 1847/tcp #SLP Notification +slp-notify 1847/udp #SLP Notification +fjdocdist 1848/tcp #fjdocdist +fjdocdist 1848/udp #fjdocdist +alpha-sms 1849/tcp #ALPHA-SMS +alpha-sms 1849/udp #ALPHA-SMS +gsi 1850/tcp #GSI +gsi 1850/udp #GSI +ctcd 1851/tcp #ctcd +ctcd 1851/udp #ctcd +virtual-time 1852/tcp #Virtual Time +virtual-time 1852/udp #Virtual Time +vids-avtp 1853/tcp #VIDS-AVTP +vids-avtp 1853/udp #VIDS-AVTP +buddy-draw 1854/tcp #Buddy Draw +buddy-draw 1854/udp #Buddy Draw +fiorano-rtrsvc 1855/tcp #Fiorano RtrSvc +fiorano-rtrsvc 1855/udp #Fiorano RtrSvc +fiorano-msgsvc 1856/tcp #Fiorano MsgSvc +fiorano-msgsvc 1856/udp #Fiorano MsgSvc +datacaptor 1857/tcp #DataCaptor +datacaptor 1857/udp #DataCaptor +privateark 1858/tcp #PrivateArk +privateark 1858/udp #PrivateArk +gammafetchsvr 1859/tcp #Gamma Fetcher Server +gammafetchsvr 1859/udp #Gamma Fetcher Server +sunscalar-svc 1860/tcp #SunSCALAR Services +sunscalar-svc 1860/udp #SunSCALAR Services +lecroy-vicp 1861/tcp #LeCroy VICP +lecroy-vicp 1861/udp #LeCroy VICP +techra-server 1862/tcp #techra-server +techra-server 1862/udp #techra-server +msnp 1863/tcp #MSNP +msnp 1863/udp #MSNP +paradym-31port 1864/tcp #Paradym 31 Port +paradym-31port 1864/udp #Paradym 31 Port +entp 1865/tcp #ENTP +entp 1865/udp #ENTP +swrmi 1866/tcp #swrmi +swrmi 1866/udp #swrmi +udrive 1867/tcp #UDRIVE +udrive 1867/udp #UDRIVE +viziblebrowser 1868/tcp #VizibleBrowser +viziblebrowser 1868/udp #VizibleBrowser +yestrader 1869/tcp #YesTrader +yestrader 1869/udp #YesTrader +sunscalar-dns 1870/tcp #SunSCALAR DNS Service +sunscalar-dns 1870/udp #SunSCALAR DNS Service +canocentral0 1871/tcp #Cano Central 0 +canocentral0 1871/udp #Cano Central 0 +canocentral1 1872/tcp #Cano Central 1 +canocentral1 1872/udp #Cano Central 1 +fjmpjps 1873/tcp #Fjmpjps +fjmpjps 1873/udp #Fjmpjps +fjswapsnp 1874/tcp #Fjswapsnp +fjswapsnp 1874/udp #Fjswapsnp +westell-stats 1875/tcp #westell stats +westell-stats 1875/udp #westell stats +ewcappsrv 1876/tcp #ewcappsrv +ewcappsrv 1876/udp #ewcappsrv +hp-webqosdb 1877/tcp #hp-webqosdb +hp-webqosdb 1877/udp #hp-webqosdb +drmsmc 1878/tcp #drmsmc +drmsmc 1878/udp #drmsmc +nettgain-nms 1879/tcp #NettGain NMS +nettgain-nms 1879/udp #NettGain NMS +vsat-control 1880/tcp #Gilat VSAT Control +vsat-control 1880/udp #Gilat VSAT Control +ibm-mqseries2 1881/tcp #IBM WebSphere MQ Everyplace +ibm-mqseries2 1881/udp #IBM WebSphere MQ Everyplace +ecsqdmn 1882/tcp #ecsqdmn +ecsqdmn 1882/udp #ecsqdmn +ibm-mqisdp 1883/tcp #IBM MQSeries SCADA +ibm-mqisdp 1883/udp #IBM MQSeries SCADA +idmaps 1884/tcp #Internet Distance Map Svc +idmaps 1884/udp #Internet Distance Map Svc +vrtstrapserver 1885/tcp #Veritas Trap Server +vrtstrapserver 1885/udp #Veritas Trap Server +leoip 1886/tcp #Leonardo over IP +leoip 1886/udp #Leonardo over IP +filex-lport 1887/tcp #FileX Listening Port +filex-lport 1887/udp #FileX Listening Port +ncconfig 1888/tcp #NC Config Port +ncconfig 1888/udp #NC Config Port +unify-adapter 1889/tcp #Unify Web Adapter Service +unify-adapter 1889/udp #Unify Web Adapter Service +wilkenlistener 1890/tcp #wilkenListener +wilkenlistener 1890/udp #wilkenListener +childkey-notif 1891/tcp #ChildKey Notification +childkey-notif 1891/udp #ChildKey Notification +childkey-ctrl 1892/tcp #ChildKey Control +childkey-ctrl 1892/udp #ChildKey Control +elad 1893/tcp #ELAD Protocol +elad 1893/udp #ELAD Protocol +o2server-port 1894/tcp #O2Server Port +o2server-port 1894/udp #O2Server Port +b-novative-ls 1896/tcp #b-novative license server +b-novative-ls 1896/udp #b-novative license server +metaagent 1897/tcp #MetaAgent +metaagent 1897/udp #MetaAgent +cymtec-port 1898/tcp #Cymtec secure management +cymtec-port 1898/udp #Cymtec secure management +mc2studios 1899/tcp #MC2Studios +mc2studios 1899/udp #MC2Studios +ssdp 1900/tcp #SSDP +ssdp 1900/udp #SSDP +fjicl-tep-a 1901/tcp #Fujitsu ICL Terminal Emulator Program A +fjicl-tep-a 1901/udp #Fujitsu ICL Terminal Emulator Program A +fjicl-tep-b 1902/tcp #Fujitsu ICL Terminal Emulator Program B +fjicl-tep-b 1902/udp #Fujitsu ICL Terminal Emulator Program B +linkname 1903/tcp #Local Link Name Resolution +linkname 1903/udp #Local Link Name Resolution +fjicl-tep-c 1904/tcp #Fujitsu ICL Terminal Emulator Program C +fjicl-tep-c 1904/udp #Fujitsu ICL Terminal Emulator Program C +sugp 1905/tcp #Secure UP.Link Gateway Protocol +sugp 1905/udp #Secure UP.Link Gateway Protocol +tpmd 1906/tcp #TPortMapperReq +tpmd 1906/udp #TPortMapperReq +intrastar 1907/tcp #IntraSTAR +intrastar 1907/udp #IntraSTAR +dawn 1908/tcp #Dawn +dawn 1908/udp #Dawn +global-wlink 1909/tcp #Global World Link +global-wlink 1909/udp #Global World Link +ultrabac 1910/tcp #UltraBac Software communications port +ultrabac 1910/udp #UltraBac Software communications port +mtp 1911/tcp #Starlight Networks Multimedia Transport Protocol +mtp 1911/udp #Starlight Networks Multimedia Transport Protocol +rhp-iibp 1912/tcp #rhp-iibp +rhp-iibp 1912/udp #rhp-iibp +armadp 1913/tcp #armadp +armadp 1913/udp #armadp +elm-momentum 1914/tcp #Elm-Momentum +elm-momentum 1914/udp #Elm-Momentum +facelink 1915/tcp #FACELINK +facelink 1915/udp #FACELINK +persona 1916/tcp #Persoft Persona +persona 1916/udp #Persoft Persona +noagent 1917/tcp #nOAgent +noagent 1917/udp #nOAgent +can-nds 1918/tcp #Candle Directory Service - NDS +can-nds 1918/udp #Candle Directory Service - NDS +can-dch 1919/tcp #Candle Directory Service - DCH +can-dch 1919/udp #Candle Directory Service - DCH +can-ferret 1920/tcp #Candle Directory Service - FERRET +can-ferret 1920/udp #Candle Directory Service - FERRET +noadmin 1921/tcp #NoAdmin +noadmin 1921/udp #NoAdmin +tapestry 1922/tcp #Tapestry +tapestry 1922/udp #Tapestry +spice 1923/tcp #SPICE +spice 1923/udp #SPICE +xiip 1924/tcp #XIIP +xiip 1924/udp #XIIP +discovery-port 1925/tcp #Surrogate Discovery Port +discovery-port 1925/udp #Surrogate Discovery Port +egs 1926/tcp #Evolution Game Server +egs 1926/udp #Evolution Game Server +videte-cipc 1927/tcp #Videte CIPC Port +videte-cipc 1927/udp #Videte CIPC Port +emsd-port 1928/tcp #Expnd Maui Srvr Dscovr +emsd-port 1928/udp #Expnd Maui Srvr Dscovr +bandwiz-system 1929/tcp #Bandwiz System - Server +bandwiz-system 1929/udp #Bandwiz System - Server +driveappserver 1930/tcp #Drive AppServer +driveappserver 1930/udp #Drive AppServer +amdsched 1931/tcp #AMD SCHED +amdsched 1931/udp #AMD SCHED +ctt-broker 1932/tcp #CTT Broker +ctt-broker 1932/udp #CTT Broker +xmapi 1933/tcp #IBM LM MT Agent +xmapi 1933/udp #IBM LM MT Agent +xaapi 1934/tcp #IBM LM Appl Agent +xaapi 1934/udp #IBM LM Appl Agent +macromedia-fcs 1935/tcp #Macromedia Flash Communications Server MX +macromedia-fcs 1935/udp #Macromedia Flash Communications server MX +jetcmeserver 1936/tcp #JetCmeServer Server Port +jetcmeserver 1936/udp #JetCmeServer Server Port +jwserver 1937/tcp #JetVWay Server Port +jwserver 1937/udp #JetVWay Server Port +jwclient 1938/tcp #JetVWay Client Port +jwclient 1938/udp #JetVWay Client Port +jvserver 1939/tcp #JetVision Server Port +jvserver 1939/udp #JetVision Server Port +jvclient 1940/tcp #JetVision Client Port +jvclient 1940/udp #JetVision Client Port +dic-aida 1941/tcp #DIC-Aida +dic-aida 1941/udp #DIC-Aida +res 1942/tcp #Real Enterprise Service +res 1942/udp #Real Enterprise Service +beeyond-media 1943/tcp #Beeyond Media +beeyond-media 1943/udp #Beeyond Media +close-combat 1944/tcp #close-combat +close-combat 1944/udp #close-combat +dialogic-elmd 1945/tcp #dialogic-elmd +dialogic-elmd 1945/udp #dialogic-elmd +tekpls 1946/tcp #tekpls +tekpls 1946/udp #tekpls +hlserver 1947/tcp #hlserver +hlserver 1947/udp #hlserver +eye2eye 1948/tcp #eye2eye +eye2eye 1948/udp #eye2eye +ismaeasdaqlive 1949/tcp #ISMA Easdaq Live +ismaeasdaqlive 1949/udp #ISMA Easdaq Live +ismaeasdaqtest 1950/tcp #ISMA Easdaq Test +ismaeasdaqtest 1950/udp #ISMA Easdaq Test +bcs-lmserver 1951/tcp #bcs-lmserver +bcs-lmserver 1951/udp #bcs-lmserver +mpnjsc 1952/tcp #mpnjsc +mpnjsc 1952/udp #mpnjsc +rapidbase 1953/tcp #Rapid Base +rapidbase 1953/udp #Rapid Base +abr-basic 1954/tcp #ABR-Basic Data +abr-basic 1954/udp #ABR-Basic Data +abr-secure 1955/tcp #ABR-Secure Data +abr-secure 1955/udp #ABR-Secure Data +vrtl-vmf-ds 1956/tcp #Vertel VMF DS +vrtl-vmf-ds 1956/udp #Vertel VMF DS +unix-status 1957/tcp #unix-status +unix-status 1957/udp #unix-status +dxadmind 1958/tcp #CA Administration Daemon +dxadmind 1958/udp #CA Administration Daemon +simp-all 1959/tcp #SIMP Channel +simp-all 1959/udp #SIMP Channel +nasmanager 1960/tcp #Merit DAC NASmanager +nasmanager 1960/udp #Merit DAC NASmanager +bts-appserver 1961/tcp #BTS APPSERVER +bts-appserver 1961/udp #BTS APPSERVER +biap-mp 1962/tcp #BIAP-MP +biap-mp 1962/udp #BIAP-MP +webmachine 1963/tcp #WebMachine +webmachine 1963/udp #WebMachine +solid-e-engine 1964/tcp #SOLID E ENGINE +solid-e-engine 1964/udp #SOLID E ENGINE +tivoli-npm 1965/tcp #Tivoli NPM +tivoli-npm 1965/udp #Tivoli NPM +slush 1966/tcp #Slush +slush 1966/udp #Slush +sns-quote 1967/tcp #SNS Quote +sns-quote 1967/udp #SNS Quote +lipsinc 1968/tcp #LIPSinc +lipsinc 1968/udp #LIPSinc +lipsinc1 1969/tcp #LIPSinc 1 +lipsinc1 1969/udp #LIPSinc 1 +netop-rc 1970/tcp #NetOp Remote Control +netop-rc 1970/udp #NetOp Remote Control +netop-school 1971/tcp #NetOp School +netop-school 1971/udp #NetOp School +intersys-cache 1972/tcp #Cache +intersys-cache 1972/udp #Cache +dlsrap 1973/tcp #Data Link Switching Remote Access Protocol +dlsrap 1973/udp #Data Link Switching Remote Access Protocol +drp 1974/tcp #DRP +drp 1974/udp #DRP +tcoflashagent 1975/tcp #TCO Flash Agent +tcoflashagent 1975/udp #TCO Flash Agent +tcoregagent 1976/tcp #TCO Reg Agent +tcoregagent 1976/udp #TCO Reg Agent +tcoaddressbook 1977/tcp #TCO Address Book +tcoaddressbook 1977/udp #TCO Address Book +unisql 1978/tcp #UniSQL +unisql 1978/udp #UniSQL +unisql-java 1979/tcp #UniSQL Java +unisql-java 1979/udp #UniSQL Java +pearldoc-xact 1980/tcp #PearlDoc XACT +pearldoc-xact 1980/udp #PearlDoc XACT +p2pq 1981/tcp #p2pQ +p2pq 1981/udp #p2pQ +estamp 1982/tcp #Evidentiary Timestamp +estamp 1982/udp #Evidentiary Timestamp +lhtp 1983/tcp #Loophole Test Protocol +lhtp 1983/udp #Loophole Test Protocol +bb 1984/tcp #BB +bb 1984/udp #BB +hsrp 1985/tcp #Hot Standby Router Protocol +hsrp 1985/udp #Hot Standby Router Protocol +licensedaemon 1986/tcp #cisco license management +licensedaemon 1986/udp #cisco license management +tr-rsrb-p1 1987/tcp #cisco RSRB Priority 1 port +tr-rsrb-p1 1987/udp #cisco RSRB Priority 1 port +tr-rsrb-p2 1988/tcp #cisco RSRB Priority 2 port +tr-rsrb-p2 1988/udp #cisco RSRB Priority 2 port +tr-rsrb-p3 1989/tcp #cisco RSRB Priority 3 port +tr-rsrb-p3 1989/udp #cisco RSRB Priority 3 port +mshnet 1989/tcp #MHSnet system +mshnet 1989/udp #MHSnet system +stun-p1 1990/tcp #cisco STUN Priority 1 port +stun-p1 1990/udp #cisco STUN Priority 1 port +stun-p2 1991/tcp #cisco STUN Priority 2 port +stun-p2 1991/udp #cisco STUN Priority 2 port +stun-p3 1992/tcp #cisco STUN Priority 3 port +stun-p3 1992/udp #cisco STUN Priority 3 port +ipsendmsg 1992/tcp #IPsendmsg +ipsendmsg 1992/udp #IPsendmsg +snmp-tcp-port 1993/tcp #cisco SNMP TCP port +snmp-tcp-port 1993/udp #cisco SNMP TCP port +stun-port 1994/tcp #cisco serial tunnel port +stun-port 1994/udp #cisco serial tunnel port +perf-port 1995/tcp #cisco perf port +perf-port 1995/udp #cisco perf port +tr-rsrb-port 1996/tcp #cisco Remote SRB port +tr-rsrb-port 1996/udp #cisco Remote SRB port +gdp-port 1997/tcp #cisco Gateway Discovery Protocol +gdp-port 1997/udp #cisco Gateway Discovery Protocol +x25-svc-port 1998/tcp #cisco X.25 service (XOT) +x25-svc-port 1998/udp #cisco X.25 service (XOT) +tcp-id-port 1999/tcp #cisco identification port +tcp-id-port 1999/udp #cisco identification port +cisco-sccp 2000/tcp #Cisco SCCP +cisco-sccp 2000/udp #Cisco SCCp +wizard 2001/udp #curry +emce 2004/udp #CCWS mm conf +raid-cd 2006/udp #raid +raid-cc 2011/tcp #raid +p2plus 2037/tcp #P2plus Application Server +p2plus 2037/udp #P2plus Application Server +isis 2042/tcp #isis +isis 2042/udp #isis +isis-bcast 2043/tcp #isis-bcast +isis-bcast 2043/udp #isis-bcast +nfs 2049/tcp #Network File System - Sun Microsystems +nfs 2049/udp #Network File System - Sun Microsystems +av-emb-config 2050/tcp #Avaya EMB Config Port +av-emb-config 2050/udp #Avaya EMB Config Port +epnsdp 2051/tcp #EPNSDP +epnsdp 2051/udp #EPNSDP +clearvisn 2052/tcp #clearVisn Services Port +clearvisn 2052/udp #clearVisn Services Port +lot105-ds-upd 2053/tcp #Lot105 DSuper Updates +lot105-ds-upd 2053/udp #Lot105 DSuper Updates +weblogin 2054/tcp #Weblogin Port +weblogin 2054/udp #Weblogin Port +iop 2055/tcp #Iliad-Odyssey Protocol +iop 2055/udp #Iliad-Odyssey Protocol +omnisky 2056/tcp #OmniSky Port +omnisky 2056/udp #OmniSky Port +rich-cp 2057/tcp #Rich Content Protocol +rich-cp 2057/udp #Rich Content Protocol +newwavesearch 2058/tcp #NewWaveSearchables RMI +newwavesearch 2058/udp #NewWaveSearchables RMI +bmc-messaging 2059/tcp #BMC Messaging Service +bmc-messaging 2059/udp #BMC Messaging Service +teleniumdaemon 2060/tcp #Telenium Daemon IF +teleniumdaemon 2060/udp #Telenium Daemon IF +netmount 2061/tcp #NetMount +netmount 2061/udp #NetMount +icg-swp 2062/tcp #ICG SWP Port +icg-swp 2062/udp #ICG SWP Port +icg-bridge 2063/tcp #ICG Bridge Port +icg-bridge 2063/udp #ICG Bridge Port +icg-iprelay 2064/tcp #ICG IP Relay Port +icg-iprelay 2064/udp #ICG IP Relay Port +dlsrpn 2065/tcp #Data Link Switch Read Port Number +dlsrpn 2065/udp #Data Link Switch Read Port Number +dlswpn 2067/tcp #Data Link Switch Write Port Number +dlswpn 2067/udp #Data Link Switch Write Port Number +avauthsrvprtcl 2068/tcp #Avocent AuthSrv Protocol +avauthsrvprtcl 2068/udp #Avocent AuthSrv Protocol +event-port 2069/tcp #HTTP Event Port +event-port 2069/udp #HTTP Event Port +ah-esp-encap 2070/tcp #AH and ESP Encapsulated in UDP packet +ah-esp-encap 2070/udp #AH and ESP Encapsulated in UDP packet +acp-port 2071/tcp #Axon Control Protocol +acp-port 2071/udp #Axon Control Protocol +msync 2072/tcp #GlobeCast mSync +msync 2072/udp #GlobeCast mSync +gxs-data-port 2073/tcp #DataReel Database Socket +gxs-data-port 2073/udp #DataReel Database Socket +vrtl-vmf-sa 2074/tcp #Vertel VMF SA +vrtl-vmf-sa 2074/udp #Vertel VMF SA +newlixengine 2075/tcp #Newlix ServerWare Engine +newlixengine 2075/udp #Newlix ServerWare Engine +newlixconfig 2076/tcp #Newlix JSPConfig +newlixconfig 2076/udp #Newlix JSPConfig +trellisagt 2077/tcp #TrelliSoft Agent +trellisagt 2077/udp #TrelliSoft Agent +trellissvr 2078/tcp #TrelliSoft Server +trellissvr 2078/udp #TrelliSoft Server +idware-router 2079/tcp #IDWARE Router Port +idware-router 2079/udp #IDWARE Router Port +autodesk-nlm 2080/tcp #Autodesk NLM (FLEXlm) +autodesk-nlm 2080/udp #Autodesk NLM (FLEXlm) +kme-trap-port 2081/tcp #KME PRINTER TRAP PORT +kme-trap-port 2081/udp #KME PRINTER TRAP PORT +infowave 2082/tcp #Infowave Mobility Server +infowave 2082/udp #Infowave Mobiltiy Server +gnunet 2086/tcp #GNUnet +gnunet 2086/udp #GNUnet +eli 2087/tcp #ELI - Event Logging Integration +eli 2087/udp #ELI - Event Logging Integration +sep 2089/tcp #Security Encapsulation Protocol - SEP +sep 2089/udp #Security Encapsulation Protocol - SEP +lrp 2090/tcp #Load Report Protocol +lrp 2090/udp #Load Report Protocol +prp 2091/tcp #PRP +prp 2091/udp #PRP +descent3 2092/tcp #Descent 3 +descent3 2092/udp #Descent 3 +nbx-cc 2093/tcp #NBX CC +nbx-cc 2093/udp #NBX CC +nbx-au 2094/tcp #NBX AU +nbx-au 2094/udp #NBX AU +nbx-ser 2095/tcp #NBX SER +nbx-ser 2095/udp #NBX SER +nbx-dir 2096/tcp #NBX DIR +nbx-dir 2096/udp #NBX DIR +jetformpreview 2097/tcp #Jet Form Preview +jetformpreview 2097/udp #Jet Form Preview +dialog-port 2098/tcp #Dialog Port +dialog-port 2098/udp #Dialog Port +h2250-annex-g 2099/tcp #H.225.0 Annex G +h2250-annex-g 2099/udp #H.225.0 Annex G +amiganetfs 2100/tcp #Amiga Network Filesystem +amiganetfs 2100/udp #Amiga Network Filesystem +rtcm-sc104 2101/tcp #rtcm-sc104 +rtcm-sc104 2101/udp #rtcm-sc104 +zephyr-srv 2102/tcp #Zephyr server +zephyr-srv 2102/udp #Zephyr server +zephyr-clt 2103/tcp #Zephyr serv-hm connection +zephyr-clt 2103/udp #Zephyr serv-hm connection +zephyr-hm 2104/tcp #Zephyr hostmanager +zephyr-hm 2104/udp #Zephyr hostmanager +minipay 2105/tcp #MiniPay +minipay 2105/udp #MiniPay +mzap 2106/tcp #MZAP +mzap 2106/udp #MZAP +bintec-admin 2107/tcp #BinTec Admin +bintec-admin 2107/udp #BinTec Admin +comcam 2108/tcp #Comcam +comcam 2108/udp #Comcam +ergolight 2109/tcp #Ergolight +ergolight 2109/udp #Ergolight +umsp 2110/tcp #UMSP +umsp 2110/udp #UMSP +dsatp 2111/tcp #DSATP +dsatp 2111/udp #DSATP +idonix-metanet 2112/tcp #Idonix MetaNet +idonix-metanet 2112/udp #Idonix MetaNet +hsl-storm 2113/tcp #HSL StoRM +hsl-storm 2113/udp #HSL StoRM +newheights 2114/tcp #NEWHEIGHTS +newheights 2114/udp #NEWHEIGHTS +kdm 2115/tcp #Key Distribution Manager +kdm 2115/udp #Key Distribution Manager +ccowcmr 2116/tcp #CCOWCMR +ccowcmr 2116/udp #CCOWCMR +mentaclient 2117/tcp #MENTACLIENT +mentaclient 2117/udp #MENTACLIENT +mentaserver 2118/tcp #MENTASERVER +mentaserver 2118/udp #MENTASERVER +gsigatekeeper 2119/tcp #GSIGATEKEEPER +gsigatekeeper 2119/udp #GSIGATEKEEPER +qencp 2120/tcp #Quick Eagle Networks CP +qencp 2120/udp #Quick Eagle Networks CP +scientia-ssdb 2121/tcp #SCIENTIA-SSDB +scientia-ssdb 2121/udp #SCIENTIA-SSDB +caupc-remote 2122/tcp #CauPC Remote Control +caupc-remote 2122/udp #CauPC Remote Control +gtp-control 2123/tcp #GTP-Control Plane (3GPP) +gtp-control 2123/udp #GTP-Control Plane (3GPP) +elatelink 2124/tcp #ELATELINK +elatelink 2124/udp #ELATELINK +lockstep 2125/tcp #LOCKSTEP +lockstep 2125/udp #LOCKSTEP +pktcable-cops 2126/tcp #PktCable-COPS +pktcable-cops 2126/udp #PktCable-COPS +index-pc-wb 2127/tcp #INDEX-PC-WB +index-pc-wb 2127/udp #INDEX-PC-WB +net-steward 2128/tcp #Net Steward Control +net-steward 2128/udp #Net Steward Control +cs-live 2129/tcp #cs-live.com +cs-live 2129/udp #cs-live.com +swc-xds 2130/tcp #SWC-XDS +swc-xds 2130/udp #SWC-XDS +avantageb2b 2131/tcp #Avantageb2b +avantageb2b 2131/udp #Avantageb2b +avail-epmap 2132/tcp #AVAIL-EPMAP +avail-epmap 2132/udp #AVAIL-EPMAP +zymed-zpp 2133/tcp #ZYMED-ZPP +zymed-zpp 2133/udp #ZYMED-ZPP +avenue 2134/tcp #AVENUE +avenue 2134/udp #AVENUE +gris 2135/tcp #Grid Resource Information Server +gris 2135/udp #Grid Resource Information Server +appworxsrv 2136/tcp #APPWORXSRV +appworxsrv 2136/udp #APPWORXSRV +connect 2137/tcp #CONNECT +connect 2137/udp #CONNECT +unbind-cluster 2138/tcp #UNBIND-CLUSTER +unbind-cluster 2138/udp #UNBIND-CLUSTER +ias-auth 2139/tcp #IAS-AUTH +ias-auth 2139/udp #IAS-AUTH +ias-reg 2140/tcp #IAS-REG +ias-reg 2140/udp #IAS-REG +ias-admind 2141/tcp #IAS-ADMIND +ias-admind 2141/udp #IAS-ADMIND +tdm-over-ip 2142/tcp #TDM-OVER-IP +tdm-over-ip 2142/udp #TDM-OVER-IP +lv-jc 2143/tcp #Live Vault Job Control +lv-jc 2143/udp #Live Vault Job Control +lv-ffx 2144/tcp #Live Vault Fast Object Transfer +lv-ffx 2144/udp #Live Vault Fast Object Transfer +lv-pici 2145/tcp #Live Vault Remote Diagnostic Console Support +lv-pici 2145/udp #Live Vault Remote Diagnostic Console Support +lv-not 2146/tcp #Live Vault Admin Event Notification +lv-not 2146/udp #Live Vault Admin Event Notification +lv-auth 2147/tcp #Live Vault Authentication +lv-auth 2147/udp #Live Vault Authentication +veritas-ucl 2148/tcp #VERITAS UNIVERSAL COMMUNICATION LAYER +veritas-ucl 2148/udp #VERITAS UNIVERSAL COMMUNICATION LAYER +acptsys 2149/tcp #ACPTSYS +acptsys 2149/udp #ACPTSYS +dynamic3d 2150/tcp #DYNAMIC3D +dynamic3d 2150/udp #DYNAMIC3D +docent 2151/tcp #DOCENT +docent 2151/udp #DOCENT +gtp-user 2152/tcp #GTP-User Plane (3GPP) +gtp-user 2152/udp #GTP-User Plane (3GPP) +gdbremote 2159/tcp #GDB Remote Debug Port +gdbremote 2159/udp #GDB Remote Debug Port +apc-2160 2160/tcp #APC 2160 +apc-2160 2160/udp #APC 2160 +apc-2161 2161/tcp #APC 2161 +apc-2161 2161/udp #APC 2161 +navisphere 2162/tcp #Navisphere +navisphere 2162/udp #Navisphere +navisphere-sec 2163/tcp #Navisphere Secure +navisphere-sec 2163/udp #Navisphere Secure +ddns-v3 2164/tcp #Dynamic DNS Version 3 +ddns-v3 2164/udp #Dynamic DNS Version 3 +x-bone-api 2165/tcp #X-Bone API +x-bone-api 2165/udp #X-Bone API +iwserver 2166/tcp #iwserver +iwserver 2166/udp #iwserver +raw-serial 2167/tcp #Raw Async Serial Link +raw-serial 2167/udp #Raw Async Serial Link +mc-gt-srv 2180/tcp #Millicent Vendor Gateway Server +mc-gt-srv 2180/udp #Millicent Vendor Gateway Server +eforward 2181/tcp #eforward +eforward 2181/udp #eforward +tivoconnect 2190/tcp #TiVoConnect Beacon +tivoconnect 2190/udp #TiVoConnect Beacon +tvbus 2191/tcp #TvBus Messaging +tvbus 2191/udp #TvBus Messaging +ici 2200/tcp #ICI +ici 2200/udp #ICI +ats 2201/tcp #Advanced Training System Program +ats 2201/udp #Advanced Training System Program +imtc-map 2202/tcp #Int. Multimedia Teleconferencing Cosortium +imtc-map 2202/udp #Int. Multimedia Teleconferencing Cosortium +kali 2213/tcp #Kali +kali 2213/udp #Kali +netiq 2220/tcp #NetIQ End2End +netiq 2220/udp #NetIQ End2End +rockwell-csp1 2221/tcp #Rockwell CSP1 +rockwell-csp1 2221/udp #Rockwell CSP1 +rockwell-csp2 2222/tcp #Rockwell CSP2 +rockwell-csp2 2222/udp #Rockwell CSP2 +rockwell-csp3 2223/tcp #Rockwell CSP3 +rockwell-csp3 2223/udp #Rockwell CSP3 +ivs-video 2232/tcp #IVS Video default +ivs-video 2232/udp #IVS Video default +infocrypt 2233/tcp #INFOCRYPT +infocrypt 2233/udp #INFOCRYPT +directplay 2234/tcp #DirectPlay +directplay 2234/udp #DirectPlay +sercomm-wlink 2235/tcp #Sercomm-WLink +sercomm-wlink 2235/udp #Sercomm-WLink +nani 2236/tcp #Nani +nani 2236/udp #Nani +optech-port1-lm 2237/tcp #Optech Port1 License Manager +optech-port1-lm 2237/udp #Optech Port1 License Manager +aviva-sna 2238/tcp #AVIVA SNA SERVER +aviva-sna 2238/udp #AVIVA SNA SERVER +imagequery 2239/tcp #Image Query +imagequery 2239/udp #Image Query +recipe 2240/tcp #RECIPe +recipe 2240/udp #RECIPe +ivsd 2241/tcp #IVS Daemon +ivsd 2241/udp #IVS Daemon +foliocorp 2242/tcp #Folio Remote Server +foliocorp 2242/udp #Folio Remote Server +magicom 2243/tcp #Magicom Protocol +magicom 2243/udp #Magicom Protocol +nmsserver 2244/tcp #NMS Server +nmsserver 2244/udp #NMS Server +hao 2245/tcp #HaO +hao 2245/udp #HaO +pc-mta-addrmap 2246/tcp #PacketCable MTA Addr Map +pc-mta-addrmap 2246/udp #PacketCable MTA Addr Map +ums 2248/tcp #User Management Service +ums 2248/udp #User Management Service +rfmp 2249/tcp #RISO File Manager Protocol +rfmp 2249/udp #RISO File Manager Protocol +remote-collab 2250/tcp #remote-collab +remote-collab 2250/udp #remote-collab +dif-port 2251/tcp #Distributed Framework Port +dif-port 2251/udp #Distributed Framework Port +njenet-ssl 2252/tcp #NJENET using SSL +njenet-ssl 2252/udp #NJENET using SSL +dtv-chan-req 2253/tcp #DTV Channel Request +dtv-chan-req 2253/udp #DTV Channel Request +seispoc 2254/tcp #Seismic P.O.C. Port +seispoc 2254/udp #Seismic P.O.C. Port +vrtp 2255/tcp #VRTP - ViRtue Transfer Protocol +vrtp 2255/udp #VRTP - ViRtue Transfer Protocol +apc-2260 2260/tcp #APC 2260 +apc-2260 2260/udp #APC 2260 +mfserver 2266/tcp #M-Files Server +mfserver 2266/udp #M-files Server +xmquery 2279/tcp #xmquery +xmquery 2279/udp #xmquery +lnvpoller 2280/tcp #LNVPOLLER +lnvpoller 2280/udp #LNVPOLLER +lnvconsole 2281/tcp #LNVCONSOLE +lnvconsole 2281/udp #LNVCONSOLE +lnvalarm 2282/tcp #LNVALARM +lnvalarm 2282/udp #LNVALARM +lnvstatus 2283/tcp #LNVSTATUS +lnvstatus 2283/udp #LNVSTATUS +lnvmaps 2284/tcp #LNVMAPS +lnvmaps 2284/udp #LNVMAPS +lnvmailmon 2285/tcp #LNVMAILMON +lnvmailmon 2285/udp #LNVMAILMON +nas-metering 2286/tcp #NAS-Metering +nas-metering 2286/udp #NAS-Metering +dna 2287/tcp #DNA +dna 2287/udp #DNA +netml 2288/tcp #NETML +netml 2288/udp #NETML +konshus-lm 2294/tcp #Konshus License Manager (FLEX) +konshus-lm 2294/udp #Konshus License Manager (FLEX) +advant-lm 2295/tcp #Advant License Manager +advant-lm 2295/udp #Advant License Manager +theta-lm 2296/tcp #Theta License Manager (Rainbow) +theta-lm 2296/udp #Theta License Manager (Rainbow) +d2k-datamover1 2297/tcp #D2K DataMover 1 +d2k-datamover1 2297/udp #D2K DataMover 1 +d2k-datamover2 2298/tcp #D2K DataMover 2 +d2k-datamover2 2298/udp #D2K DataMover 2 +pc-telecommute 2299/tcp #PC Telecommute +pc-telecommute 2299/udp #PC Telecommute +cvmmon 2300/tcp #CVMMON +cvmmon 2300/udp #CVMMON +cpq-wbem 2301/tcp #Compaq HTTP +cpq-wbem 2301/udp #Compaq HTTP +binderysupport 2302/tcp #Bindery Support +binderysupport 2302/udp #Bindery Support +proxy-gateway 2303/tcp #Proxy Gateway +proxy-gateway 2303/udp #Proxy Gateway +attachmate-uts 2304/tcp #Attachmate UTS +attachmate-uts 2304/udp #Attachmate UTS +mt-scaleserver 2305/tcp #MT ScaleServer +mt-scaleserver 2305/udp #MT ScaleServer +tappi-boxnet 2306/tcp #TAPPI BoxNet +tappi-boxnet 2306/udp #TAPPI BoxNet +pehelp 2307/tcp #pehelp +pehelp 2307/udp #pehelp +sdhelp 2308/tcp #sdhelp +sdhelp 2308/udp #sdhelp +sdserver 2309/tcp #SD Server +sdserver 2309/udp #SD Server +sdclient 2310/tcp #SD Client +sdclient 2310/udp #SD Client +messageservice 2311/tcp #Message Service +messageservice 2311/udp #Message Service +iapp 2313/tcp #IAPP (Inter Access Point Protocol) +iapp 2313/udp #IAPP (Inter Access Point Protocol) +cr-websystems 2314/tcp #CR WebSystems +cr-websystems 2314/udp #CR WebSystems +precise-sft 2315/tcp #Precise Sft. +precise-sft 2315/udp #Precise Sft. +sent-lm 2316/tcp #SENT License Manager +sent-lm 2316/udp #SENT License Manager +attachmate-g32 2317/tcp #Attachmate G32 +attachmate-g32 2317/udp #Attachmate G32 +cadencecontrol 2318/tcp #Cadence Control +cadencecontrol 2318/udp #Cadence Control +infolibria 2319/tcp #InfoLibria +infolibria 2319/udp #InfoLibria +siebel-ns 2320/tcp #Siebel NS +siebel-ns 2320/udp #Siebel NS +rdlap 2321/tcp #RDLAP +rdlap 2321/udp #RDLAP +ofsd 2322/tcp #ofsd +ofsd 2322/udp #ofsd +3d-nfsd 2323/tcp #3d-nfsd +3d-nfsd 2323/udp #3d-nfsd +cosmocall 2324/tcp #Cosmocall +cosmocall 2324/udp #Cosmocall +designspace-lm 2325/tcp #Design Space License Management +designspace-lm 2325/udp #Design Space License Management +idcp 2326/tcp #IDCP +idcp 2326/udp #IDCP +xingcsm 2327/tcp #xingcsm +xingcsm 2327/udp #xingcsm +netrix-sftm 2328/tcp #Netrix SFTM +netrix-sftm 2328/udp #Netrix SFTM +nvd 2329/tcp #NVD +nvd 2329/udp #NVD +tscchat 2330/tcp #TSCCHAT +tscchat 2330/udp #TSCCHAT +agentview 2331/tcp #AGENTVIEW +agentview 2331/udp #AGENTVIEW +rcc-host 2332/tcp #RCC Host +rcc-host 2332/udp #RCC Host +snapp 2333/tcp #SNAPP +snapp 2333/udp #SNAPP +ace-client 2334/tcp #ACE Client Auth +ace-client 2334/udp #ACE Client Auth +ace-proxy 2335/tcp #ACE Proxy +ace-proxy 2335/udp #ACE Proxy +appleugcontrol 2336/tcp #Apple UG Control +appleugcontrol 2336/udp #Apple UG Control +ideesrv 2337/tcp #ideesrv +ideesrv 2337/udp #ideesrv +norton-lambert 2338/tcp #Norton Lambert +norton-lambert 2338/udp #Norton Lambert +3com-webview 2339/tcp #3Com WebView +3com-webview 2339/udp #3Com WebView +wrs_registry 2340/tcp #WRS Registry +wrs_registry 2340/udp #WRS Registry +xiostatus 2341/tcp #XIO Status +xiostatus 2341/udp #XIO Status +manage-exec 2342/tcp #Seagate Manage Exec +manage-exec 2342/udp #Seagate Manage Exec +nati-logos 2343/tcp #nati logos +nati-logos 2343/udp #nati logos +fcmsys 2344/tcp #fcmsys +fcmsys 2344/udp #fcmsys +dbm 2345/tcp #dbm +dbm 2345/udp #dbm +redstorm_join 2346/tcp #Game Connection Port +redstorm_join 2346/udp #Game Connection Port +redstorm_find 2347/tcp #Game Announcement and Location +redstorm_find 2347/udp #Game Announcement and Location +redstorm_info 2348/tcp #Information to query for game status +redstorm_info 2348/udp #Information to query for game status +redstorm_diag 2349/tcp #Diagnostics Port +redstorm_diag 2349/udp #Diagnostics Port +psbserver 2350/tcp #psbserver +psbserver 2350/udp #psbserver +psrserver 2351/tcp #psrserver +psrserver 2351/udp #psrserver +pslserver 2352/tcp #pslserver +pslserver 2352/udp #pslserver +pspserver 2353/tcp #pspserver +pspserver 2353/udp #pspserver +psprserver 2354/tcp #psprserver +psprserver 2354/udp #psprserver +psdbserver 2355/tcp #psdbserver +psdbserver 2355/udp #psdbserver +gxtelmd 2356/tcp #GXT License Managemant +gxtelmd 2356/udp #GXT License Managemant +unihub-server 2357/tcp #UniHub Server +unihub-server 2357/udp #UniHub Server +futrix 2358/tcp #Futrix +futrix 2358/udp #Futrix +flukeserver 2359/tcp #FlukeServer +flukeserver 2359/udp #FlukeServer +nexstorindltd 2360/tcp #NexstorIndLtd +nexstorindltd 2360/udp #NexstorIndLtd +tl1 2361/tcp #TL1 +tl1 2361/udp #TL1 +digiman 2362/tcp #digiman +digiman 2362/udp #digiman +mediacntrlnfsd 2363/tcp #Media Central NFSD +mediacntrlnfsd 2363/udp #Media Central NFSD +oi-2000 2364/tcp #OI-2000 +oi-2000 2364/udp #OI-2000 +dbref 2365/tcp #dbref +dbref 2365/udp #dbref +qip-login 2366/tcp #qip-login +qip-login 2366/udp #qip-login +service-ctrl 2367/tcp #Service Control +service-ctrl 2367/udp #Service Control +opentable 2368/tcp #OpenTable +opentable 2368/udp #OpenTable +acs2000-dsp 2369/tcp #ACS2000 DSP +acs2000-dsp 2369/udp #ACS2000 DSP +l3-hbmon 2370/tcp #L3-HBMon +l3-hbmon 2370/udp #L3-HBMon +worldwire 2371/tcp #Compaq WorldWire Port +worldwire 2371/udp #Compaq WorldWire Port +compaq-https 2381/tcp #Compaq HTTPS +compaq-https 2381/udp #Compaq HTTPS +ms-olap3 2382/tcp #Microsoft OLAP +ms-olap3 2382/udp #Microsoft OLAP +ms-olap4 2383/tcp #Microsoft OLAP +ms-olap4 2383/udp #Microsoft OLAP +sd-request 2384/tcp #SD-REQUEST +sd-capacity 2384/udp #SD-CAPACITY +sd-data 2385/tcp #SD-DATA +sd-data 2385/udp #SD-DATA +virtualtape 2386/tcp #Virtual Tape +virtualtape 2386/udp #Virtual Tape +vsamredirector 2387/tcp #VSAM Redirector +vsamredirector 2387/udp #VSAM Redirector +mynahautostart 2388/tcp #MYNAH AutoStart +mynahautostart 2388/udp #MYNAH AutoStart +ovsessionmgr 2389/tcp #OpenView Session Mgr +ovsessionmgr 2389/udp #OpenView Session Mgr +rsmtp 2390/tcp #RSMTP +rsmtp 2390/udp #RSMTP +3com-net-mgmt 2391/tcp #3COM Net Management +3com-net-mgmt 2391/udp #3COM Net Management +tacticalauth 2392/tcp #Tactical Auth +tacticalauth 2392/udp #Tactical Auth +ms-olap1 2393/tcp #MS OLAP 1 +ms-olap1 2393/udp #MS OLAP 1 +ms-olap2 2394/tcp #MS OLAP 2 +ms-olap2 2394/udp #MS OLAP 2 +lan900_remote 2395/tcp #LAN900 Remote +lan900_remote 2395/udp #LAN900 Remote +wusage 2396/tcp #Wusage +wusage 2396/udp #Wusage +ncl 2397/tcp #NCL +ncl 2397/udp #NCL +orbiter 2398/tcp #Orbiter +orbiter 2398/udp #Orbiter +fmpro-fdal 2399/tcp #FileMaker, Inc. - Data Access Layer +fmpro-fdal 2399/udp #FileMaker, Inc. - Data Access Layer +opequus-server 2400/tcp #OpEquus Server +opequus-server 2400/udp #OpEquus Server +cvspserver 2401/tcp #cvspserver +cvspserver 2401/udp #cvspserver +taskmaster2000 2402/tcp #TaskMaster 2000 Server +taskmaster2000 2402/udp #TaskMaster 2000 Server +taskmaster2000 2403/tcp #TaskMaster 2000 Web +taskmaster2000 2403/udp #TaskMaster 2000 Web +iec-104 2404/tcp #IEC 60870-5-104 process control over IP +iec-104 2404/udp #IEC 60870-5-104 process control over IP +trc-netpoll 2405/tcp #TRC Netpoll +trc-netpoll 2405/udp #TRC Netpoll +jediserver 2406/tcp #JediServer +jediserver 2406/udp #JediServer +orion 2407/tcp #Orion +orion 2407/udp #Orion +optimanet 2408/tcp #OptimaNet +optimanet 2408/udp #OptimaNet +sns-protocol 2409/tcp #SNS Protocol +sns-protocol 2409/udp #SNS Protocol +vrts-registry 2410/tcp #VRTS Registry +vrts-registry 2410/udp #VRTS Registry +netwave-ap-mgmt 2411/tcp #Netwave AP Management +netwave-ap-mgmt 2411/udp #Netwave AP Management +cdn 2412/tcp #CDN +cdn 2412/udp #CDN +orion-rmi-reg 2413/tcp #orion-rmi-reg +orion-rmi-reg 2413/udp #orion-rmi-reg +beeyond 2414/tcp #Beeyond +beeyond 2414/udp #Beeyond +codima-rtp 2415/tcp #Codima Remote Transaction Protocol +codima-rtp 2415/udp #Codima Remote Transaction Protocol +rmtserver 2416/tcp #RMT Server +rmtserver 2416/udp #RMT Server +composit-server 2417/tcp #Composit Server +composit-server 2417/udp #Composit Server +cas 2418/tcp #cas +cas 2418/udp #cas +attachmate-s2s 2419/tcp #Attachmate S2S +attachmate-s2s 2419/udp #Attachmate S2S +dslremote-mgmt 2420/tcp #DSL Remote Management +dslremote-mgmt 2420/udp #DSL Remote Management +g-talk 2421/tcp #G-Talk +g-talk 2421/udp #G-Talk +crmsbits 2422/tcp #CRMSBITS +crmsbits 2422/udp #CRMSBITS +rnrp 2423/tcp #RNRP +rnrp 2423/udp #RNRP +kofax-svr 2424/tcp #KOFAX-SVR +kofax-svr 2424/udp #KOFAX-SVR +fjitsuappmgr 2425/tcp #Fujitsu App Manager +fjitsuappmgr 2425/udp #Fujitsu App Manager +mgcp-gateway 2427/tcp #Media Gateway Control Protocol Gateway +mgcp-gateway 2427/udp #Media Gateway Control Protocol Gateway +ott 2428/tcp #One Way Trip Time +ott 2428/udp #One Way Trip Time +ft-role 2429/tcp #FT-ROLE +ft-role 2429/udp #FT-ROLE +venus 2430/tcp #venus +venus 2430/udp #venus +venus-se 2431/tcp #venus-se +venus-se 2431/udp #venus-se +codasrv 2432/tcp #codasrv +codasrv 2432/udp #codasrv +codasrv-se 2433/tcp #codasrv-se +codasrv-se 2433/udp #codasrv-se +pxc-epmap 2434/tcp #pxc-epmap +pxc-epmap 2434/udp #pxc-epmap +optilogic 2435/tcp #OptiLogic +optilogic 2435/udp #OptiLogic +topx 2436/tcp #TOP/X +topx 2436/udp #TOP/X +unicontrol 2437/tcp #UniControl +unicontrol 2437/udp #UniControl +msp 2438/tcp #MSP +msp 2438/udp #MSP +sybasedbsynch 2439/tcp #SybaseDBSynch +sybasedbsynch 2439/udp #SybaseDBSynch +spearway 2440/tcp #Spearway Lockers +spearway 2440/udp #Spearway Lockers +pvsw-inet 2441/tcp #Pervasive I*net Data Server +pvsw-inet 2441/udp #Pervasive I*net Data Server +netangel 2442/tcp #Netangel +netangel 2442/udp #Netangel +powerclientcsf 2443/tcp #PowerClient Central Storage Facility +powerclientcsf 2443/udp #PowerClient Central Storage Facility +btpp2sectrans 2444/tcp #BT PP2 Sectrans +btpp2sectrans 2444/udp #BT PP2 Sectrans +dtn1 2445/tcp #DTN1 +dtn1 2445/udp #DTN1 +bues_service 2446/tcp #bues_service +bues_service 2446/udp #bues_service +ovwdb 2447/tcp #OpenView NNM daemon +ovwdb 2447/udp #OpenView NNM daemon +hpppssvr 2448/tcp #hpppsvr +hpppssvr 2448/udp #hpppsvr +ratl 2449/tcp #RATL +ratl 2449/udp #RATL +netadmin 2450/tcp #netadmin +netadmin 2450/udp #netadmin +netchat 2451/tcp #netchat +netchat 2451/udp #netchat +snifferclient 2452/tcp #SnifferClient +snifferclient 2452/udp #SnifferClient +madge-ltd 2453/tcp #madge ltd +madge-ltd 2453/udp #madge ltd +indx-dds 2454/tcp #IndX-DDS +indx-dds 2454/udp #IndX-DDS +wago-io-system 2455/tcp #WAGO-IO-SYSTEM +wago-io-system 2455/udp #WAGO-IO-SYSTEM +altav-remmgt 2456/tcp #altav-remmgt +altav-remmgt 2456/udp #altav-remmgt +rapido-ip 2457/tcp #Rapido_IP +rapido-ip 2457/udp #Rapido_IP +griffin 2458/tcp #griffin +griffin 2458/udp #griffin +community 2459/tcp #Community +community 2459/udp #Community +ms-theater 2460/tcp #ms-theater +ms-theater 2460/udp #ms-theater +qadmifoper 2461/tcp #qadmifoper +qadmifoper 2461/udp #qadmifoper +qadmifevent 2462/tcp #qadmifevent +qadmifevent 2462/udp #qadmifevent +symbios-raid 2463/tcp #Symbios Raid +symbios-raid 2463/udp #Symbios Raid +direcpc-si 2464/tcp #DirecPC SI +direcpc-si 2464/udp #DirecPC SI +lbm 2465/tcp #Load Balance Management +lbm 2465/udp #Load Balance Management +lbf 2466/tcp #Load Balance Forwarding +lbf 2466/udp #Load Balance Forwarding +high-criteria 2467/tcp #High Criteria +high-criteria 2467/udp #High Criteria +qip-msgd 2468/tcp #qip_msgd +qip-msgd 2468/udp #qip_msgd +mti-tcs-comm 2469/tcp #MTI-TCS-COMM +mti-tcs-comm 2469/udp #MTI-TCS-COMM +taskman-port 2470/tcp #taskman port +taskman-port 2470/udp #taskman port +seaodbc 2471/tcp #SeaODBC +seaodbc 2471/udp #SeaODBC +c3 2472/tcp #C3 +c3 2472/udp #C3 +aker-cdp 2473/tcp #Aker-cdp +aker-cdp 2473/udp #Aker-cdp +vitalanalysis 2474/tcp #Vital Analysis +vitalanalysis 2474/udp #Vital Analysis +ace-server 2475/tcp #ACE Server +ace-server 2475/udp #ACE Server +ace-svr-prop 2476/tcp #ACE Server Propagation +ace-svr-prop 2476/udp #ACE Server Propagation +ssm-cvs 2477/tcp #SecurSight Certificate Valifation Service +ssm-cvs 2477/udp #SecurSight Certificate Valifation Service +ssm-cssps 2478/tcp #SecurSight Authentication Server (SSL) +ssm-cssps 2478/udp #SecurSight Authentication Server (SSL) +ssm-els 2479/tcp #SecurSight Event Logging Server (SSL) +ssm-els 2479/udp #SecurSight Event Logging Server (SSL) +lingwood 2480/tcp #Lingwood's Detail +lingwood 2480/udp #Lingwood's Detail +giop 2481/tcp #Oracle GIOP +giop 2481/udp #Oracle GIOP +giop-ssl 2482/tcp #Oracle GIOP SSL +giop-ssl 2482/udp #Oracle GIOP SSL +ttc 2483/tcp #Oracle TTC +ttc 2483/udp #Oracle TTC +ttc-ssl 2484/tcp #Oracle TTC SSL +ttc-ssl 2484/udp #Oracle TTC SSL +netobjects1 2485/tcp #Net Objects1 +netobjects1 2485/udp #Net Objects1 +netobjects2 2486/tcp #Net Objects2 +netobjects2 2486/udp #Net Objects2 +pns 2487/tcp #Policy Notice Service +pns 2487/udp #Policy Notice Service +moy-corp 2488/tcp #Moy Corporation +moy-corp 2488/udp #Moy Corporation +tsilb 2489/tcp #TSILB +tsilb 2489/udp #TSILB +qip-qdhcp 2490/tcp #qip_qdhcp +qip-qdhcp 2490/udp #qip_qdhcp +conclave-cpp 2491/tcp #Conclave CPP +conclave-cpp 2491/udp #Conclave CPP +groove 2492/tcp #GROOVE +groove 2492/udp #GROOVE +talarian-mqs 2493/tcp #Talarian MQS +talarian-mqs 2493/udp #Talarian MQS +bmc-ar 2494/tcp #BMC AR +bmc-ar 2494/udp #BMC AR +fast-rem-serv 2495/tcp #Fast Remote Services +fast-rem-serv 2495/udp #Fast Remote Services +dirgis 2496/tcp #DIRGIS +dirgis 2496/udp #DIRGIS +quaddb 2497/tcp #Quad DB +quaddb 2497/udp #Quad DB +odn-castraq 2498/tcp #ODN-CasTraq +odn-castraq 2498/udp #ODN-CasTraq +unicontrol 2499/tcp #UniControl +unicontrol 2499/udp #UniControl +rtsserv 2500/tcp #Resource Tracking system server +rtsserv 2500/udp #Resource Tracking system server +rtsclient 2501/tcp #Resource Tracking system client +rtsclient 2501/udp #Resource Tracking system client +kentrox-prot 2502/tcp #Kentrox Protocol +kentrox-prot 2502/udp #Kentrox Protocol +nms-dpnss 2503/tcp #NMS-DPNSS +nms-dpnss 2503/udp #NMS-DPNSS +wlbs 2504/tcp #WLBS +wlbs 2504/udp #WLBS +jbroker 2506/tcp #jbroker +jbroker 2506/udp #jbroker +spock 2507/tcp #spock +spock 2507/udp #spock +jdatastore 2508/tcp #JDataStore +jdatastore 2508/udp #JDataStore +fjmpss 2509/tcp #fjmpss +fjmpss 2509/udp #fjmpss +fjappmgrbulk 2510/tcp #fjappmgrbulk +fjappmgrbulk 2510/udp #fjappmgrbulk +metastorm 2511/tcp #Metastorm +metastorm 2511/udp #Metastorm +citrixima 2512/tcp #Citrix IMA +citrixima 2512/udp #Citrix IMA +citrixadmin 2513/tcp #Citrix ADMIN +citrixadmin 2513/udp #Citrix ADMIN +facsys-ntp 2514/tcp #Facsys NTP +facsys-ntp 2514/udp #Facsys NTP +facsys-router 2515/tcp #Facsys Router +facsys-router 2515/udp #Facsys Router +maincontrol 2516/tcp #Main Control +maincontrol 2516/udp #Main Control +call-sig-trans 2517/tcp #H.323 Annex E call signaling transport +call-sig-trans 2517/udp #H.323 Annex E call signaling transport +willy 2518/tcp #Willy +willy 2518/udp #Willy +globmsgsvc 2519/tcp #globmsgsvc +globmsgsvc 2519/udp #globmsgsvc +pvsw 2520/tcp #Pervasive Listener +pvsw 2520/udp #Pervasive Listener +adaptecmgr 2521/tcp #Adaptec Manager +adaptecmgr 2521/udp #Adaptec Manager +windb 2522/tcp #WinDb +windb 2522/udp #WinDb +qke-llc-v3 2523/tcp #Qke LLC V.3 +qke-llc-v3 2523/udp #Qke LLC V.3 +optiwave-lm 2524/tcp #Optiwave License Management +optiwave-lm 2524/udp #Optiwave License Management +ms-v-worlds 2525/tcp #MS V-Worlds +ms-v-worlds 2525/udp #MS V-Worlds +ema-sent-lm 2526/tcp #EMA License Manager +ema-sent-lm 2526/udp #EMA License Manager +iqserver 2527/tcp #IQ Server +iqserver 2527/udp #IQ Server +ncr_ccl 2528/tcp #NCR CCL +ncr_ccl 2528/udp #NCR CCL +utsftp 2529/tcp #UTS FTP +utsftp 2529/udp #UTS FTP +vrcommerce 2530/tcp #VR Commerce +vrcommerce 2530/udp #VR Commerce +ito-e-gui 2531/tcp #ITO-E GUI +ito-e-gui 2531/udp #ITO-E GUI +ovtopmd 2532/tcp #OVTOPMD +ovtopmd 2532/udp #OVTOPMD +snifferserver 2533/tcp #SnifferServer +snifferserver 2533/udp #SnifferServer +combox-web-acc 2534/tcp #Combox Web Access +combox-web-acc 2534/udp #Combox Web Access +madcap 2535/tcp #MADCAP +madcap 2535/udp #MADCAP +btpp2audctr1 2536/tcp #btpp2audctr1 +btpp2audctr1 2536/udp #btpp2audctr1 +upgrade 2537/tcp #Upgrade Protocol +upgrade 2537/udp #Upgrade Protocol +vnwk-prapi 2538/tcp #vnwk-prapi +vnwk-prapi 2538/udp #vnwk-prapi +vsiadmin 2539/tcp #VSI Admin +vsiadmin 2539/udp #VSI Admin +lonworks 2540/tcp #LonWorks +lonworks 2540/udp #LonWorks +lonworks2 2541/tcp #LonWorks2 +lonworks2 2541/udp #LonWorks2 +davinci 2542/tcp #daVinci Presenter +davinci 2542/udp #daVinci Presenter +reftek 2543/tcp #REFTEK +reftek 2543/udp #REFTEK +novell-zen 2544/tcp #Novell ZEN +novell-zen 2544/udp #Novell ZEN +sis-emt 2545/tcp #sis-emt +sis-emt 2545/udp #sis-emt +vytalvaultbrtp 2546/tcp #vytalvaultbrtp +vytalvaultbrtp 2546/udp #vytalvaultbrtp +vytalvaultvsmp 2547/tcp #vytalvaultvsmp +vytalvaultvsmp 2547/udp #vytalvaultvsmp +vytalvaultpipe 2548/tcp #vytalvaultpipe +vytalvaultpipe 2548/udp #vytalvaultpipe +ipass 2549/tcp #IPASS +ipass 2549/udp #IPASS +ads 2550/tcp #ADS +ads 2550/udp #ADS +isg-uda-server 2551/tcp #ISG UDA Server +isg-uda-server 2551/udp #ISG UDA Server +call-logging 2552/tcp #Call Logging +call-logging 2552/udp #Call Logging +efidiningport 2553/tcp #efidiningport +efidiningport 2553/udp #efidiningport +vcnet-link-v10 2554/tcp #VCnet-Link v10 +vcnet-link-v10 2554/udp #VCnet-Link v10 +compaq-wcp 2555/tcp #Compaq WCP +compaq-wcp 2555/udp #Compaq WCP +nicetec-nmsvc 2556/tcp #nicetec-nmsvc +nicetec-nmsvc 2556/udp #nicetec-nmsvc +nicetec-mgmt 2557/tcp #nicetec-mgmt +nicetec-mgmt 2557/udp #nicetec-mgmt +pclemultimedia 2558/tcp #PCLE Multi Media +pclemultimedia 2558/udp #PCLE Multi Media +lstp 2559/tcp #LSTP +lstp 2559/udp #LSTP +labrat 2560/tcp #labrat +labrat 2560/udp #labrat +mosaixcc 2561/tcp #MosaixCC +mosaixcc 2561/udp #MosaixCC +delibo 2562/tcp #Delibo +delibo 2562/udp #Delibo +cti-redwood 2563/tcp #CTI Redwood +cti-redwood 2563/udp #CTI Redwood +hp-3000-telnet 2564/tcp #HP 3000 NS/VT block mode telnet +coord-svr 2565/tcp #Coordinator Server +coord-svr 2565/udp #Coordinator Server +pcs-pcw 2566/tcp #pcs-pcw +pcs-pcw 2566/udp #pcs-pcw +clp 2567/tcp #Cisco Line Protocol +clp 2567/udp #Cisco Line Protocol +spamtrap 2568/tcp #SPAM TRAP +spamtrap 2568/udp #SPAM TRAP +sonuscallsig 2569/tcp #Sonus Call Signal +sonuscallsig 2569/udp #Sonus Call Signal +hs-port 2570/tcp #HS Port +hs-port 2570/udp #HS Port +cecsvc 2571/tcp #CECSVC +cecsvc 2571/udp #CECSVC +ibp 2572/tcp #IBP +ibp 2572/udp #IBP +trustestablish 2573/tcp #Trust Establish +trustestablish 2573/udp #Trust Establish +blockade-bpsp 2574/tcp #Blockade BPSP +blockade-bpsp 2574/udp #Blockade BPSP +hl7 2575/tcp #HL7 +hl7 2575/udp #HL7 +tclprodebugger 2576/tcp #TCL Pro Debugger +tclprodebugger 2576/udp #TCL Pro Debugger +scipticslsrvr 2577/tcp #Scriptics Lsrvr +scipticslsrvr 2577/udp #Scriptics Lsrvr +rvs-isdn-dcp 2578/tcp #RVS ISDN DCP +rvs-isdn-dcp 2578/udp #RVS ISDN DCP +mpfoncl 2579/tcp #mpfoncl +mpfoncl 2579/udp #mpfoncl +tributary 2580/tcp #Tributary +tributary 2580/udp #Tributary +argis-te 2581/tcp #ARGIS TE +argis-te 2581/udp #ARGIS TE +argis-ds 2582/tcp #ARGIS DS +argis-ds 2582/udp #ARGIS DS +mon 2583/tcp #MON +mon 2583/udp #MON +cyaserv 2584/tcp #cyaserv +cyaserv 2584/udp #cyaserv +netx-server 2585/tcp #NETX Server +netx-server 2585/udp #NETX Server +netx-agent 2586/tcp #NETX Agent +netx-agent 2586/udp #NETX Agent +masc 2587/tcp #MASC +masc 2587/udp #MASC +privilege 2588/tcp #Privilege +privilege 2588/udp #Privilege +quartus-tcl 2589/tcp #quartus tcl +quartus-tcl 2589/udp #quartus tcl +idotdist 2590/tcp #idotdist +idotdist 2590/udp #idotdist +maytagshuffle 2591/tcp #Maytag Shuffle +maytagshuffle 2591/udp #Maytag Shuffle +netrek 2592/tcp #netrek +netrek 2592/udp #netrek +mns-mail 2593/tcp #MNS Mail Notice Service +mns-mail 2593/udp #MNS Mail Notice Service +dts 2594/tcp #Data Base Server +dts 2594/udp #Data Base Server +worldfusion1 2595/tcp #World Fusion 1 +worldfusion1 2595/udp #World Fusion 1 +worldfusion2 2596/tcp #World Fusion 2 +worldfusion2 2596/udp #World Fusion 2 +homesteadglory 2597/tcp #Homestead Glory +homesteadglory 2597/udp #Homestead Glory +citriximaclient 2598/tcp #Citrix MA Client +citriximaclient 2598/udp #Citrix MA Client +snapd 2599/tcp #Snap Discovery +snapd 2599/udp #Snap Discovery +hpstgmgr 2600/tcp #HPSTGMGR +hpstgmgr 2600/udp #HPSTGMGR +discp-client 2601/tcp #discp client +discp-client 2601/udp #discp client +discp-server 2602/tcp #discp server +discp-server 2602/udp #discp server +servicemeter 2603/tcp #Service Meter +servicemeter 2603/udp #Service Meter +nsc-ccs 2604/tcp #NSC CCS +nsc-ccs 2604/udp #NSC CCS +nsc-posa 2605/tcp #NSC POSA +nsc-posa 2605/udp #NSC POSA +netmon 2606/tcp #Dell Netmon +netmon 2606/udp #Dell Netmon +connection 2607/tcp #Dell Connection +connection 2607/udp #Dell Connection +wag-service 2608/tcp #Wag Service +wag-service 2608/udp #Wag Service +system-monitor 2609/tcp #System Monitor +system-monitor 2609/udp #System Monitor +versa-tek 2610/tcp #VersaTek +versa-tek 2610/udp #VersaTek +lionhead 2611/tcp #LIONHEAD +lionhead 2611/udp #LIONHEAD +qpasa-agent 2612/tcp #Qpasa Agent +qpasa-agent 2612/udp #Qpasa Agent +smntubootstrap 2613/tcp #SMNTUBootstrap +smntubootstrap 2613/udp #SMNTUBootstrap +neveroffline 2614/tcp #Never Offline +neveroffline 2614/udp #Never Offline +firepower 2615/tcp #firepower +firepower 2615/udp #firepower +appswitch-emp 2616/tcp #appswitch-emp +appswitch-emp 2616/udp #appswitch-emp +cmadmin 2617/tcp #Clinical Context Managers +cmadmin 2617/udp #Clinical Context Managers +priority-e-com 2618/tcp #Priority E-Com +priority-e-com 2618/udp #Priority E-Com +bruce 2619/tcp #bruce +bruce 2619/udp #bruce +lpsrecommender 2620/tcp #LPSRecommender +lpsrecommender 2620/udp #LPSRecommender +miles-apart 2621/tcp #Miles Apart Jukebox Server +miles-apart 2621/udp #Miles Apart Jukebox Server +metricadbc 2622/tcp #MetricaDBC +metricadbc 2622/udp #MetricaDBC +lmdp 2623/tcp #LMDP +lmdp 2623/udp #LMDP +aria 2624/tcp #Aria +aria 2624/udp #Aria +blwnkl-port 2625/tcp #Blwnkl Port +blwnkl-port 2625/udp #Blwnkl Port +gbjd816 2626/tcp #gbjd816 +gbjd816 2626/udp #gbjd816 +moshebeeri 2627/tcp #Moshe Beeri +moshebeeri 2627/udp #Moshe Beeri +dict 2628/tcp #DICT +dict 2628/udp #DICT +sitaraserver 2629/tcp #Sitara Server +sitaraserver 2629/udp #Sitara Server +sitaramgmt 2630/tcp #Sitara Management +sitaramgmt 2630/udp #Sitara Management +sitaradir 2631/tcp #Sitara Dir +sitaradir 2631/udp #Sitara Dir +irdg-post 2632/tcp #IRdg Post +irdg-post 2632/udp #IRdg Post +interintelli 2633/tcp #InterIntelli +interintelli 2633/udp #InterIntelli +pk-electronics 2634/tcp #PK Electronics +pk-electronics 2634/udp #PK Electronics +backburner 2635/tcp #Back Burner +backburner 2635/udp #Back Burner +solve 2636/tcp #Solve +solve 2636/udp #Solve +imdocsvc 2637/tcp #Import Document Service +imdocsvc 2637/udp #Import Document Service +sybaseanywhere 2638/tcp #Sybase Anywhere +sybaseanywhere 2638/udp #Sybase Anywhere +aminet 2639/tcp #AMInet +aminet 2639/udp #AMInet +sai_sentlm 2640/tcp #Sabbagh Associates Licence Manager +sai_sentlm 2640/udp #Sabbagh Associates Licence Manager +hdl-srv 2641/tcp #HDL Server +hdl-srv 2641/udp #HDL Server +tragic 2642/tcp #Tragic +tragic 2642/udp #Tragic +gte-samp 2643/tcp #GTE-SAMP +gte-samp 2643/udp #GTE-SAMP +travsoft-ipx-t 2644/tcp #Travsoft IPX Tunnel +travsoft-ipx-t 2644/udp #Travsoft IPX Tunnel +novell-ipx-cmd 2645/tcp #Novell IPX CMD +novell-ipx-cmd 2645/udp #Novell IPX CMD +and-lm 2646/tcp #AND License Manager +and-lm 2646/udp #AND License Manager +syncserver 2647/tcp #SyncServer +syncserver 2647/udp #SyncServer +upsnotifyprot 2648/tcp #Upsnotifyprot +upsnotifyprot 2648/udp #Upsnotifyprot +vpsipport 2649/tcp #VPSIPPORT +vpsipport 2649/udp #VPSIPPORT +eristwoguns 2650/tcp #eristwoguns +eristwoguns 2650/udp #eristwoguns +ebinsite 2651/tcp #EBInSite +ebinsite 2651/udp #EBInSite +interpathpanel 2652/tcp #InterPathPanel +interpathpanel 2652/udp #InterPathPanel +sonus 2653/tcp #Sonus +sonus 2653/udp #Sonus +corel_vncadmin 2654/tcp #Corel VNC Admin +corel_vncadmin 2654/udp #Corel VNC Admin +unglue 2655/tcp #UNIX Nt Glue +unglue 2655/udp #UNIX Nt Glue +kana 2656/tcp #Kana +kana 2656/udp #Kana +sns-dispatcher 2657/tcp #SNS Dispatcher +sns-dispatcher 2657/udp #SNS Dispatcher +sns-admin 2658/tcp #SNS Admin +sns-admin 2658/udp #SNS Admin +sns-query 2659/tcp #SNS Query +sns-query 2659/udp #SNS Query +gcmonitor 2660/tcp #GC Monitor +gcmonitor 2660/udp #GC Monitor +olhost 2661/tcp #OLHOST +olhost 2661/udp #OLHOST +bintec-capi 2662/tcp #BinTec-CAPI +bintec-capi 2662/udp #BinTec-CAPI +bintec-tapi 2663/tcp #BinTec-TAPI +bintec-tapi 2663/udp #BinTec-TAPI +patrol-mq-gm 2664/tcp #Patrol for MQ GM +patrol-mq-gm 2664/udp #Patrol for MQ GM +patrol-mq-nm 2665/tcp #Patrol for MQ NM +patrol-mq-nm 2665/udp #Patrol for MQ NM +extensis 2666/tcp #extensis +extensis 2666/udp #extensis +alarm-clock-s 2667/tcp #Alarm Clock Server +alarm-clock-s 2667/udp #Alarm Clock Server +alarm-clock-c 2668/tcp #Alarm Clock Client +alarm-clock-c 2668/udp #Alarm Clock Client +toad 2669/tcp #TOAD +toad 2669/udp #TOAD +tve-announce 2670/tcp #TVE Announce +tve-announce 2670/udp #TVE Announce +newlixreg 2671/tcp #newlixreg +newlixreg 2671/udp #newlixreg +nhserver 2672/tcp #nhserver +nhserver 2672/udp #nhserver +firstcall42 2673/tcp #First Call 42 +firstcall42 2673/udp #First Call 42 +ewnn 2674/tcp #ewnn +ewnn 2674/udp #ewnn +ttc-etap 2675/tcp #TTC ETAP +ttc-etap 2675/udp #TTC ETAP +simslink 2676/tcp #SIMSLink +simslink 2676/udp #SIMSLink +gadgetgate1way 2677/tcp #Gadget Gate 1 Way +gadgetgate1way 2677/udp #Gadget Gate 1 Way +gadgetgate2way 2678/tcp #Gadget Gate 2 Way +gadgetgate2way 2678/udp #Gadget Gate 2 Way +syncserverssl 2679/tcp #Sync Server SSL +syncserverssl 2679/udp #Sync Server SSL +pxc-sapxom 2680/tcp #pxc-sapxom +pxc-sapxom 2680/udp #pxc-sapxom +mpnjsomb 2681/tcp #mpnjsomb +mpnjsomb 2681/udp #mpnjsomb +ncdloadbalance 2683/tcp #NCDLoadBalance +ncdloadbalance 2683/udp #NCDLoadBalance +mpnjsosv 2684/tcp #mpnjsosv +mpnjsosv 2684/udp #mpnjsosv +mpnjsocl 2685/tcp #mpnjsocl +mpnjsocl 2685/udp #mpnjsocl +mpnjsomg 2686/tcp #mpnjsomg +mpnjsomg 2686/udp #mpnjsomg +pq-lic-mgmt 2687/tcp #pq-lic-mgmt +pq-lic-mgmt 2687/udp #pq-lic-mgmt +md-cg-http 2688/tcp #md-cf-http +md-cg-http 2688/udp #md-cf-http +fastlynx 2689/tcp #FastLynx +fastlynx 2689/udp #FastLynx +hp-nnm-data 2690/tcp #HP NNM Embedded Database +hp-nnm-data 2690/udp #HP NNM Embedded Database +itinternet 2691/tcp #ITInternet ISM Server +itinternet 2691/udp #ITInternet ISM Server +admins-lms 2692/tcp #Admins LMS +admins-lms 2692/udp #Admins LMS +pwrsevent 2694/tcp #pwrsevent +pwrsevent 2694/udp #pwrsevent +vspread 2695/tcp #VSPREAD +vspread 2695/udp #VSPREAD +unifyadmin 2696/tcp #Unify Admin +unifyadmin 2696/udp #Unify Admin +oce-snmp-trap 2697/tcp #Oce SNMP Trap Port +oce-snmp-trap 2697/udp #Oce SNMP Trap Port +mck-ivpip 2698/tcp #MCK-IVPIP +mck-ivpip 2698/udp #MCK-IVPIP +csoft-plusclnt 2699/tcp #Csoft Plus Client +csoft-plusclnt 2699/udp #Csoft Plus Client +tqdata 2700/tcp #tqdata +tqdata 2700/udp #tqdata +sms-rcinfo 2701/tcp #SMS RCINFO +sms-rcinfo 2701/udp #SMS RCINFO +sms-xfer 2702/tcp #SMS XFER +sms-xfer 2702/udp #SMS XFER +sms-chat 2703/tcp #SMS CHAT +sms-chat 2703/udp #SMS CHAT +sms-remctrl 2704/tcp #SMS REMCTRL +sms-remctrl 2704/udp #SMS REMCTRL +sds-admin 2705/tcp #SDS Admin +sds-admin 2705/udp #SDS Admin +ncdmirroring 2706/tcp #NCD Mirroring +ncdmirroring 2706/udp #NCD Mirroring +emcsymapiport 2707/tcp #EMCSYMAPIPORT +emcsymapiport 2707/udp #EMCSYMAPIPORT +banyan-net 2708/tcp #Banyan-Net +banyan-net 2708/udp #Banyan-Net +supermon 2709/tcp #Supermon +supermon 2709/udp #Supermon +sso-service 2710/tcp #SSO Service +sso-service 2710/udp #SSO Service +sso-control 2711/tcp #SSO Control +sso-control 2711/udp #SSO Control +aocp 2712/tcp #Axapta Object Communication Protocol +aocp 2712/udp #Axapta Object Communication Protocol +raven1 2713/tcp #Raven1 +raven1 2713/udp #Raven1 +raven2 2714/tcp #Raven2 +raven2 2714/udp #Raven2 +hpstgmgr2 2715/tcp #HPSTGMGR2 +hpstgmgr2 2715/udp #HPSTGMGR2 +inova-ip-disco 2716/tcp #Inova IP Disco +inova-ip-disco 2716/udp #Inova IP Disco +pn-requester 2717/tcp #PN REQUESTER +pn-requester 2717/udp #PN REQUESTER +pn-requester2 2718/tcp #PN REQUESTER 2 +pn-requester2 2718/udp #PN REQUESTER 2 +scan-change 2719/tcp #Scan & Change +scan-change 2719/udp #Scan & Change +wkars 2720/tcp #wkars +wkars 2720/udp #wkars +smart-diagnose 2721/tcp #Smart Diagnose +smart-diagnose 2721/udp #Smart Diagnose +proactivesrvr 2722/tcp #Proactive Server +proactivesrvr 2722/udp #Proactive Server +watchdognt 2723/tcp #WatchDog NT +watchdognt 2723/udp #WatchDog NT +qotps 2724/tcp #qotps +qotps 2724/udp #qotps +msolap-ptp2 2725/tcp #MSOLAP PTP2 +msolap-ptp2 2725/udp #MSOLAP PTP2 +tams 2726/tcp #TAMS +tams 2726/udp #TAMS +mgcp-callagent 2727/tcp #Media Gateway Control Protocol Call Agent +mgcp-callagent 2727/udp #Media Gateway Control Protocol Call Agent +sqdr 2728/tcp #SQDR +sqdr 2728/udp #SQDR +tcim-control 2729/tcp #TCIM Control +tcim-control 2729/udp #TCIM Control +nec-raidplus 2730/tcp #NEC RaidPlus +nec-raidplus 2730/udp #NEC RaidPlus +fyre-messanger 2731/tcp #Fyre Messanger +fyre-messanger 2731/udp #Fyre Messagner +g5m 2732/tcp #G5M +g5m 2732/udp #G5M +signet-ctf 2733/tcp #Signet CTF +signet-ctf 2733/udp #Signet CTF +ccs-software 2734/tcp #CCS Software +ccs-software 2734/udp #CCS Software +netiq-mc 2735/tcp #NetIQ Monitor Console +netiq-mc 2735/udp #NetIQ Monitor Console +radwiz-nms-srv 2736/tcp #RADWIZ NMS SRV +radwiz-nms-srv 2736/udp #RADWIZ NMS SRV +srp-feedback 2737/tcp #SRP Feedback +srp-feedback 2737/udp #SRP Feedback +ndl-tcp-ois-gw 2738/tcp #NDL TCP-OSI Gateway +ndl-tcp-ois-gw 2738/udp #NDL TCP-OSI Gateway +tn-timing 2739/tcp #TN Timing +tn-timing 2739/udp #TN Timing +alarm 2740/tcp #Alarm +alarm 2740/udp #Alarm +tsb 2741/tcp #TSB +tsb 2741/udp #TSB +tsb2 2742/tcp #TSB2 +tsb2 2742/udp #TSB2 +murx 2743/tcp #murx +murx 2743/udp #murx +honyaku 2744/tcp #honyaku +honyaku 2744/udp #honyaku +urbisnet 2745/tcp #URBISNET +urbisnet 2745/udp #URBISNET +cpudpencap 2746/tcp #CPUDPENCAP +cpudpencap 2746/udp #CPUDPENCAP +rsisysaccess 2752/tcp #RSISYS ACCESS +rsisysaccess 2752/udp #RSISYS ACCESS +de-spot 2753/tcp #de-spot +de-spot 2753/udp #de-spot +apollo-cc 2754/tcp #APOLLO CC +apollo-cc 2754/udp #APOLLO CC +expresspay 2755/tcp #Express Pay +expresspay 2755/udp #Express Pay +simplement-tie 2756/tcp #simplement-tie +simplement-tie 2756/udp #simplement-tie +cnrp 2757/tcp #CNRP +cnrp 2757/udp #CNRP +apollo-status 2758/tcp #APOLLO Status +apollo-status 2758/udp #APOLLO Status +apollo-gms 2759/tcp #APOLLO GMS +apollo-gms 2759/udp #APOLLO GMS +sabams 2760/tcp #Saba MS +sabams 2760/udp #Saba MS +dicom-iscl 2761/tcp #DICOM ISCL +dicom-iscl 2761/udp #DICOM ISCL +dicom-tls 2762/tcp #DICOM TLS +dicom-tls 2762/udp #DICOM TLS +desktop-dna 2763/tcp #Desktop DNA +desktop-dna 2763/udp #Desktop DNA +data-insurance 2764/tcp #Data Insurance +data-insurance 2764/udp #Data Insurance +qip-audup 2765/tcp #qip-audup +qip-audup 2765/udp #qip-audup +compaq-scp 2766/tcp #Compaq SCP +compaq-scp 2766/udp #Compaq SCP +uadtc 2767/tcp #UADTC +uadtc 2767/udp #UADTC +uacs 2768/tcp #UACS +uacs 2768/udp #UACS +exce 2769/tcp #eXcE +exce 2769/udp #eXcE +veronica 2770/tcp #Veronica +veronica 2770/udp #Veronica +vergencecm 2771/tcp #Vergence CM +vergencecm 2771/udp #Vergence CM +auris 2772/tcp #auris +auris 2772/udp #auris +rbakcup1 2773/tcp #RBackup Remote Backup +rbakcup1 2773/udp #RBackup Remote Backup +rbakcup2 2774/tcp #RBackup Remote Backup +rbakcup2 2774/udp #RBackup Remote Backup +smpp 2775/tcp #SMPP +smpp 2775/udp #SMPP +ridgeway1 2776/tcp #Ridgeway Systems & Software +ridgeway1 2776/udp #Ridgeway Systems & Software +ridgeway2 2777/tcp #Ridgeway Systems & Software +ridgeway2 2777/udp #Ridgeway Systems & Software +gwen-sonya 2778/tcp #Gwen-Sonya +gwen-sonya 2778/udp #Gwen-Sonya +lbc-sync 2779/tcp #LBC Sync +lbc-sync 2779/udp #LBC Sync +lbc-control 2780/tcp #LBC Control +lbc-control 2780/udp #LBC Control +whosells 2781/tcp #whosells +whosells 2781/udp #whosells +everydayrc 2782/tcp #everydayrc +everydayrc 2782/udp #everydayrc +aises 2783/tcp #AISES +aises 2783/udp #AISES +www-dev 2784/tcp #world wide web - development +www-dev 2784/udp #world wide web - development +aic-np 2785/tcp #aic-np +aic-np 2785/udp #aic-np +aic-oncrpc 2786/tcp #aic-oncrpc - Destiny MCD database +aic-oncrpc 2786/udp #aic-oncrpc - Destiny MCD database +piccolo 2787/tcp #piccolo - Cornerstone Software +piccolo 2787/udp #piccolo - Cornerstone Software +fryeserv 2788/tcp #NetWare Loadable Module - Seagate Software +fryeserv 2788/udp #NetWare Loadable Module - Seagate Software +media-agent 2789/tcp #Media Agent +media-agent 2789/udp #Media Agent +plgproxy 2790/tcp #PLG Proxy +plgproxy 2790/udp #PLG Proxy +mtport-regist 2791/tcp #MT Port Registrator +mtport-regist 2791/udp #MT Port Registrator +f5-globalsite 2792/tcp #f5-globalsite +f5-globalsite 2792/udp #f5-globalsite +initlsmsad 2793/tcp #initlsmsad +initlsmsad 2793/udp #initlsmsad +aaftp 2794/tcp #aaftp +aaftp 2794/udp #aaftp +livestats 2795/tcp #LiveStats +livestats 2795/udp #LiveStats +ac-tech 2796/tcp #ac-tech +ac-tech 2796/udp #ac-tech +esp-encap 2797/tcp #esp-encap +esp-encap 2797/udp #esp-encap +tmesis-upshot 2798/tcp #TMESIS-UPShot +tmesis-upshot 2798/udp #TMESIS-UPShot +icon-discover 2799/tcp #ICON Discover +icon-discover 2799/udp #ICON Discover +acc-raid 2800/tcp #ACC RAID +acc-raid 2800/udp #ACC RAID +igcp 2801/tcp #IGCP +igcp 2801/udp #IGCP +veritas-tcp1 2802/tcp #Veritas TCP1 +veritas-udp1 2802/udp #Veritas UDP1 +btprjctrl 2803/tcp #btprjctrl +btprjctrl 2803/udp #btprjctrl +dvr-esm 2804/tcp #March Networks Digital Video Recorders and Enterprise Service Manager products +dvr-esm 2804/udp #March Networks Digital Video Recorders and Enterprise Service Manager products +wta-wsp-s 2805/tcp #WTA WSP-S +wta-wsp-s 2805/udp #WTA WSP-S +cspuni 2806/tcp #cspuni +cspuni 2806/udp #cspuni +cspmulti 2807/tcp #cspmulti +cspmulti 2807/udp #cspmulti +j-lan-p 2808/tcp #J-LAN-P +j-lan-p 2808/udp #J-LAN-P +corbaloc 2809/tcp #CORBA LOC +corbaloc 2809/udp #CORBA LOC +netsteward 2810/tcp #Active Net Steward +netsteward 2810/udp #Active Net Steward +gsiftp 2811/tcp #GSI FTP +gsiftp 2811/udp #GSI FTP +atmtcp 2812/tcp #atmtcp +atmtcp 2812/udp #atmtcp +llm-pass 2813/tcp #llm-pass +llm-pass 2813/udp #llm-pass +llm-csv 2814/tcp #llm-csv +llm-csv 2814/udp #llm-csv +lbc-measure 2815/tcp #LBC Measurement +lbc-measure 2815/udp #LBC Measurement +lbc-watchdog 2816/tcp #LBC Watchdog +lbc-watchdog 2816/udp #LBC Watchdog +nmsigport 2817/tcp #NMSig Port +nmsigport 2817/udp #NMSig Port +rmlnk 2818/tcp #rmlnk +rmlnk 2818/udp #rmlnk +fc-faultnotify 2819/tcp #FC Fault Notification +fc-faultnotify 2819/udp #FC Fault Notification +univision 2820/tcp #UniVision +univision 2820/udp #UniVision +vrts-at-port 2821/tcp #VERITAS Authentication Service +vrts-at-port 2821/udp #VERITAS Authentication Service +ka0wuc 2822/tcp #ka0wuc +ka0wuc 2822/udp #ka0wuc +cqg-netlan 2823/tcp #CQG Net/LAN +cqg-netlan 2823/udp #CQG Net/LAN +cqg-netlan-1 2824/tcp #CQG Net/LAN 1 +cqg-netlan-1 2824/udp #CQG Net/Lan 1 +slc-systemlog 2826/tcp #slc systemlog +slc-systemlog 2826/udp #slc systemlog +slc-ctrlrloops 2827/tcp #slc ctrlrloops +slc-ctrlrloops 2827/udp #slc ctrlrloops +itm-lm 2828/tcp #ITM License Manager +itm-lm 2828/udp #ITM License Manager +silkp1 2829/tcp #silkp1 +silkp1 2829/udp #silkp1 +silkp2 2830/tcp #silkp2 +silkp2 2830/udp #silkp2 +silkp3 2831/tcp #silkp3 +silkp3 2831/udp #silkp3 +silkp4 2832/tcp #silkp4 +silkp4 2832/udp #silkp4 +glishd 2833/tcp #glishd +glishd 2833/udp #glishd +evtp 2834/tcp #EVTP +evtp 2834/udp #EVTP +evtp-data 2835/tcp #EVTP-DATA +evtp-data 2835/udp #EVTP-DATA +catalyst 2836/tcp #catalyst +catalyst 2836/udp #catalyst +repliweb 2837/tcp #Repliweb +repliweb 2837/udp #Repliweb +starbot 2838/tcp #Starbot +starbot 2838/udp #Starbot +nmsigport 2839/tcp #NMSigPort +nmsigport 2839/udp #NMSigPort +l3-exprt 2840/tcp #l3-exprt +l3-exprt 2840/udp #l3-exprt +l3-ranger 2841/tcp #l3-ranger +l3-ranger 2841/udp #l3-ranger +l3-hawk 2842/tcp #l3-hawk +l3-hawk 2842/udp #l3-hawk +pdnet 2843/tcp #PDnet +pdnet 2843/udp #PDnet +bpcp-poll 2844/tcp #BPCP POLL +bpcp-poll 2844/udp #BPCP POLL +bpcp-trap 2845/tcp #BPCP TRAP +bpcp-trap 2845/udp #BPCP TRAP +aimpp-hello 2846/tcp #AIMPP Hello +aimpp-hello 2846/udp #AIMPP Hello +aimpp-port-req 2847/tcp #AIMPP Port Req +aimpp-port-req 2847/udp #AIMPP Port Req +amt-blc-port 2848/tcp #AMT-BLC-PORT +amt-blc-port 2848/udp #AMT-BLC-PORT +fxp 2849/tcp #FXP +fxp 2849/udp #FXP +metaconsole 2850/tcp #MetaConsole +metaconsole 2850/udp #MetaConsole +webemshttp 2851/tcp #webemshttp +webemshttp 2851/udp #webemshttp +bears-01 2852/tcp #bears-01 +bears-01 2852/udp #bears-01 +ispipes 2853/tcp #ISPipes +ispipes 2853/udp #ISPipes +infomover 2854/tcp #InfoMover +infomover 2854/udp #InfoMover +cesdinv 2856/tcp #cesdinv +cesdinv 2856/udp #cesdinv +simctlp 2857/tcp #SimCtIP +simctlp 2857/udp #SimCtIP +ecnp 2858/tcp #ECNP +ecnp 2858/udp #ECNP +activememory 2859/tcp #Active Memory +activememory 2859/udp #Active Memory +dialpad-voice1 2860/tcp #Dialpad Voice 1 +dialpad-voice1 2860/udp #Dialpad Voice 1 +dialpad-voice2 2861/tcp #Dialpad Voice 2 +dialpad-voice2 2861/udp #Dialpad Voice 2 +ttg-protocol 2862/tcp #TTG Protocol +ttg-protocol 2862/udp #TTG Protocol +sonardata 2863/tcp #Sonar Data +sonardata 2863/udp #Sonar Data +astromed-main 2864/tcp #main 5001 cmd +astromed-main 2864/udp #main 5001 cmd +pit-vpn 2865/tcp #pit-vpn +pit-vpn 2865/udp #pit-vpn +iwlistener 2866/tcp #iwlistener +iwlistener 2866/udp #iwlistener +esps-portal 2867/tcp #esps-portal +esps-portal 2867/udp #esps-portal +npep-messaging 2868/tcp #NPEP Messaging +npep-messaging 2868/udp #NPEP Messaging +icslap 2869/tcp #ICSLAP +icslap 2869/udp #ICSLAP +daishi 2870/tcp #daishi +daishi 2870/udp #daishi +msi-selectplay 2871/tcp #MSI Select Play +msi-selectplay 2871/udp #MSI Select Play +radix 2872/tcp #RADIX +radix 2872/udp #RADIX +dxmessagebase1 2874/tcp #dxmessagebase1 +dxmessagebase1 2874/udp #dxmessagebase1 +dxmessagebase2 2875/tcp #dxmessagebase2 +dxmessagebase2 2875/udp #dxmessagebase2 +sps-tunnel 2876/tcp #SPS Tunnel +sps-tunnel 2876/udp #SPS Tunnel +bluelance 2877/tcp #BLUELANCE +bluelance 2877/udp #BLUELANCE +aap 2878/tcp #AAP +aap 2878/udp #AAP +ucentric-ds 2879/tcp #ucentric-ds +ucentric-ds 2879/udp #ucentric-ds +synapse 2880/tcp #Synapse Transport +synapse 2880/udp #Synapse Transport +ndsp 2881/tcp #NDSP +ndsp 2881/udp #NDSP +ndtp 2882/tcp #NDTP +ndtp 2882/udp #NDTP +ndnp 2883/tcp #NDNP +ndnp 2883/udp #NDNP +flashmsg 2884/tcp #Flash Msg +flashmsg 2884/udp #Flash Msg +topflow 2885/tcp #TopFlow +topflow 2885/udp #TopFlow +responselogic 2886/tcp #RESPONSELOGIC +responselogic 2886/udp #RESPONSELOGIC +aironetddp 2887/tcp #aironet +aironetddp 2887/udp #aironet +spcsdlobby 2888/tcp #SPCSDLOBBY +spcsdlobby 2888/udp #SPCSDLOBBY +rsom 2889/tcp #RSOM +rsom 2889/udp #RSOM +cspclmulti 2890/tcp #CSPCLMULTI +cspclmulti 2890/udp #CSPCLMULTI +cinegrfx-elmd 2891/tcp #CINEGRFX-ELMD License Manager +cinegrfx-elmd 2891/udp #CINEGRFX-ELMD License Manager +snifferdata 2892/tcp #SNIFFERDATA +snifferdata 2892/udp #SNIFFERDATA +vseconnector 2893/tcp #VSECONNECTOR +vseconnector 2893/udp #VSECONNECTOR +abacus-remote 2894/tcp #ABACUS-REMOTE +abacus-remote 2894/udp #ABACUS-REMOTE +natuslink 2895/tcp #NATUS LINK +natuslink 2895/udp #NATUS LINK +ecovisiong6-1 2896/tcp #ECOVISIONG6-1 +ecovisiong6-1 2896/udp #ECOVISIONG6-1 +citrix-rtmp 2897/tcp #Citrix RTMP +citrix-rtmp 2897/udp #Citrix RTMP +appliance-cfg 2898/tcp #APPLIANCE-CFG +appliance-cfg 2898/udp #APPLIANCE-CFG +powergemplus 2899/tcp #POWERGEMPLUS +powergemplus 2899/udp #POWERGEMPLUS +quicksuite 2900/tcp #QUICKSUITE +quicksuite 2900/udp #QUICKSUITE +allstorcns 2901/tcp #ALLSTORCNS +allstorcns 2901/udp #ALLSTORCNS +netaspi 2902/tcp #NET ASPI +netaspi 2902/udp #NET ASPI +suitcase 2903/tcp #SUITCASE +suitcase 2903/udp #SUITCASE +m2ua 2904/tcp #M2UA +m2ua 2904/udp #M2UA +m3ua 2905/tcp #M3UA +m3ua 2905/udp #De-registered (2001 June 07) +caller9 2906/tcp #CALLER9 +caller9 2906/udp #CALLER9 +webmethods-b2b 2907/tcp #WEBMETHODS B2B +webmethods-b2b 2907/udp #WEBMETHODS B2B +mao 2908/tcp #mao +mao 2908/udp #mao +funk-dialout 2909/tcp #Funk Dialout +funk-dialout 2909/udp #Funk Dialout +tdaccess 2910/tcp #TDAccess +tdaccess 2910/udp #TDAccess +blockade 2911/tcp #Blockade +blockade 2911/udp #Blockade +epicon 2912/tcp #Epicon +epicon 2912/udp #Epicon +boosterware 2913/tcp #Booster Ware +boosterware 2913/udp #Booster Ware +gamelobby 2914/tcp #Game Lobby +gamelobby 2914/udp #Game Lobby +tksocket 2915/tcp #TK Socket +tksocket 2915/udp #TK Socket +elvin_server 2916/tcp #Elvin Server +elvin_server 2916/udp #Elvin Server +elvin_client 2917/tcp #Elvin Client +elvin_client 2917/udp #Elvin Client +kastenchasepad 2918/tcp #Kasten Chase Pad +kastenchasepad 2918/udp #Kasten Chase Pad +roboer 2919/tcp #roboER +roboer 2919/udp #roboER +roboeda 2920/tcp #roboEDA +roboeda 2920/udp #roboEDA +cesdcdman 2921/tcp #CESD Contents Delivery Management +cesdcdman 2921/udp #CESD Contents Delivery Management +cesdcdtrn 2922/tcp #CESD Contents Delivery Data Transfer +cesdcdtrn 2922/udp #CESD Contents Delivery Data Transfer +wta-wsp-wtp-s 2923/tcp #WTA-WSP-WTP-S +wta-wsp-wtp-s 2923/udp #WTA-WSP-WTP-S +precise-vip 2924/tcp #PRECISE-VIP +precise-vip 2924/udp #PRECISE-VIP +mobile-file-dl 2926/tcp #MOBILE-FILE-DL +mobile-file-dl 2926/udp #MOBILE-FILE-DL +unimobilectrl 2927/tcp #UNIMOBILECTRL +unimobilectrl 2927/udp #UNIMOBILECTRL +redstone-cpss 2928/tcp #REDSTONE-CPSS +redstone-cpss 2928/udp #REDSTONE-CPSS +amx-webadmin 2929/tcp #AMX-WEBADMIN +amx-webadmin 2929/udp #AMX-WEBADMIN +amx-weblinx 2930/tcp #AMX-WEBLINX +amx-weblinx 2930/udp #AMX-WEBLINX +circle-x 2931/tcp #Circle-X +circle-x 2931/udp #Circle-X +incp 2932/tcp #INCP +incp 2932/udp #INCP +4-tieropmgw 2933/tcp #4-TIER OPM GW +4-tieropmgw 2933/udp #4-TIER OPM GW +4-tieropmcli 2934/tcp #4-TIER OPM CLI +4-tieropmcli 2934/udp #4-TIER OPM CLI +qtp 2935/tcp #QTP +qtp 2935/udp #QTP +otpatch 2936/tcp #OTPatch +otpatch 2936/udp #OTPatch +pnaconsult-lm 2937/tcp #PNACONSULT-LM +pnaconsult-lm 2937/udp #PNACONSULT-LM +sm-pas-1 2938/tcp #SM-PAS-1 +sm-pas-1 2938/udp #SM-PAS-1 +sm-pas-2 2939/tcp #SM-PAS-2 +sm-pas-2 2939/udp #SM-PAS-2 +sm-pas-3 2940/tcp #SM-PAS-3 +sm-pas-3 2940/udp #SM-PAS-3 +sm-pas-4 2941/tcp #SM-PAS-4 +sm-pas-4 2941/udp #SM-PAS-4 +sm-pas-5 2942/tcp #SM-PAS-5 +sm-pas-5 2942/udp #SM-PAS-5 +ttnrepository 2943/tcp #TTNRepository +ttnrepository 2943/udp #TTNRepository +megaco-h248 2944/tcp #Megaco H-248 +megaco-h248 2944/udp #Megaco H-248 +h248-binary 2945/tcp #H248 Binary +h248-binary 2945/udp #H248 Binary +fjsvmpor 2946/tcp #FJSVmpor +fjsvmpor 2946/udp #FJSVmpor +gpsd 2947/tcp #GPSD +gpsd 2947/udp #GPSD +wap-push 2948/tcp #WAP PUSH +wap-push 2948/udp #WAP PUSH +wap-pushsecure 2949/tcp #WAP PUSH SECURE +wap-pushsecure 2949/udp #WAP PUSH SECURE +esip 2950/tcp #ESIP +esip 2950/udp #ESIP +ottp 2951/tcp #OTTP +ottp 2951/udp #OTTP +mpfwsas 2952/tcp #MPFWSAS +mpfwsas 2952/udp #MPFWSAS +ovalarmsrv 2953/tcp #OVALARMSRV +ovalarmsrv 2953/udp #OVALARMSRV +ovalarmsrv-cmd 2954/tcp #OVALARMSRV-CMD +ovalarmsrv-cmd 2954/udp #OVALARMSRV-CMD +csnotify 2955/tcp #CSNOTIFY +csnotify 2955/udp #CSNOTIFY +ovrimosdbman 2956/tcp #OVRIMOSDBMAN +ovrimosdbman 2956/udp #OVRIMOSDBMAN +jmact5 2957/tcp #JAMCT5 +jmact5 2957/udp #JAMCT5 +jmact6 2958/tcp #JAMCT6 +jmact6 2958/udp #JAMCT6 +rmopagt 2959/tcp #RMOPAGT +rmopagt 2959/udp #RMOPAGT +dfoxserver 2960/tcp #DFOXSERVER +dfoxserver 2960/udp #DFOXSERVER +boldsoft-lm 2961/tcp #BOLDSOFT-LM +boldsoft-lm 2961/udp #BOLDSOFT-LM +iph-policy-cli 2962/tcp #IPH-POLICY-CLI +iph-policy-cli 2962/udp #IPH-POLICY-CLI +iph-policy-adm 2963/tcp #IPH-POLICY-ADM +iph-policy-adm 2963/udp #IPH-POLICY-ADM +bullant-srap 2964/tcp #BULLANT SRAP +bullant-srap 2964/udp #BULLANT SRAP +bullant-rap 2965/tcp #BULLANT RAP +bullant-rap 2965/udp #BULLANT RAP +idp-infotrieve 2966/tcp #IDP-INFOTRIEVE +idp-infotrieve 2966/udp #IDP-INFOTRIEVE +ssc-agent 2967/tcp #SSC-AGENT +ssc-agent 2967/udp #SSC-AGENT +enpp 2968/tcp #ENPP +enpp 2968/udp #ENPP +essp 2969/tcp #ESSP +essp 2969/udp #ESSP +index-net 2970/tcp #INDEX-NET +index-net 2970/udp #INDEX-NET +netclip 2971/tcp #NetClip clipboard daemon +netclip 2971/udp #NetClip clipboard daemon +pmsm-webrctl 2972/tcp #PMSM Webrctl +pmsm-webrctl 2972/udp #PMSM Webrctl +svnetworks 2973/tcp #SV Networks +svnetworks 2973/udp #SV Networks +signal 2974/tcp #Signal +signal 2974/udp #Signal +fjmpcm 2975/tcp #Fujitsu Configuration Management Service +fjmpcm 2975/udp #Fujitsu Configuration Management Service +cns-srv-port 2976/tcp #CNS Server Port +cns-srv-port 2976/udp #CNS Server Port +ttc-etap-ns 2977/tcp #TTCs Enterprise Test Access Protocol - NS +ttc-etap-ns 2977/udp #TTCs Enterprise Test Access Protocol - NS +ttc-etap-ds 2978/tcp #TTCs Enterprise Test Access Protocol - DS +ttc-etap-ds 2978/udp #TTCs Enterprise Test Access Protocol - DS +h263-video 2979/tcp #H.263 Video Streaming +h263-video 2979/udp #H.263 Video Streaming +wimd 2980/tcp #Instant Messaging Service +wimd 2980/udp #Instant Messaging Service +mylxamport 2981/tcp #MYLXAMPORT +mylxamport 2981/udp #MYLXAMPORT +iwb-whiteboard 2982/tcp #IWB-WHITEBOARD +iwb-whiteboard 2982/udp #IWB-WHITEBOARD +netplan 2983/tcp #NETPLAN +netplan 2983/udp #NETPLAN +hpidsadmin 2984/tcp #HPIDSADMIN +hpidsadmin 2984/udp #HPIDSADMIN +hpidsagent 2985/tcp #HPIDSAGENT +hpidsagent 2985/udp #HPIDSAGENT +stonefalls 2986/tcp #STONEFALLS +stonefalls 2986/udp #STONEFALLS +identify 2987/tcp #identify +identify 2987/udp #identify +hippad 2988/tcp #HIPPA Reporting Protocol +hippad 2988/udp #HIPPA Reporting Protocol +zarkov 2989/tcp #ZARKOV Intelligent Agent Communication +zarkov 2989/udp #ZARKOV Intelligent Agent Communication +boscap 2990/tcp #BOSCAP +boscap 2990/udp #BOSCAP +wkstn-mon 2991/tcp #WKSTN-MON +wkstn-mon 2991/udp #WKSTN-MON +itb301 2992/tcp #ITB301 +itb301 2992/udp #ITB301 +veritas-vis1 2993/tcp #VERITAS VIS1 +veritas-vis1 2993/udp #VERITAS VIS1 +veritas-vis2 2994/tcp #VERITAS VIS2 +veritas-vis2 2994/udp #VERITAS VIS2 +idrs 2995/tcp #IDRS +idrs 2995/udp #IDRS +vsixml 2996/tcp #vsixml +vsixml 2996/udp #vsixml +rebol 2997/tcp #REBOL +rebol 2997/udp #REBOL +realsecure 2998/tcp #Real Secure +realsecure 2998/udp #Real Secure +remoteware-un 2999/tcp #RemoteWare Unassigned +remoteware-un 2999/udp #RemoteWare Unassigned +hbci 3000/tcp #HBCI +hbci 3000/udp #HBCI +remoteware-cl 3000/tcp #RemoteWare Client +remoteware-cl 3000/udp #RemoteWare Client +redwood-broker 3001/tcp #Redwood Broker +redwood-broker 3001/udp #Redwood Broker +exlm-agent 3002/tcp #EXLM Agent +exlm-agent 3002/udp #EXLM Agent +remoteware-srv 3002/tcp #RemoteWare Server +remoteware-srv 3002/udp #RemoteWare Server +cgms 3003/tcp #CGMS +cgms 3003/udp #CGMS +csoftragent 3004/tcp #Csoft Agent +csoftragent 3004/udp #Csoft Agent +geniuslm 3005/tcp #Genius License Manager +geniuslm 3005/udp #Genius License Manager +ii-admin 3006/tcp #Instant Internet Admin +ii-admin 3006/udp #Instant Internet Admin +lotusmtap 3007/tcp #Lotus Mail Tracking Agent Protocol +lotusmtap 3007/udp #Lotus Mail Tracking Agent Protocol +midnight-tech 3008/tcp #Midnight Technologies +midnight-tech 3008/udp #Midnight Technologies +pxc-ntfy 3009/tcp #PXC-NTFY +pxc-ntfy 3009/udp #PXC-NTFY +gw 3010/tcp #Telerate Workstation +ping-pong 3010/udp #Telerate Workstation +trusted-web 3011/tcp #Trusted Web +trusted-web 3011/udp #Trusted Web +twsdss 3012/tcp #Trusted Web Client +twsdss 3012/udp #Trusted Web Client +gilatskysurfer 3013/tcp #Gilat Sky Surfer +gilatskysurfer 3013/udp #Gilat Sky Surfer +broker_service 3014/tcp #Broker Service +broker_service 3014/udp #Broker Service +nati-dstp 3015/tcp #NATI DSTP +nati-dstp 3015/udp #NATI DSTP +notify_srvr 3016/tcp #Notify Server +notify_srvr 3016/udp #Notify Server +event_listener 3017/tcp #Event Listener +event_listener 3017/udp #Event Listener +srvc_registry 3018/tcp #Service Registry +srvc_registry 3018/udp #Service Registry +resource_mgr 3019/tcp #Resource Manager +resource_mgr 3019/udp #Resource Manager +cifs 3020/tcp #CIFS +cifs 3020/udp #CIFS +agriserver 3021/tcp #AGRI Server +agriserver 3021/udp #AGRI Server +csregagent 3022/tcp #CSREGAGENT +csregagent 3022/udp #CSREGAGENT +magicnotes 3023/tcp #magicnotes +magicnotes 3023/udp #magicnotes +nds_sso 3024/tcp #NDS_SSO +nds_sso 3024/udp #NDS_SSO +arepa-raft 3025/tcp #Arepa Raft +arepa-raft 3025/udp #Arepa Raft +agri-gateway 3026/tcp #AGRI Gateway +agri-gateway 3026/udp #AGRI Gateway +arepa-cas 3030/tcp #Arepa Cas +arepa-cas 3030/udp #Arepa Cas +eppc 3031/tcp #Remote AppleEvents/PPC Toolbox +eppc 3031/udp #Remote AppleEvents/PPC Toolbox +redwood-chat 3032/tcp #Redwood Chat +redwood-chat 3032/udp #Redwood Chat +pdb 3033/tcp #PDB +pdb 3033/udp #PDB +osmosis-aeea 3034/tcp #Osmosis / Helix (R) AEEA Port +osmosis-aeea 3034/udp #Osmosis / Helix (R) AEEA Port +fjsv-gssagt 3035/tcp #FJSV gssagt +fjsv-gssagt 3035/udp #FJSV gssagt +hagel-dump 3036/tcp #Hagel DUMP +hagel-dump 3036/udp #Hagel DUMP +hp-san-mgmt 3037/tcp #HP SAN Mgmt +hp-san-mgmt 3037/udp #HP SAN Mgmt +santak-ups 3038/tcp #Santak UPS +santak-ups 3038/udp #Santak UPS +cogitate 3039/tcp #Cogitate, Inc. +cogitate 3039/udp #Cogitate, Inc. +tomato-springs 3040/tcp #Tomato Springs +tomato-springs 3040/udp #Tomato Springs +di-traceware 3041/tcp #di-traceware +di-traceware 3041/udp #di-traceware +journee 3042/tcp #journee +journee 3042/udp #journee +brp 3043/tcp #BRP +brp 3043/udp #BRP +epp 3044/tcp #EndPoint Protocol +epp 3044/udp #EndPoint Protocol +responsenet 3045/tcp #ResponseNet +responsenet 3045/udp #ResponseNet +di-ase 3046/tcp #di-ase +di-ase 3046/udp #di-ase +hlserver 3047/tcp #Fast Security HL Server +hlserver 3047/udp #Fast Security HL Server +pctrader 3048/tcp #Sierra Net PC Trader +pctrader 3048/udp #Sierra Net PC Trader +nsws 3049/tcp #NSWS +nsws 3049/udp #NSWS +gds_db 3050/tcp #gds_db +gds_db 3050/udp #gds_db +galaxy-server 3051/tcp #Galaxy Server +galaxy-server 3051/udp #Galaxy Server +apc-3052 3052/tcp #APC 3052 +apc-3052 3052/udp #APC 3052 +dsom-server 3053/tcp #dsom-server +dsom-server 3053/udp #dsom-server +amt-cnf-prot 3054/tcp #AMT CNF PROT +amt-cnf-prot 3054/udp #AMT CNF PROT +policyserver 3055/tcp #Policy Server +policyserver 3055/udp #Policy Server +cdl-server 3056/tcp #CDL Server +cdl-server 3056/udp #CDL Server +goahead-fldup 3057/tcp #GoAhead FldUp +goahead-fldup 3057/udp #GoAhead FldUp +videobeans 3058/tcp #videobeans +videobeans 3058/udp #videobeans +qsoft 3059/tcp #qsoft +qsoft 3059/udp #qsoft +interserver 3060/tcp #interserver +interserver 3060/udp #interserver +cautcpd 3061/tcp #cautcpd +cautcpd 3061/udp #cautcpd +ncacn-ip-tcp 3062/tcp #ncacn-ip-tcp +ncacn-ip-tcp 3062/udp #ncacn-ip-tcp +ncadg-ip-udp 3063/tcp #ncadg-ip-udp +ncadg-ip-udp 3063/udp #ncadg-ip-udp +rprt 3064/tcp #Remote Port Redirector +rprt 3064/udp #Remote Port Redirector +slinterbase 3065/tcp #slinterbase +slinterbase 3065/udp #slinterbase +netattachsdmp 3066/tcp #NETATTACHSDMP +netattachsdmp 3066/udp #NETATTACHSDMP +fjhpjp 3067/tcp #FJHPJP +fjhpjp 3067/udp #FJHPJP +ls3bcast 3068/tcp #ls3 Broadcast +ls3bcast 3068/udp #ls3 Broadcast +ls3 3069/tcp #ls3 +ls3 3069/udp #ls3 +mgxswitch 3070/tcp #MGXSWITCH +mgxswitch 3070/udp #MGXSWITCH +csd-mgmt-port 3071/tcp #ContinuStor Manager Port +csd-mgmt-port 3071/udp #ContinuStor Manager Port +csd-monitor 3072/tcp #ContinuStor Monitor Port +csd-monitor 3072/udp #ContinuStor Monitor Port +vcrp 3073/tcp #Very simple chatroom prot +vcrp 3073/udp #Very simple chatroom prot +xbox 3074/tcp #Xbox game port +xbox 3074/udp #Xbox game port +orbix-locator 3075/tcp #Orbix 2000 Locator +orbix-locator 3075/udp #Orbix 2000 Locator +orbix-config 3076/tcp #Orbix 2000 Config +orbix-config 3076/udp #Orbix 2000 Config +orbix-loc-ssl 3077/tcp #Orbix 2000 Locator SSL +orbix-loc-ssl 3077/udp #Orbix 2000 Locator SSL +orbix-cfg-ssl 3078/tcp #Orbix 2000 Locator SSL +orbix-cfg-ssl 3078/udp #Orbix 2000 Locator SSL +lv-frontpanel 3079/tcp #LV Front Panel +lv-frontpanel 3079/udp #LV Front Panel +stm_pproc 3080/tcp #stm_pproc +stm_pproc 3080/udp #stm_pproc +tl1-lv 3081/tcp #TL1-LV +tl1-lv 3081/udp #TL1-LV +tl1-raw 3082/tcp #TL1-RAW +tl1-raw 3082/udp #TL1-RAW +tl1-telnet 3083/tcp #TL1-TELNET +tl1-telnet 3083/udp #TL1-TELNET +itm-mccs 3084/tcp #ITM-MCCS +itm-mccs 3084/udp #ITM-MCCS +pcihreq 3085/tcp #PCIHReq +pcihreq 3085/udp #PCIHReq +jdl-dbkitchen 3086/tcp #JDL-DBKitchen +jdl-dbkitchen 3086/udp #JDL-DBKitchen +asoki-sma 3087/tcp #Asoki SMA +asoki-sma 3087/udp #Asoki SMA +xdtp 3088/tcp #eXtensible Data Transfer Protocol +xdtp 3088/udp #eXtensible Data Transfer Protocol +ptk-alink 3089/tcp #ParaTek Agent Linking +ptk-alink 3089/udp #ParaTek Agent Linking +rtss 3090/tcp #Rappore Session Services +rtss 3090/udp #Rappore Session Services +1ci-smcs 3091/tcp #1Ci Server Management +1ci-smcs 3091/udp #1Ci Server Management +njfss 3092/tcp #Netware sync services +njfss 3092/udp #Netware sync services +rapidmq-center 3093/tcp #Jiiva RapidMQ Center +rapidmq-center 3093/udp #Jiiva RapidMQ Center +rapidmq-reg 3094/tcp #Jiiva RapidMQ Registry +rapidmq-reg 3094/udp #Jiiva RapidMQ Registry +panasas 3095/tcp #Panasas rendevous port +panasas 3095/udp #Panasas rendevous port +ndl-aps 3096/tcp #Active Print Server Port +ndl-aps 3096/udp #Active Print Server Port +umm-port 3098/tcp #Universal Message Manager +umm-port 3098/udp #Universal Message Manager +chmd 3099/tcp #CHIPSY Machine Daemon +chmd 3099/udp #CHIPSY Machine Daemon +opcon-xps 3100/tcp #OpCon/xps +opcon-xps 3100/udp #OpCon/xps +hp-pxpib 3101/tcp #HP PolicyXpert PIB Server +hp-pxpib 3101/udp #HP PolicyXpert PIB Server +slslavemon 3102/tcp #SoftlinK Slave Mon Port +slslavemon 3102/udp #SoftlinK Slave Mon Port +autocuesmi 3103/tcp #Autocue SMI Protocol +autocuesmi 3103/udp #Autocue SMI Protocol +autocuelog 3104/tcp #Autocue Logger Protocol +autocuetime 3104/udp #Autocue Time Service +cardbox 3105/tcp #Cardbox +cardbox 3105/udp #Cardbox +cardbox-http 3106/tcp #Cardbox HTTP +cardbox-http 3106/udp #Cardbox HTTP +business 3107/tcp #Business protocol +business 3107/udp #Business protocol +geolocate 3108/tcp #Geolocate protocol +geolocate 3108/udp #Geolocate protocol +personnel 3109/tcp #Personnel protocol +personnel 3109/udp #Personnel protocol +sim-control 3110/tcp #simulator control port +sim-control 3110/udp #simulator control port +wsynch 3111/tcp #Web Synchronous Services +wsynch 3111/udp #Web Synchronous Services +ksysguard 3112/tcp #KDE System Guard +ksysguard 3112/udp #KDE System Guard +cs-auth-svr 3113/tcp #CS-Authenticate Svr Port +cs-auth-svr 3113/udp #CS-Authenticate Svr Port +ccmad 3114/tcp #CCM AutoDiscover +ccmad 3114/udp #CCM AutoDiscover +mctet-master 3115/tcp #MCTET Master +mctet-master 3115/udp #MCTET Master +mctet-gateway 3116/tcp #MCTET Gateway +mctet-gateway 3116/udp #MCTET Gateway +mctet-jserv 3117/tcp #MCTET Jserv +mctet-jserv 3117/udp #MCTET Jserv +pkagent 3118/tcp #PKAgent +pkagent 3118/udp #PKAgent +d2000kernel 3119/tcp #D2000 Kernel Port +d2000kernel 3119/udp #D2000 Kernel Port +d2000webserver 3120/tcp #D2000 Webserver Port +d2000webserver 3120/udp #D2000 Webserver Port +vtr-emulator 3122/tcp #MTI VTR Emulator port +vtr-emulator 3122/udp #MTI VTR Emulator port +edix 3123/tcp #EDI Translation Protocol +edix 3123/udp #EDI Translation Protocol +beacon-port 3124/tcp #Beacon Port +beacon-port 3124/udp #Beacon Port +a13-an 3125/tcp #A13-AN Interface +a13-an 3125/udp #A13-AN Interface +ms-dotnetster 3126/tcp #Microsoft .NETster Port +ms-dotnetster 3126/udp #Microsoft .NETster Port +ctx-bridge 3127/tcp #CTX Bridge Port +ctx-bridge 3127/udp #CTX Bridge Port +ndl-aas 3128/tcp #Active API Server Port +ndl-aas 3128/udp #Active API Server Port +netport-id 3129/tcp #NetPort Discovery Port +netport-id 3129/udp #NetPort Discovery Port +icpv2 3130/tcp #ICPv2 +icpv2 3130/udp #ICPv2 +netbookmark 3131/tcp #Net Book Mark +netbookmark 3131/udp #Net Book Mark +ms-rule-engine 3132/tcp #Microsoft Business Rule Engine Update Service +ms-rule-engine 3132/udp #Microsoft Business Rule Engine Update Service +prism-deploy 3133/tcp #Prism Deploy User Port +prism-deploy 3133/udp #Prism Deploy User Port +ecp 3134/tcp #Extensible Code Protocol +ecp 3134/udp #Extensible Code Protocol +peerbook-port 3135/tcp #PeerBook Port +peerbook-port 3135/udp #PeerBook Port +grubd 3136/tcp #Grub Server Port +grubd 3136/udp #Grub Server Port +rtnt-1 3137/tcp #rtnt-1 data packets +rtnt-1 3137/udp #rtnt-1 data packets +rtnt-2 3138/tcp #rtnt-2 data packets +rtnt-2 3138/udp #rtnt-2 data packets +incognitorv 3139/tcp #Incognito Rendez-Vous +incognitorv 3139/udp #Incognito Rendez-Vous +ariliamulti 3140/tcp #Arilia Multiplexor +ariliamulti 3140/udp #Arilia Multiplexor +vmodem 3141/tcp #VMODEM +vmodem 3141/udp #VMODEM +rdc-wh-eos 3142/tcp #RDC WH EOS +rdc-wh-eos 3142/udp #RDC WH EOS +seaview 3143/tcp #Sea View +seaview 3143/udp #Sea View +tarantella 3144/tcp #Tarantella +tarantella 3144/udp #Tarantella +csi-lfap 3145/tcp #CSI-LFAP +csi-lfap 3145/udp #CSI-LFAP +bears-02 3146/tcp #bears-02 +bears-02 3146/udp #bears-02 +rfio 3147/tcp #RFIO +rfio 3147/udp #RFIO +nm-game-admin 3148/tcp #NetMike Game Administrator +nm-game-admin 3148/udp #NetMike Game Administrator +nm-game-server 3149/tcp #NetMike Game Server +nm-game-server 3149/udp #NetMike Game Server +nm-asses-admin 3150/tcp #NetMike Assessor Administrator +nm-asses-admin 3150/udp #NetMike Assessor Administrator +nm-assessor 3151/tcp #NetMike Assessor +nm-assessor 3151/udp #NetMike Assessor +feitianrockey 3152/tcp #FeiTian Port +feitianrockey 3152/udp #FeiTian Port +s8-client-port 3153/tcp #S8Cargo Client Port +s8-client-port 3153/udp #S8Cargo Client Port +ccmrmi 3154/tcp #ON RMI Registry +ccmrmi 3154/udp #ON RMI Registry +jpegmpeg 3155/tcp #JpegMpeg Port +jpegmpeg 3155/udp #JpegMpeg Port +indura 3156/tcp #Indura Collector +indura 3156/udp #Indura Collector +e3consultants 3157/tcp #CCC Listener Port +e3consultants 3157/udp #CCC Listener Port +stvp 3158/tcp #SmashTV Protocol +stvp 3158/udp #SmashTV Protocol +navegaweb-port 3159/tcp #NavegaWeb Tarification +navegaweb-port 3159/udp #NavegaWeb Tarification +tip-app-server 3160/tcp #TIP Application Server +tip-app-server 3160/udp #TIP Application Server +doc1lm 3161/tcp #DOC1 License Manager +doc1lm 3161/udp #DOC1 License Manager +sflm 3162/tcp #SFLM +sflm 3162/udp #SFLM +res-sap 3163/tcp #RES-SAP +res-sap 3163/udp #RES-SAP +imprs 3164/tcp #IMPRS +imprs 3164/udp #IMPRS +newgenpay 3165/tcp #Newgenpay Engine Service +newgenpay 3165/udp #Newgenpay Engine Service +qrepos 3166/tcp #Quest Repository +qrepos 3166/udp #Quest Repository +poweroncontact 3167/tcp #poweroncontact +poweroncontact 3167/udp #poweroncontact +poweronnud 3168/tcp #poweronnud +poweronnud 3168/udp #poweronnud +serverview-as 3169/tcp #SERVERVIEW-AS +serverview-as 3169/udp #SERVERVIEW-AS +serverview-asn 3170/tcp #SERVERVIEW-ASN +serverview-asn 3170/udp #SERVERVIEW-ASN +serverview-gf 3171/tcp #SERVERVIEW-GF +serverview-gf 3171/udp #SERVERVIEW-GF +serverview-rm 3172/tcp #SERVERVIEW-RM +serverview-rm 3172/udp #SERVERVIEW-RM +serverview-icc 3173/tcp #SERVERVIEW-ICC +serverview-icc 3173/udp #SERVERVIEW-ICC +armi-server 3174/tcp #ARMI Server +armi-server 3174/udp #ARMI Server +t1-e1-over-ip 3175/tcp #T1_E1_Over_IP +t1-e1-over-ip 3175/udp #T1_E1_Over_IP +ars-master 3176/tcp #ARS Master +ars-master 3176/udp #ARS Master +phonex-port 3177/tcp #Phonex Protocol +phonex-port 3177/udp #Phonex Protocol +radclientport 3178/tcp #Radiance UltraEdge Port +radclientport 3178/udp #Radiance UltraEdge Port +h2gf-w-2m 3179/tcp #H2GF W.2m Handover prot. +h2gf-w-2m 3179/udp #H2GF W.2m Handover prot. +mc-brk-srv 3180/tcp #Millicent Broker Server +mc-brk-srv 3180/udp #Millicent Broker Server +bmcpatrolagent 3181/tcp #BMC Patrol Agent +bmcpatrolagent 3181/udp #BMC Patrol Agent +bmcpatrolrnvu 3182/tcp #BMC Patrol Rendezvous +bmcpatrolrnvu 3182/udp #BMC Patrol Rendezvous +cops-tls 3183/tcp #COPS/TLS +cops-tls 3183/udp #COPS/TLS +apogeex-port 3184/tcp #ApogeeX Port +apogeex-port 3184/udp #ApogeeX Port +smpppd 3185/tcp #SuSE Meta PPPD +smpppd 3185/udp #SuSE Meta PPPD +iiw-port 3186/tcp #IIW Monitor User Port +iiw-port 3186/udp #IIW Monitor User Port +odi-port 3187/tcp #Open Design Listen Port +odi-port 3187/udp #Open Design Listen Port +brcm-comm-port 3188/tcp #Broadcom Port +brcm-comm-port 3188/udp #Broadcom Port +pcle-infex 3189/tcp #Pinnacle Sys InfEx Port +pcle-infex 3189/udp #Pinnacle Sys InfEx Port +csvr-proxy 3190/tcp #ConServR Proxy +csvr-proxy 3190/udp #ConServR Proxy +csvr-sslproxy 3191/tcp #ConServR SSL Proxy +csvr-sslproxy 3191/udp #ConServR SSL Proxy +firemonrcc 3192/tcp #FireMon Revision Control +firemonrcc 3192/udp #FireMon Revision Control +spandataport 3193/tcp #SpanDataPort +spandataport 3193/udp #SpanDataPort +magbind 3194/tcp #Rockstorm MAG protocol +magbind 3194/udp #Rockstorm MAG protocol +ncu-1 3195/tcp #Network Control Unit +ncu-1 3195/udp #Network Control Unit +ncu-2 3196/tcp #Network Control Unit +ncu-2 3196/udp #Network Control Unit +embrace-dp-s 3197/tcp #Embrace Device Protocol Server +embrace-dp-s 3197/udp #Embrace Device Protocol Server +embrace-dp-c 3198/tcp #Embrace Device Protocol Client +embrace-dp-c 3198/udp #Embrace Device Protocol Client +dmod-workspace 3199/tcp #DMOD WorkSpace +dmod-workspace 3199/udp #DMOD WorkSpace +tick-port 3200/tcp #Press-sense Tick Port +tick-port 3200/udp #Press-sense Tick Port +cpq-tasksmart 3201/tcp #CPQ-TaskSmart +cpq-tasksmart 3201/udp #CPQ-TaskSmart +intraintra 3202/tcp #IntraIntra +intraintra 3202/udp #IntraIntra +netwatcher-mon 3203/tcp #Network Watcher Monitor +netwatcher-mon 3203/udp #Network Watcher Monitor +netwatcher-db 3204/tcp #Network Watcher DB Access +netwatcher-db 3204/udp #Network Watcher DB Access +isns 3205/tcp #iSNS Server Port +isns 3205/udp #iSNS Server Port +ironmail 3206/tcp #IronMail POP Proxy +ironmail 3206/udp #IronMail POP Proxy +vx-auth-port 3207/tcp #Veritas Authentication Port +vx-auth-port 3207/udp #Veritas Authentication Port +pfu-prcallback 3208/tcp #PFU PR Callback +pfu-prcallback 3208/udp #PFU PR Callback +netwkpathengine 3209/tcp #HP OpenView Network Path Engine Server +netwkpathengine 3209/udp #HP OpenView Network Path Engine Server +flamenco-proxy 3210/tcp #Flamenco Networks Proxy +flamenco-proxy 3210/udp #Flamenco Networks Proxy +avsecuremgmt 3211/tcp #Avocent Secure Management +avsecuremgmt 3211/udp #Avocent Secure Management +surveyinst 3212/tcp #Survey Instrument +surveyinst 3212/udp #Survey Instrument +neon24x7 3213/tcp #NEON 24X7 Mission Control +neon24x7 3213/udp #NEON 24X7 Mission Control +jmq-daemon-1 3214/tcp #JMQ Daemon Port 1 +jmq-daemon-1 3214/udp #JMQ Daemon Port 1 +jmq-daemon-2 3215/tcp #JMQ Daemon Port 2 +jmq-daemon-2 3215/udp #JMQ Daemon Port 2 +ferrari-foam 3216/tcp #Ferrari electronic FOAM +ferrari-foam 3216/udp #Ferrari electronic FOAM +unite 3217/tcp #Unified IP & Telecomm Env +unite 3217/udp #Unified IP & Telecomm Env +smartpackets 3218/tcp #EMC SmartPackets +smartpackets 3218/udp #EMC SmartPackets +wms-messenger 3219/tcp #WMS Messenger +wms-messenger 3219/udp #WMS Messenger +xnm-ssl 3220/tcp #XML NM over SSL +xnm-ssl 3220/udp #XML NM over SSL +xnm-clear-text 3221/tcp #XML NM over TCP +xnm-clear-text 3221/udp #XML NM over TCP +glbp 3222/tcp #Gateway Load Balancing Pr +glbp 3222/udp #Gateway Load Balancing Pr +digivote 3223/tcp #DIGIVOTE (R) Vote-Server +digivote 3223/udp #DIGIVOTE (R) Vote-Server +aes-discovery 3224/tcp #AES Discovery Port +aes-discovery 3224/udp #AES Discovery Port +fcip-port 3225/tcp #FCIP +fcip-port 3225/udp #FCIP +isi-irp 3226/tcp #ISI Industry Software IRP +isi-irp 3226/udp #ISI Industry Software IRP +dwnmshttp 3227/tcp #DiamondWave NMS Server +dwnmshttp 3227/udp #DiamondWave NMS Server +dwmsgserver 3228/tcp #DiamondWave MSG Server +dwmsgserver 3228/udp #DiamondWave MSG Server +global-cd-port 3229/tcp #Global CD Port +global-cd-port 3229/udp #Global CD Port +sftdst-port 3230/tcp #Software Distributor Port +sftdst-port 3230/udp #Software Distributor Port +dsnl 3231/tcp #Delta Solutions Direct +dsnl 3231/udp #Delta Solutions Direct +mdtp 3232/tcp #MDT port +mdtp 3232/udp #MDT port +whisker 3233/tcp #WhiskerControl main port +whisker 3233/udp #WhiskerControl main port +alchemy 3234/tcp #Alchemy Server +alchemy 3234/udp #Alchemy Server +mdap-port 3235/tcp #MDAP port +mdap-port 3235/udp #MDAP Port +apparenet-ts 3236/tcp #appareNet Test Server +apparenet-ts 3236/udp #appareNet Test Server +apparenet-tps 3237/tcp #appareNet Test Packet Sequencer +apparenet-tps 3237/udp #appareNet Test Packet Sequencer +apparenet-as 3238/tcp #appareNet Analysis Server +apparenet-as 3238/udp #appareNet Analysis Server +apparenet-ui 3239/tcp #appareNet User Interface +apparenet-ui 3239/udp #appareNet User Interface +triomotion 3240/tcp #Trio Motion Control Port +triomotion 3240/udp #Trio Motion Control Port +sysorb 3241/tcp #SysOrb Monitoring Server +sysorb 3241/udp #SysOrb Monitoring Server +sdp-id-port 3242/tcp #Session Description ID +sdp-id-port 3242/udp #Session Description ID +timelot 3243/tcp #Timelot Port +timelot 3243/udp #Timelot Port +onesaf 3244/tcp #OneSAF +onesaf 3244/udp #OneSAF +vieo-fe 3245/tcp #VIEO Fabric Executive +vieo-fe 3245/udp #VIEO Fabric Executive +dvt-system 3246/tcp #DVT SYSTEM PORT +dvt-system 3246/udp #DVT SYSTEM PORT +dvt-data 3247/tcp #DVT DATA LINK +dvt-data 3247/udp #DVT DATA LINK +procos-lm 3248/tcp #PROCOS LM +procos-lm 3248/udp #PROCOS LM +ssp 3249/tcp #State Sync Protocol +ssp 3249/udp #State Sync Protocol +hicp 3250/tcp #HMS hicp port +hicp 3250/udp #HMS hicp port +sysscanner 3251/tcp #Sys Scanner +sysscanner 3251/udp #Sys Scanner +dhe 3252/tcp #DHE port +dhe 3252/udp #DHE port +pda-data 3253/tcp #PDA Data +pda-data 3253/udp #PDA Data +pda-sys 3254/tcp #PDA System +pda-sys 3254/udp #PDA System +semaphore 3255/tcp #Semaphore Connection Port +semaphore 3255/udp #Semaphore Connection Port +cpqrpm-agent 3256/tcp #Compaq RPM Agent Port +cpqrpm-agent 3256/udp #Compaq RPM Agent Port +cpqrpm-server 3257/tcp #Compaq RPM Server Port +cpqrpm-server 3257/udp #Compaq RPM Server Port +ivecon-port 3258/tcp #Ivecon Server Port +ivecon-port 3258/udp #Ivecon Server Port +epncdp2 3259/tcp #Epson Network Common Devi +epncdp2 3259/udp #Epson Network Common Devi +iscsi-target 3260/tcp #iSCSI port +iscsi-target 3260/udp #iSCSI port +winshadow 3261/tcp #winShadow +winshadow 3261/udp #winShadow +necp 3262/tcp #NECP +necp 3262/udp #NECP +ecolor-imager 3263/tcp #E-Color Enterprise Imager +ecolor-imager 3263/udp #E-Color Enterprise Imager +ccmail 3264/tcp #cc:mail/lotus +ccmail 3264/udp #cc:mail/lotus +altav-tunnel 3265/tcp #Altav Tunnel +altav-tunnel 3265/udp #Altav Tunnel +ns-cfg-server 3266/tcp #NS CFG Server +ns-cfg-server 3266/udp #NS CFG Server +ibm-dial-out 3267/tcp #IBM Dial Out +ibm-dial-out 3267/udp #IBM Dial Out +msft-gc 3268/tcp #Microsoft Global Catalog +msft-gc 3268/udp #Microsoft Global Catalog +msft-gc-ssl 3269/tcp #Microsoft Global Catalog with LDAP/SSL +msft-gc-ssl 3269/udp #Microsoft Global Catalog with LDAP/SSL +verismart 3270/tcp #Verismart +verismart 3270/udp #Verismart +csoft-prev 3271/tcp #CSoft Prev Port +csoft-prev 3271/udp #CSoft Prev Port +user-manager 3272/tcp #Fujitsu User Manager +user-manager 3272/udp #Fujitsu User Manager +sxmp 3273/tcp #Simple Extensible Multiplexed Protocol +sxmp 3273/udp #Simple Extensible Multiplexed Protocol +ordinox-server 3274/tcp #Ordinox Server +ordinox-server 3274/udp #Ordinox Server +samd 3275/tcp #SAMD +samd 3275/udp #SAMD +maxim-asics 3276/tcp #Maxim ASICs +maxim-asics 3276/udp #Maxim ASICs +awg-proxy 3277/tcp #AWG Proxy +awg-proxy 3277/udp #AWG Proxy +lkcmserver 3278/tcp #LKCM Server +lkcmserver 3278/udp #LKCM Server +admind 3279/tcp #admind +admind 3279/udp #admind +vs-server 3280/tcp #VS Server +vs-server 3280/udp #VS Server +sysopt 3281/tcp #SYSOPT +sysopt 3281/udp #SYSOPT +datusorb 3282/tcp #Datusorb +datusorb 3282/udp #Datusorb +net-assistant 3283/tcp #Net Assistant +net-assistant 3283/udp #Net Assistant +4talk 3284/tcp #4Talk +4talk 3284/udp #4Talk +plato 3285/tcp #Plato +plato 3285/udp #Plato +e-net 3286/tcp #E-Net +e-net 3286/udp #E-Net +directvdata 3287/tcp #DIRECTVDATA +directvdata 3287/udp #DIRECTVDATA +cops 3288/tcp #COPS +cops 3288/udp #COPS +enpc 3289/tcp #ENPC +enpc 3289/udp #ENPC +caps-lm 3290/tcp #CAPS LOGISTICS TOOLKIT - LM +caps-lm 3290/udp #CAPS LOGISTICS TOOLKIT - LM +sah-lm 3291/tcp #S A Holditch & Associates - LM +sah-lm 3291/udp #S A Holditch & Associates - LM +cart-o-rama 3292/tcp #Cart O Rama +cart-o-rama 3292/udp #Cart O Rama +fg-fps 3293/tcp #fg-fps +fg-fps 3293/udp #fg-fps +fg-gip 3294/tcp #fg-gip +fg-gip 3294/udp #fg-gip +dyniplookup 3295/tcp #Dynamic IP Lookup +dyniplookup 3295/udp #Dynamic IP Lookup +rib-slm 3296/tcp #Rib License Manager +rib-slm 3296/udp #Rib License Manager +cytel-lm 3297/tcp #Cytel License Manager +cytel-lm 3297/udp #Cytel License Manager +deskview 3298/tcp #DeskView +deskview 3298/udp #DeskView +pdrncs 3299/tcp #pdrncs +pdrncs 3299/udp #pdrncs +mcs-fastmail 3302/tcp #MCS Fastmail +mcs-fastmail 3302/udp #MCS Fastmail +opsession-clnt 3303/tcp #OP Session Client +opsession-clnt 3303/udp #OP Session Client +opsession-srvr 3304/tcp #OP Session Server +opsession-srvr 3304/udp #OP Session Server +odette-ftp 3305/tcp #ODETTE-FTP +odette-ftp 3305/udp #ODETTE-FTP +mysql 3306/tcp #MySQL +mysql 3306/udp #MySQL +opsession-prxy 3307/tcp #OP Session Proxy +opsession-prxy 3307/udp #OP Session Proxy +tns-server 3308/tcp #TNS Server +tns-server 3308/udp #TNS Server +tns-adv 3309/tcp #TNS ADV +tns-adv 3309/udp #TNS ADV +dyna-access 3310/tcp #Dyna Access +dyna-access 3310/udp #Dyna Access +mcns-tel-ret 3311/tcp #MCNS Tel Ret +mcns-tel-ret 3311/udp #MCNS Tel Ret +appman-server 3312/tcp #Application Management Server +appman-server 3312/udp #Application Management Server +uorb 3313/tcp #Unify Object Broker +uorb 3313/udp #Unify Object Broker +uohost 3314/tcp #Unify Object Host +uohost 3314/udp #Unify Object Host +cdid 3315/tcp #CDID +cdid 3315/udp #CDID +aicc-cmi 3316/tcp #AICC/CMI +aicc-cmi 3316/udp #AICC/CMI +vsaiport 3317/tcp #VSAI PORT +vsaiport 3317/udp #VSAI PORT +ssrip 3318/tcp #Swith to Swith Routing Information Protocol +ssrip 3318/udp #Swith to Swith Routing Information Protocol +sdt-lmd 3319/tcp #SDT License Manager +sdt-lmd 3319/udp #SDT License Manager +officelink2000 3320/tcp #Office Link 2000 +officelink2000 3320/udp #Office Link 2000 +vnsstr 3321/tcp #VNSSTR +vnsstr 3321/udp #VNSSTR +sftu 3326/tcp #SFTU +sftu 3326/udp #SFTU +bbars 3327/tcp #BBARS +bbars 3327/udp #BBARS +egptlm 3328/tcp #Eaglepoint License Manager +egptlm 3328/udp #Eaglepoint License Manager +hp-device-disc 3329/tcp #HP Device Disc +hp-device-disc 3329/udp #HP Device Disc +mcs-calypsoicf 3330/tcp #MCS Calypso ICF +mcs-calypsoicf 3330/udp #MCS Calypso ICF +mcs-messaging 3331/tcp #MCS Messaging +mcs-messaging 3331/udp #MCS Messaging +mcs-mailsvr 3332/tcp #MCS Mail Server +mcs-mailsvr 3332/udp #MCS Mail Server +dec-notes 3333/tcp #DEC Notes +dec-notes 3333/udp #DEC Notes +directv-web 3334/tcp #Direct TV Webcasting +directv-web 3334/udp #Direct TV Webcasting +directv-soft 3335/tcp #Direct TV Software Updates +directv-soft 3335/udp #Direct TV Software Updates +directv-tick 3336/tcp #Direct TV Tickers +directv-tick 3336/udp #Direct TV Tickers +directv-catlg 3337/tcp #Direct TV Data Catalog +directv-catlg 3337/udp #Direct TV Data Catalog +anet-b 3338/tcp #OMF data b +anet-b 3338/udp #OMF data b +anet-l 3339/tcp #OMF data l +anet-l 3339/udp #OMF data l +anet-m 3340/tcp #OMF data m +anet-m 3340/udp #OMF data m +anet-h 3341/tcp #OMF data h +anet-h 3341/udp #OMF data h +webtie 3342/tcp #WebTIE +webtie 3342/udp #WebTIE +ms-cluster-net 3343/tcp #MS Cluster Net +ms-cluster-net 3343/udp #MS Cluster Net +bnt-manager 3344/tcp #BNT Manager +bnt-manager 3344/udp #BNT Manager +influence 3345/tcp #Influence +influence 3345/udp #Influence +trnsprntproxy 3346/tcp #Trnsprnt Proxy +trnsprntproxy 3346/udp #Trnsprnt Proxy +phoenix-rpc 3347/tcp #Phoenix RPC +phoenix-rpc 3347/udp #Phoenix RPC +pangolin-laser 3348/tcp #Pangolin Laser +pangolin-laser 3348/udp #Pangolin Laser +chevinservices 3349/tcp #Chevin Services +chevinservices 3349/udp #Chevin Services +findviatv 3350/tcp #FINDVIATV +findviatv 3350/udp #FINDVIATV +btrieve 3351/tcp #Btrieve port +btrieve 3351/udp #Btrieve port +ssql 3352/tcp #Scalable SQL +ssql 3352/udp #Scalable SQL +fatpipe 3353/tcp #FATPIPE +fatpipe 3353/udp #FATPIPE +suitjd 3354/tcp #SUITJD +suitjd 3354/udp #SUITJD +ordinox-dbase 3355/tcp #Ordinox Dbase +ordinox-dbase 3355/udp #Ordinox Dbase +upnotifyps 3356/tcp #UPNOTIFYPS +upnotifyps 3356/udp #UPNOTIFYPS +adtech-test 3357/tcp #Adtech Test IP +adtech-test 3357/udp #Adtech Test IP +mpsysrmsvr 3358/tcp #Mp Sys Rmsvr +mpsysrmsvr 3358/udp #Mp Sys Rmsvr +wg-netforce 3359/tcp #WG NetForce +wg-netforce 3359/udp #WG NetForce +kv-server 3360/tcp #KV Server +kv-server 3360/udp #KV Server +kv-agent 3361/tcp #KV Agent +kv-agent 3361/udp #KV Agent +dj-ilm 3362/tcp #DJ ILM +dj-ilm 3362/udp #DJ ILM +nati-vi-server 3363/tcp #NATI Vi Server +nati-vi-server 3363/udp #NATI Vi Server +creativeserver 3364/tcp #Creative Server +creativeserver 3364/udp #Creative Server +contentserver 3365/tcp #Content Server +contentserver 3365/udp #Content Server +creativepartnr 3366/tcp #Creative Partner +creativepartnr 3366/udp #Creative Partner +tip2 3372/tcp #TIP 2 +tip2 3372/udp #TIP 2 +lavenir-lm 3373/tcp #Lavenir License Manager +lavenir-lm 3373/udp #Lavenir License Manager +cluster-disc 3374/tcp #Cluster Disc +cluster-disc 3374/udp #Cluster Disc +vsnm-agent 3375/tcp #VSNM Agent +vsnm-agent 3375/udp #VSNM Agent +cdbroker 3376/tcp #CD Broker +cdbroker 3376/udp #CD Broker +cogsys-lm 3377/tcp #Cogsys Network License Manager +cogsys-lm 3377/udp #Cogsys Network License Manager +wsicopy 3378/tcp #WSICOPY +wsicopy 3378/udp #WSICOPY +socorfs 3379/tcp #SOCORFS +socorfs 3379/udp #SOCORFS +sns-channels 3380/tcp #SNS Channels +sns-channels 3380/udp #SNS Channels +geneous 3381/tcp #Geneous +geneous 3381/udp #Geneous +fujitsu-neat 3382/tcp #Fujitsu Network Enhanced Antitheft function +fujitsu-neat 3382/udp #Fujitsu Network Enhanced Antitheft function +esp-lm 3383/tcp #Enterprise Software Products License Manager +esp-lm 3383/udp #Enterprise Software Products License Manager +hp-clic 3384/tcp #Cluster Management Services +hp-clic 3384/udp #Hardware Management +qnxnetman 3385/tcp #qnxnetman +qnxnetman 3385/udp #qnxnetman +gprs-data 3386/tcp #GPRS Data +gprs-sig 3386/udp #GPRS SIG +backroomnet 3387/tcp #Back Room Net +backroomnet 3387/udp #Back Room Net +cbserver 3388/tcp #CB Server +cbserver 3388/udp #CB Server +ms-wbt-server 3389/tcp #MS WBT Server +ms-wbt-server 3389/udp #MS WBT Server +dsc 3390/tcp #Distributed Service Coordinator +dsc 3390/udp #Distributed Service Coordinator +savant 3391/tcp #SAVANT +savant 3391/udp #SAVANT +efi-lm 3392/tcp #EFI License Management +efi-lm 3392/udp #EFI License Management +d2k-tapestry1 3393/tcp #D2K Tapestry Client to Server +d2k-tapestry1 3393/udp #D2K Tapestry Client to Server +d2k-tapestry2 3394/tcp #D2K Tapestry Server to Server +d2k-tapestry2 3394/udp #D2K Tapestry Server to Server +dyna-lm 3395/tcp #Dyna License Manager (Elam) +dyna-lm 3395/udp #Dyna License Manager (Elam) +printer_agent 3396/tcp #Printer Agent +printer_agent 3396/udp #Printer Agent +cloanto-lm 3397/tcp #Cloanto License Manager +cloanto-lm 3397/udp #Cloanto License Manager +mercantile 3398/tcp #Mercantile +mercantile 3398/udp #Mercantile +csms 3399/tcp #CSMS +csms 3399/udp #CSMS +csms2 3400/tcp #CSMS2 +csms2 3400/udp #CSMS2 +filecast 3401/tcp #filecast +filecast 3401/udp #filecast +fxaengine-net 3402/tcp #FXa Engine Network Port +fxaengine-net 3402/udp #FXa Engine Network Port +copysnap 3403/tcp #CopySnap Server Port +copysnap 3403/udp #CopySnap Server Port +nokia-ann-ch1 3405/tcp #Nokia Announcement ch 1 +nokia-ann-ch1 3405/udp #Nokia Announcement ch 1 +nokia-ann-ch2 3406/tcp #Nokia Announcement ch 2 +nokia-ann-ch2 3406/udp #Nokia Announcement ch 2 +ldap-admin 3407/tcp #LDAP admin server port +ldap-admin 3407/udp #LDAP admin server port +issapi 3408/tcp #POWERpack API Port +issapi 3408/udp #POWERpack API Port +networklens 3409/tcp #NetworkLens Event Port +networklens 3409/udp #NetworkLens Event Port +networklenss 3410/tcp #NetworkLens SSL Event +networklenss 3410/udp #NetworkLens SSL Event +biolink-auth 3411/tcp #BioLink Authenteon server +biolink-auth 3411/udp #BioLink Authenteon server +xmlblaster 3412/tcp #xmlBlaster +xmlblaster 3412/udp #xmlBlaster +svnet 3413/tcp #SpecView Networking +svnet 3413/udp #SpecView Networking +wip-port 3414/tcp #BroadCloud WIP Port +wip-port 3414/udp #BroadCloud WIP Port +bcinameservice 3415/tcp #BCI Name Service +bcinameservice 3415/udp #BCI Name Service +commandport 3416/tcp #AirMobile IS Command Port +commandport 3416/udp #AirMobile IS Command Port +csvr 3417/tcp #ConServR file translation +csvr 3417/udp #ConServR file translation +rnmap 3418/tcp #Remote nmap +rnmap 3418/udp #Remote nmap +softaudit 3419/tcp #Isogon SoftAudit +softaudit 3419/udp #ISogon SoftAudit +ifcp-port 3420/tcp #iFCP User Port +ifcp-port 3420/udp #iFCP User Port +bmap 3421/tcp #Bull Apprise portmapper +bmap 3421/udp #Bull Apprise portmapper +rusb-sys-port 3422/tcp #Remote USB System Port +rusb-sys-port 3422/udp #Remote USB System Port +xtrm 3423/tcp #xTrade Reliable Messaging +xtrm 3423/udp #xTrade Reliable Messaging +xtrms 3424/tcp #xTrade over TLS/SSL +xtrms 3424/udp #xTrade over TLS/SSL +agps-port 3425/tcp #AGPS Access Port +agps-port 3425/udp #AGPS Access Port +arkivio 3426/tcp #Arkivio Storage Protocol +arkivio 3426/udp #Arkivio Storage Protocol +websphere-snmp 3427/tcp #WebSphere SNMP +websphere-snmp 3427/udp #WebSphere SNMP +twcss 3428/tcp #2Wire CSS +twcss 3428/udp #2Wire CSS +gcsp 3429/tcp #GCSP user port +gcsp 3429/udp #GCSP user port +ssdispatch 3430/tcp #Scott Studios Dispatch +ssdispatch 3430/udp #Scott Studios Dispatch +ndl-als 3431/tcp #Active License Server Port +ndl-als 3431/udp #Active License Server Port +osdcp 3432/tcp #Secure Device Protocol +osdcp 3432/udp #Secure Device Protocol +alta-smp 3433/tcp #Altaworks Service Management Platform +alta-smp 3433/udp #Altaworks Service Management Platform +opencm 3434/tcp #OpenCM Server +opencm 3434/udp #OpenCM Server +pacom 3435/tcp #Pacom Security User Port +pacom 3435/udp #Pacom Security User Port +gc-config 3436/tcp #GuardControl Exchange Protocol +gc-config 3436/udp #GuardControl Exchange Protocol +autocueds 3437/tcp #Autocue Directory Service +autocueds 3437/udp #Autocue Directory Service +spiral-admin 3438/tcp #Spiralcraft Admin +spiral-admin 3438/udp #Spiralcraft Admin +hri-port 3439/tcp #HRI Interface Port +hri-port 3439/udp #HRI Interface Port +ans-console 3440/tcp #Net Steward Mgmt Console +ans-console 3440/udp #Net Steward Mgmt Console +connect-client 3441/tcp #OC Connect Client +connect-client 3441/udp #OC Connect Client +connect-server 3442/tcp #OC Connect Server +connect-server 3442/udp #OC Connect Server +ov-nnm-websrv 3443/tcp #OpenView Network Node Manager WEB Server +ov-nnm-websrv 3443/udp #OpenView Network Node Manager WEB Server +denali-server 3444/tcp #Denali Server +denali-server 3444/udp #Denali Server +monp 3445/tcp #Media Object Network +monp 3445/udp #Media Object Network +3comfaxrpc 3446/tcp #3Com FAX RPC port +3comfaxrpc 3446/udp #3Com FAX RPC port +cddn 3447/tcp #CompuDuo DirectNet +cddn 3447/udp #CompuDuo DirectNet +dnc-port 3448/tcp #Discovery and Net Config +dnc-port 3448/udp #Discovery and Net Config +hotu-chat 3449/tcp #HotU Chat +hotu-chat 3449/udp #HotU Chat +castorproxy 3450/tcp #CAStorProxy +castorproxy 3450/udp #CAStorProxy +asam 3451/tcp #ASAM Services +asam 3451/udp #ASAM Services +sabp-signal 3452/tcp #SABP-Signalling Protocol +sabp-signal 3452/udp #SABP-Signalling Protocol +pscupd 3453/tcp #PSC Update Port +pscupd 3453/udp #PSC Update Port +mira 3454/tcp #Apple Remote Access Protocol +prsvp 3455/tcp #RSVP Port +prsvp 3455/udp #RSVP Port +vat 3456/tcp #VAT default data +vat 3456/udp #VAT default data +vat-control 3457/tcp #VAT default control +vat-control 3457/udp #VAT default control +d3winosfi 3458/tcp #D3WinOSFI +d3winosfi 3458/udp #D3WinOSFI +integral 3459/tcp #TIP Integral +integral 3459/udp #TIP Integral +edm-manager 3460/tcp #EDM Manger +edm-manager 3460/udp #EDM Manger +edm-stager 3461/tcp #EDM Stager +edm-stager 3461/udp #EDM Stager +edm-std-notify 3462/tcp #EDM STD Notify +edm-std-notify 3462/udp #EDM STD Notify +edm-adm-notify 3463/tcp #EDM ADM Notify +edm-adm-notify 3463/udp #EDM ADM Notify +edm-mgr-sync 3464/tcp #EDM MGR Sync +edm-mgr-sync 3464/udp #EDM MGR Sync +edm-mgr-cntrl 3465/tcp #EDM MGR Cntrl +edm-mgr-cntrl 3465/udp #EDM MGR Cntrl +workflow 3466/tcp #WORKFLOW +workflow 3466/udp #WORKFLOW +rcst 3467/tcp #RCST +rcst 3467/udp #RCST +ttcmremotectrl 3468/tcp #TTCM Remote Controll +ttcmremotectrl 3468/udp #TTCM Remote Controll +pluribus 3469/tcp #Pluribus +pluribus 3469/udp #Pluribus +jt400 3470/tcp #jt400 +jt400 3470/udp #jt400 +jt400-ssl 3471/tcp #jt400-ssl +jt400-ssl 3471/udp #jt400-ssl +jaugsremotec-1 3472/tcp #JAUGS N-G Remotec 1 +jaugsremotec-1 3472/udp #JAUGS N-G Remotec 1 +jaugsremotec-2 3473/tcp #JAUGS N-G Remotec 2 +jaugsremotec-2 3473/udp #JAUGS N-G Remotec 2 +ttntspauto 3474/tcp #TSP Automation +ttntspauto 3474/udp #TSP Automation +genisar-port 3475/tcp #Genisar Comm Port +genisar-port 3475/udp #Genisar Comm Port +nppmp 3476/tcp #NVIDIA Mgmt Protocol +nppmp 3476/udp #NVIDIA Mgmt Protocol +ecomm 3477/tcp #eComm link port +ecomm 3477/udp #eComm link port +nat-stun-port 3478/tcp #Simple Traversal of UDP Through NAT (STUN) port +nat-stun-port 3478/udp #Simple Traversal of UDP Through NAT (STUN) port +twrpc 3479/tcp #2Wire RPC +twrpc 3479/udp #2Wire RPC +plethora 3480/tcp #Secure Virtual Workspace +plethora 3480/udp #Secure Virtual Workspace +cleanerliverc 3481/tcp #CleanerLive remote ctrl +cleanerliverc 3481/udp #CleanerLive remote ctrl +vulture 3482/tcp #Vulture Monitoring System +vulture 3482/udp #Vulture Monitoring System +slim-devices 3483/tcp #Slim Devices Protocol +slim-devices 3483/udp #Slim Devices Protocol +gbs-stp 3484/tcp #GBS SnapTalk Protocol +gbs-stp 3484/udp #GBS SnapTalk Protocol +celatalk 3485/tcp #CelaTalk +celatalk 3485/udp #CelaTalk +ifsf-hb-port 3486/tcp #IFSF Heartbeat Port +ifsf-hb-port 3486/udp #IFSF Heartbeat Port +ltctcp 3487/tcp #LISA TCP Transfer Channel +ltcudp 3487/udp #LISA UDP Transfer Channel +fs-rh-srv 3488/tcp #FS Remote Host Server +fs-rh-srv 3488/udp #FS Remote Host Server +dtp-dia 3489/tcp #DTP/DIA +dtp-dia 3489/udp #DTP/DIA +colubris 3490/tcp #Colubris Management Port +colubris 3490/udp #Colubris Management Port +swr-port 3491/tcp #SWR Port +swr-port 3491/udp #SWR Port +tvdumtray-port 3492/tcp #TVDUM Tray Port +tvdumtray-port 3492/udp #TVDUM Tray Port +nut 3493/tcp #Network UPS Tools +nut 3493/udp #Network UPS Tools +ibm3494 3494/tcp #IBM 3494 +ibm3494 3494/udp #IBM 3494 +seclayer-tcp 3495/tcp #securitylayer over tcp +seclayer-tcp 3495/udp #securitylayer over tcp +seclayer-tls 3496/tcp #securitylayer over tls +seclayer-tls 3496/udp #securitylayer over tls +ipether232port 3497/tcp #ipEther232Port +ipether232port 3497/udp #ipEther232Port +dashpas-port 3498/tcp #DASHPAS user port +dashpas-port 3498/udp #DASHPAS user port +sccip-media 3499/tcp #SccIP Media +sccip-media 3499/udp #SccIP Media +rtmp-port 3500/tcp #RTMP Port +rtmp-port 3500/udp #RTMP Port +isoft-p2p 3501/tcp #iSoft-P2P +isoft-p2p 3501/udp #iSoft-P2P +avinstalldisc 3502/tcp #Avocent Install Discovery +avinstalldisc 3502/udp #Avocent Install Discovery +lsp-ping 3503/tcp #MPLS LSP-echo Port +lsp-ping 3503/udp #MPLS LSP-echo Port +ironstorm 3504/tcp #IronStorm game server +ironstorm 3504/udp #IronStorm game server +ccmcomm 3505/tcp #CCM communications port +ccmcomm 3505/udp #CCM communications port +apc-3506 3506/tcp #APC 3506 +apc-3506 3506/udp #APC 3506 +nesh-broker 3507/tcp #Nesh Broker Port +nesh-broker 3507/udp #Nesh Broker Port +interactionweb 3508/tcp #Interaction Web +interactionweb 3508/udp #Interaction Web +vt-ssl 3509/tcp #Virtual Token SSL Port +vt-ssl 3509/udp #Virtual Token SSL Port +xss-port 3510/tcp #XSS Port +xss-port 3510/udp #XSS Port +webmail-2 3511/tcp #WebMail/2 +webmail-2 3511/udp #WebMail/2 +aztec 3512/tcp #Aztec Distribution Port +aztec 3512/udp #Aztec Distribution Port +arcpd 3513/tcp #Adaptec Remote Protocol +arcpd 3513/udp #Adaptec Remote Protocol +must-p2p 3514/tcp #MUST Peer to Peer +must-p2p 3514/udp #MUST Peer to Peer +must-backplane 3515/tcp #MUST Backplane +must-backplane 3515/udp #MUST Backplane +smartcard-port 3516/tcp #Smartcard Port +smartcard-port 3516/udp #Smartcard Port +802-11-iapp 3517/tcp #IEEE 802.11 WLANs WG IAPP +802-11-iapp 3517/udp #IEEE 802.11 WLANs WG IAPP +artifact-msg 3518/tcp #Artifact Message Server +artifact-msg 3518/udp #Artifact Message Server +nvmsgd 3519/tcp #Netvion Messenger Port +galileo 3519/udp #Netvion Galileo Port +galileolog 3520/tcp #Netvion Galileo Log Port +galileolog 3520/udp #Netvion Galileo Log Port +mc3ss 3521/tcp #Telequip Labs MC3SS +mc3ss 3521/udp #Telequip Labs MC3SS +nssocketport 3522/tcp #DO over NSSocketPort +nssocketport 3522/udp #DO over NSSocketPort +odeumservlink 3523/tcp #Odeum Serverlink +odeumservlink 3523/udp #Odeum Serverlink +ecmport 3524/tcp #ECM Server port +ecmport 3524/udp #ECM Server port +eisport 3525/tcp #EIS Server port +eisport 3525/udp #EIS Server port +starquiz-port 3526/tcp #starQuiz Port +starquiz-port 3526/udp #starQuiz Port +beserver-msg-q 3527/tcp #VERITAS Backup Exec Server +beserver-msg-q 3527/udp #VERITAS Backup Exec Server +jboss-iiop 3528/tcp #JBoss IIOP +jboss-iiop 3528/udp #JBoss IIOP +jboss-iiop-ssl 3529/tcp #JBoss IIOP/SSL +jboss-iiop-ssl 3529/udp #JBoss IIOP/SSL +gf 3530/tcp #Grid Friendly +gf 3530/udp #Grid Friendly +joltid 3531/tcp #Joltid +joltid 3531/udp #Joltid +raven-rmp 3532/tcp #Raven Remote Management Control +raven-rmp 3532/udp #Raven Remote Management Control +raven-rdp 3533/tcp #Raven Remote Management Data +raven-rdp 3533/udp #Raven Remote Management Data +urld-port 3534/tcp #URL Daemon Port +urld-port 3534/udp #URL Daemon Port +ms-la 3535/tcp #MS-LA +ms-la 3535/udp #MS-LA +snac 3536/tcp #SNAC +snac 3536/udp #SNAC +ni-visa-remote 3537/tcp #Remote NI-VISA port +ni-visa-remote 3537/udp #Remote NI-VISA port +ibm-diradm 3538/tcp #IBM Directory Server +ibm-diradm 3538/udp #IBM Directory Server +ibm-diradm-ssl 3539/tcp #IBM Directory Server SSL +ibm-diradm-ssl 3539/udp #IBM Directory Server SSL +pnrp-port 3540/tcp #PNRP User Port +pnrp-port 3540/udp #PNRP User Port +voispeed-port 3541/tcp #VoiSpeed Port +voispeed-port 3541/udp #VoiSpeed Port +hacl-monitor 3542/tcp #HA cluster monitor +hacl-monitor 3542/udp #HA cluster monitor +qftest-lookup 3543/tcp #qftest Lookup Port +qftest-lookup 3543/udp #qftest Lookup Port +teredo 3544/tcp #Teredo Port +teredo 3544/udp #Teredo Port +camac 3545/tcp #CAMAC equipment +camac 3545/udp #CAMAC equipment +symantec-sim 3547/tcp #Symantec SIM +symantec-sim 3547/udp #Symantec SIM +interworld 3548/tcp #Interworld +interworld 3548/udp #Interworld +tellumat-nms 3549/tcp #Tellumat MDR NMS +tellumat-nms 3549/udp #Tellumat MDR NMS +ssmpp 3550/tcp #Secure SMPP +ssmpp 3550/udp #Secure SMPP +apcupsd 3551/tcp #Apcupsd Information Port +apcupsd 3551/udp #Apcupsd Information Port +taserver 3552/tcp #TeamAgenda Server Port +taserver 3552/udp #TeamAgenda Server Port +rbr-discovery 3553/tcp #Red Box Recorder ADP +rbr-discovery 3553/udp #Red Box Recorder ADP +questnotify 3554/tcp #Quest Notification Server +questnotify 3554/udp #Quest Notification Server +razor 3555/tcp #Vipul's Razor +razor 3555/udp #Vipul's Razor +sky-transport 3556/tcp #Sky Transport Protocol +sky-transport 3556/udp #Sky Transport Protocol +personalos-001 3557/tcp #PersonalOS Comm Port +personalos-001 3557/udp #PersonalOS Comm Port +mcp-port 3558/tcp #MCP user port +mcp-port 3558/udp #MCP user port +cctv-port 3559/tcp #CCTV control port +cctv-port 3559/udp #CCTV control port +iniserve-port 3560/tcp #INIServe port +iniserve-port 3560/udp #INIServe port +bmc-onekey 3561/tcp #BMC-OneKey +bmc-onekey 3561/udp #BMC-OneKey +sdbproxy 3562/tcp #SDBProxy +sdbproxy 3562/udp #SDBProxy +watcomdebug 3563/tcp #Watcom Debug +watcomdebug 3563/udp #Watcom Debug +esimport 3564/tcp #Electromed SIM port +esimport 3564/udp #Electromed SIM port +m2pa 3565/tcp #M2PA +quest-launcher 3566/tcp #Quest Agent Manager +quest-launcher 3566/udp #Quest Agent Manager +emware-oft 3567/tcp #emWare OFT Services +emware-oft 3567/udp #emWare OFT Services +emware-epss 3568/tcp #emWare EMIT/Secure +emware-epss 3568/udp #emWare EMIT/Secure +mbg-ctrl 3569/tcp #Meinberg Control Service +mbg-ctrl 3569/udp #Meinberg Control Service +mccwebsvr-port 3570/tcp #MCC Web Server Port +mccwebsvr-port 3570/udp #MCC Web Server Port +megardsvr-port 3571/tcp #MegaRAID Server Port +megardsvr-port 3571/udp #MegaRAID Server Port +megaregsvrport 3572/tcp #Registration Server Port +megaregsvrport 3572/udp #Registration Server Port +tag-ups-1 3573/tcp #Advantage Group UPS Suite +tag-ups-1 3573/udp #Advantage Group UPS Suite +dmaf-server 3574/tcp #DMAF Server +dmaf-caster 3574/udp #DMAF Caster +ccm-port 3575/tcp #Coalsere CCM Port +ccm-port 3575/udp #Coalsere CCM Port +cmc-port 3576/tcp #Coalsere CMC Port +cmc-port 3576/udp #Coalsere CMC Port +config-port 3577/tcp #Configuration Port +config-port 3577/udp #Configuration Port +data-port 3578/tcp #Data Port +data-port 3578/udp #Data Port +ttat3lb 3579/tcp #Tarantella Load Balancing +ttat3lb 3579/udp #Tarantella Load Balancing +nati-svrloc 3580/tcp #NATI-ServiceLocator +nati-svrloc 3580/udp #NATI-ServiceLocator +kfxaclicensing 3581/tcp #Ascent Capture Licensing +kfxaclicensing 3581/udp #Ascent Capture Licensing +press 3582/tcp #PEG PRESS Server +press 3582/udp #PEG PRESS Server +canex-watch 3583/tcp #CANEX Watch System +canex-watch 3583/udp #CANEX Watch System +u-dbap 3584/tcp #U-DBase Access Protocol +u-dbap 3584/udp #U-DBase Access Protocol +emprise-lls 3585/tcp #Emprise License Server +emprise-lls 3585/udp #Emprise License Server +emprise-lsc 3586/tcp #License Server Console +emprise-lsc 3586/udp #License Server Console +p2pgroup 3587/tcp #Peer to Peer Grouping +p2pgroup 3587/udp #Peer to Peer Grouping +sentinel 3588/tcp #Sentinel Server +sentinel 3588/udp #Sentinel Server +isomair 3589/tcp #isomair +isomair 3589/udp #isomair +wv-csp-sms 3590/tcp #WV CSP SMS Binding +wv-csp-sms 3590/udp #WV CSP SMS Binding +gtrack-server 3591/tcp #LOCANIS G-TRACK Server +gtrack-server 3591/udp #LOCANIS G-TRACK Server +gtrack-ne 3592/tcp #LOCANIS G-TRACK NE Port +gtrack-ne 3592/udp #LOCANIS G-TRACK NE Port +bpmd 3593/tcp #BP Model Debugger +bpmd 3593/udp #BP Model Debugger +mediaspace 3594/tcp #MediaSpace +mediaspace 3594/udp #MediaSpace +shareapp 3595/tcp #ShareApp +shareapp 3595/udp #ShareApp +iw-mmogame 3596/tcp #Illusion Wireless MMOG +iw-mmogame 3596/udp #Illusion Wireless MMOG +a14 3597/tcp #A14 (AN-to-SC/MM) +a14 3597/udp #A14 (AN-to-SC/MM) +a15 3598/tcp #A15 (AN-to-AN) +a15 3598/udp #A15 (AN-to-AN) +quasar-server 3599/tcp #Quasar Accounting Server +quasar-server 3599/udp #Quasar Accounting Server +trap-daemon 3600/tcp #text relay-answer +trap-daemon 3600/udp #text relay-answer +visinet-gui 3601/tcp #Visinet Gui +visinet-gui 3601/udp #Visinet Gui +infiniswitchcl 3602/tcp #InfiniSwitch Mgr Client +infiniswitchcl 3602/udp #InfiniSwitch Mgr Client +int-rcv-cntrl 3603/tcp #Integrated Rcvr Control +int-rcv-cntrl 3603/udp #Integrated Rcvr Control +bmc-jmx-port 3604/tcp #BMC JMX Port +bmc-jmx-port 3604/udp #BMC JMX Port +comcam-io 3605/tcp #ComCam IO Port +comcam-io 3605/udp #ComCam IO Port +splitlock 3606/tcp #Splitlock Server +splitlock 3606/udp #Splitlock Server +precise-i3 3607/tcp #Precise I3 +precise-i3 3607/udp #Precise I3 +trendchip-dcp 3608/tcp #Trendchip control protocol +trendchip-dcp 3608/udp #Trendchip control protocol +cpdi-pidas-cm 3609/tcp #CPDI PIDAS Connection Mon +cpdi-pidas-cm 3609/udp #CPDI PIDAS Connection Mon +echonet 3610/tcp #ECHONET +echonet 3610/udp #ECHONET +six-degrees 3611/tcp #Six Degrees Port +six-degrees 3611/udp #Six Degrees Port +hp-dataprotect 3612/tcp #HP Data Protector +hp-dataprotect 3612/udp #HP Data Protector +alaris-disc 3613/tcp #Alaris Device Discovery +alaris-disc 3613/udp #Alaris Device Discovery +sigma-port 3614/tcp #Invensys Sigma Port +sigma-port 3614/udp #Invensys Sigma Port +start-network 3615/tcp #Start Messaging Network +start-network 3615/udp #Start Messaging Network +cd3o-protocol 3616/tcp #cd3o Control Protocol +cd3o-protocol 3616/udp #cd3o Control Protocol +sharp-server 3617/tcp #ATI SHARP Logic Engine +sharp-server 3617/udp #ATI SHARP Logic Engine +aairnet-1 3618/tcp #AAIR-Network 1 +aairnet-1 3618/udp #AAIR-Network 1 +aairnet-2 3619/tcp #AAIR-Network 2 +aairnet-2 3619/udp #AAIR-Network 2 +ep-pcp 3620/tcp #EPSON Projector Control Port +ep-pcp 3620/udp #EPSON Projector Control Port +ep-nsp 3621/tcp #EPSON Network Screen Port +ep-nsp 3621/udp #EPSON Network Screen Port +ff-lr-port 3622/tcp #FF LAN Redundancy Port +ff-lr-port 3622/udp #FF LAN Redundancy Port +haipe-discover 3623/tcp #HAIPIS Dynamic Discovery +haipe-discover 3623/udp #HAIPIS Dynamic Discovery +dist-upgrade 3624/tcp #Distributed Upgrade Port +dist-upgrade 3624/udp #Distributed Upgrade Port +volley 3625/tcp #Volley +volley 3625/udp #Volley +bvcdaemon-port 3626/tcp #bvControl Daemon +bvcdaemon-port 3626/udp #bvControl Daemon +jamserverport 3627/tcp #Jam Server Port +jamserverport 3627/udp #Jam Server Port +ept-machine 3628/tcp #EPT Machine Interface +ept-machine 3628/udp #EPT Machine Interface +escvpnet 3629/tcp #ESC/VP.net +escvpnet 3629/udp #ESC/VP.net +cs-remote-db 3630/tcp #C&S Remote Database Port +cs-remote-db 3630/udp #C&S Remote Database Port +cs-services 3631/tcp #C&S Web Services Port +cs-services 3631/udp #C&S Web Services Port +distcc 3632/tcp #distributed compiler +distcc 3632/udp #distributed compiler +wacp 3633/tcp #Wyrnix AIS port +wacp 3633/udp #Wyrnix AIS port +hlibmgr 3634/tcp #hNTSP Library Manager +hlibmgr 3634/udp #hNTSP Library Manager +sdo 3635/tcp #Simple Distributed Objects +sdo 3635/udp #Simple Distributed Objects +opscenter 3636/tcp #OpsCenter +opscenter 3636/udp #OpsCenter +scservp 3637/tcp #Customer Service Port +scservp 3637/udp #Customer Service Port +ehp-backup 3638/tcp #EHP Backup Protocol +ehp-backup 3638/udp #EHP Backup Protocol +xap-ha 3639/tcp #Extensible Automation +xap-ha 3639/udp #Extensible Automation +netplay-port1 3640/tcp #Netplay Port 1 +netplay-port1 3640/udp #Netplay Port 1 +netplay-port2 3641/tcp #Netplay Port 2 +netplay-port2 3641/udp #Netplay Port 2 +juxml-port 3642/tcp #Juxml Replication port +juxml-port 3642/udp #Juxml Replication port +audiojuggler 3643/tcp #AudioJuggler +audiojuggler 3643/udp #AudioJuggler +ssowatch 3644/tcp #ssowatch +ssowatch 3644/udp #ssowatch +cyc 3645/tcp #Cyc +cyc 3645/udp #Cyc +xss-srv-port 3646/tcp #XSS Server Port +xss-srv-port 3646/udp #XSS Server Port +splitlock-gw 3647/tcp #Splitlock Gateway +splitlock-gw 3647/udp #Splitlock Gateway +fjcp 3648/tcp #Fujitsu Cooperation Port +fjcp 3648/udp #Fujitsu Cooperation Port +nmmp 3649/tcp #Nishioka Miyuki Msg Protocol +nmmp 3649/udp #Nishioka Miyuki Msg Protocol +prismiq-plugin 3650/tcp #PRISMIQ VOD plug-in +prismiq-plugin 3650/udp #PRISMIQ VOD plug-in +xrpc-registry 3651/tcp #XRPC Registry +xrpc-registry 3651/udp #XRPC Registry +vxcrnbuport 3652/tcp #VxCR NBU Default Port +vxcrnbuport 3652/udp #VxCR NBU Default Port +tsp 3653/tcp #Tunnel Setup Protocol +tsp 3653/udp #Tunnel Setup Protocol +vaprtm 3654/tcp #VAP RealTime Messenger +vaprtm 3654/udp #VAP RealTime Messenger +abatemgr 3655/tcp #ActiveBatch Exec Agent +abatemgr 3655/udp #ActiveBatch Exec Agent +abatjss 3656/tcp #ActiveBatch Job Scheduler +abatjss 3656/udp #ActiveBatch Job Scheduler +immedianet-bcn 3657/tcp #ImmediaNet Beacon +immedianet-bcn 3657/udp #ImmediaNet Beacon +ps-ams 3658/tcp #PlayStation AMS (Secure) +ps-ams 3658/udp #PlayStation AMS (Secure) +apple-sasl 3659/tcp #Apple SASL +apple-sasl 3659/udp #Apple SASL +can-nds-ssl 3660/tcp #Candle Directory Services using SSL +can-nds-ssl 3660/udp #Candle Directory Services using SSL +can-ferret-ssl 3661/tcp #Candle Directory Services using SSL +can-ferret-ssl 3661/udp #Candle Directory Services using SSL +pserver 3662/tcp #pserver +pserver 3662/udp #pserver +dtp 3663/tcp #DIRECWAY Tunnel Protocol +dtp 3663/udp #DIRECWAY Tunnel Protocol +ups-engine 3664/tcp #UPS Engine Port +ups-engine 3664/udp #UPS Engine Port +ent-engine 3665/tcp #Enterprise Engine Port +ent-engine 3665/udp #Enterprise Engine Port +eserver-pap 3666/tcp #IBM eServer PAP +eserver-pap 3666/udp #IBM EServer PAP +infoexch 3667/tcp #IBM Information Exchange +infoexch 3667/udp #IBM Information Exchange +dell-rm-port 3668/tcp #Dell Remote Management +dell-rm-port 3668/udp #Dell Remote Management +casanswmgmt 3669/tcp #CA SAN Switch Management +casanswmgmt 3669/udp #CA SAN Switch Management +smile 3670/tcp #SMILE TCP/UDP Interface +smile 3670/udp #SMILE TCP/UDP Interface +efcp 3671/tcp #e Field Control (EIBnet) +efcp 3671/udp #e Field Control (EIBnet) +lispworks-orb 3672/tcp #LispWorks ORB +lispworks-orb 3672/udp #LispWorks ORB +mediavault-gui 3673/tcp #Openview Media Vault GUI +mediavault-gui 3673/udp #Openview Media Vault GUI +wininstall-ipc 3674/tcp #WinINSTALL IPC Port +wininstall-ipc 3674/udp #WinINSTALL IPC Port +calltrax 3675/tcp #CallTrax Data Port +calltrax 3675/udp #CallTrax Data Port +va-pacbase 3676/tcp #VisualAge Pacbase server +va-pacbase 3676/udp #VisualAge Pacbase server +roverlog 3677/tcp #RoverLog IPC +roverlog 3677/udp #RoverLog IPC +ipr-dglt 3678/tcp #DataGuardianLT +ipr-dglt 3678/udp #DataGuardianLT +newton-dock 3679/tcp #Newton Dock +newton-dock 3679/udp #Newton Dock +npds-tracker 3680/tcp #NPDS Tracker +npds-tracker 3680/udp #NPDS Tracker +bts-x73 3681/tcp #BTS X73 Port +bts-x73 3681/udp #BTS X73 Port +cas-mapi 3682/tcp #EMC SmartPackets-MAPI +cas-mapi 3682/udp #EMC SmartPackets-MAPI +bmc-ea 3683/tcp #BMC EDV/EA +bmc-ea 3683/udp #BMC EDV/EA +faxstfx-port 3684/tcp #FAXstfX +faxstfx-port 3684/udp #FAXstfX +dsx-agent 3685/tcp #DS Expert Agent +dsx-agent 3685/udp #DS Expert Agent +tnmpv2 3686/tcp #Trivial Network Management +tnmpv2 3686/udp #Trivial Network Management +simple-push 3687/tcp #simple-push +simple-push 3687/udp #simple-push +simple-push-s 3688/tcp #simple-push Secure +simple-push-s 3688/udp #simple-push Secure +daap 3689/tcp #Digital Audio Access Protocol +daap 3689/udp #Digital Audio Access Protocol +svn 3690/tcp #Subversion +svn 3690/udp #Subversion +magaya-network 3691/tcp #Magaya Network Port +magaya-network 3691/udp #Magaya Network Port +intelsync 3692/tcp #Brimstone IntelSync +intelsync 3692/udp #Brimstone IntelSync +gttp 3693/tcp #GTTP +gttp 3693/udp #GTTP +vpntpp 3694/tcp #VPN Token Propagation Protocol +vpntpp 3694/udp #VPN Token Propagation Protocol +bmc-data-coll 3695/tcp #BMC Data Collection +bmc-data-coll 3695/udp #BMC Data Collection +telnetcpcd 3696/tcp #Telnet Com Port Control +telnetcpcd 3696/udp #Telnet Com Port Control +nw-license 3697/tcp #NavisWorks License System +nw-license 3697/udp #NavisWorks Licnese System +sagectlpanel 3698/tcp #SAGECTLPANEL +sagectlpanel 3698/udp #SAGECTLPANEL +kpn-icw 3699/tcp #Internet Call Waiting +kpn-icw 3699/udp #Internet Call Waiting +lrs-paging 3700/tcp #LRS NetPage +lrs-paging 3700/udp #LRS NetPage +netcelera 3701/tcp #NetCelera +netcelera 3701/udp #NetCelera +ws-discovery 3702/tcp #Web Service Discovery +ws-discovery 3702/udp #Web Service Discovery +adobeserver-3 3703/tcp #Adobe Server 3 +adobeserver-3 3703/udp #Adobe Server 3 +adobeserver-4 3704/tcp #Adobe Server 4 +adobeserver-4 3704/udp #Adobe Server 4 +adobeserver-5 3705/tcp #Adobe Server 5 +adobeserver-5 3705/udp #Adobe Server 5 +rt-event 3706/tcp #Real-Time Event Port +rt-event 3706/udp #Real-Time Event Port +rt-event-s 3707/tcp #Real-Time Event Secure Port +rt-event-s 3707/udp #Real-Time Event Secure Port +ca-idms 3709/tcp #CA-IDMS Server +ca-idms 3709/udp #CA-IDMS Server +portgate-auth 3710/tcp #PortGate Authentication +portgate-auth 3710/udp #PortGate Authentication +edb-server2 3711/tcp #EBD Server 2 +edb-server2 3711/udp #EBD Server 2 +sentinel-ent 3712/tcp #Sentinel Enterprise +sentinel-ent 3712/udp #Sentinel Enterprise +tftps 3713/tcp #TFTP over TLS +tftps 3713/udp #TFTP over TLS +delos-dms 3714/tcp #DELOS Direct Messaging +delos-dms 3714/udp #DELOS Direct Messaging +anoto-rendezv 3715/tcp #Anoto Rendezvous Port +anoto-rendezv 3715/udp #Anoto Rendezvous Port +wv-csp-sms-cir 3716/tcp #WV CSP SMS CIR Channel +wv-csp-sms-cir 3716/udp #WV CSP SMS CIR Channel +wv-csp-udp-cir 3717/tcp #WV CSP UDP/IP CIR Channel +wv-csp-udp-cir 3717/udp #WV CSP UDP/IP CIR Channel +opus-services 3718/tcp #OPUS Server Port +opus-services 3718/udp #OPUS Server Port +itelserverport 3719/tcp #iTel Server Port +itelserverport 3719/udp #iTel Server Port +ufastro-instr 3720/tcp #UF Astro. Instr. Services +ufastro-instr 3720/udp #UF Astro. Instr. Services +xsync 3721/tcp #Xsync +xsync 3721/udp #Xsync +xserveraid 3722/tcp #Xserve RAID +xserveraid 3722/udp #Xserve RAID +sychrond 3723/tcp #Sychron Service Daemon +sychrond 3723/udp #Sychron Service Daemon +battlenet 3724/tcp #Blizzard Battlenet +battlenet 3724/udp #Blizzard Battlenet +na-er-tip 3725/tcp #Netia NA-ER Port +na-er-tip 3725/udp #Netia NA-ER Port +array-manager 3726/tcp #Xyratex Array Manager +array-manager 3726/udp #Xyartex Array Manager +e-mdu 3727/tcp #Ericsson Mobile Data Unit +e-mdu 3727/udp #Ericsson Mobile Data Unit +e-woa 3728/tcp #Ericsson Web on Air +e-woa 3728/udp #Ericsson Web on Air +fksp-audit 3729/tcp #Fireking Audit Port +fksp-audit 3729/udp #Fireking Audit Port +client-ctrl 3730/tcp #Client Control +client-ctrl 3730/udp #Client Control +smap 3731/tcp #Service Manager +smap 3731/udp #Service Manager +m-wnn 3732/tcp #Mobile Wnn +m-wnn 3732/udp #Mobile Wnn +multip-msg 3733/tcp #Multipuesto Msg Port +multip-msg 3733/udp #Multipuesto Msg Port +synel-data 3734/tcp #Synel Data Collection Port +synel-data 3734/udp #Synel Data Collection Port +pwdis 3735/tcp #Password Distribution +pwdis 3735/udp #Password Distribution +rs-rmi 3736/tcp #RealSpace RMI +rs-rmi 3736/udp #RealSpace RMI +versatalk 3738/tcp #versaTalk Server Port +versatalk 3738/udp #versaTalk Server Port +launchbird-lm 3739/tcp #Launchbird LicenseManager +launchbird-lm 3739/udp #Launchbird LicenseManager +heartbeat 3740/tcp #Heartbeat Protocol +heartbeat 3740/udp #Heartbeat Protocol +wysdma 3741/tcp #WysDM Agent +wysdma 3741/udp #WysDM Agent +cst-port 3742/tcp #CST - Configuration & Service Tracker +cst-port 3742/udp #CST - Configuration & Service Tracker +ipcs-command 3743/tcp #IP Control Systems Ltd. +ipcs-command 3743/udp #IP Control Systems Ltd. +sasg 3744/tcp #SASG +sasg 3744/udp #SASG +gw-call-port 3745/tcp #GWRTC Call Port +gw-call-port 3745/udp #GWRTC Call Port +linktest 3746/tcp #LXPRO.COM LinkTest +linktest 3746/udp #LXPRO.COM LinkTest +linktest-s 3747/tcp #LXPRO.COM LinkTest SSL +linktest-s 3747/udp #LXPRO.COM LinkTest SSL +webdata 3748/tcp #webData +webdata 3748/udp #webData +cimtrak 3749/tcp #CimTrak +cimtrak 3749/udp #CimTrak +cbos-ip-port 3750/tcp #CBOS/IP ncapsalation port +cbos-ip-port 3750/udp #CBOS/IP ncapsalatoin port +gprs-cube 3751/tcp #CommLinx GPRS Cube +gprs-cube 3751/udp #CommLinx GPRS Cube +vipremoteagent 3752/tcp #Vigil-IP RemoteAgent +vipremoteagent 3752/udp #Vigil-IP RemoteAgent +nattyserver 3753/tcp #NattyServer Port +nattyserver 3753/udp #NattyServer Port +timestenbroker 3754/tcp #TimesTen Broker Port +timestenbroker 3754/udp #TimesTen Broker Port +sas-remote-hlp 3755/tcp #SAS Remote Help Server +sas-remote-hlp 3755/udp #SAS Remote Help Server +canon-capt 3756/tcp #Canon CAPT Port +canon-capt 3756/udp #Canon CAPT Port +grf-port 3757/tcp #GRF Server Port +grf-port 3757/udp #GRF Server Port +apw-registry 3758/tcp #apw RMI registry +apw-registry 3758/udp #apw RMI registry +exapt-lmgr 3759/tcp #Exapt License Manager +exapt-lmgr 3759/udp #Exapt License Manager +adtempusclient 3760/tcp #adTempus Client +adtempusclient 3760/udp #adTEmpus Client +gsakmp 3761/tcp #gsakmp port +gsakmp 3761/udp #gsakmp port +gbs-smp 3762/tcp #GBS SnapMail Protocol +gbs-smp 3762/udp #GBS SnapMail Protocol +xo-wave 3763/tcp #XO Wave Control Port +xo-wave 3763/udp #XO Wave Control Port +mni-prot-rout 3764/tcp #MNI Protected Routing +mni-prot-rout 3764/udp #MNI Protected Routing +rtraceroute 3765/tcp #Remote Traceroute +rtraceroute 3765/udp #Remote Traceroute +listmgr-port 3767/tcp #ListMGR Port +listmgr-port 3767/udp #ListMGR Port +rblcheckd 3768/tcp #rblcheckd server daemon +rblcheckd 3768/udp #rblcheckd server daemon +haipe-otnk 3769/tcp #HAIPE Network Keying +haipe-otnk 3769/udp #HAIPE Network Keying +cindycollab 3770/tcp #Cinderella Collaboration +cindycollab 3770/udp #Cinderella Collaboration +paging-port 3771/tcp #RTP Paging Port +paging-port 3771/udp #RTP Paging Port +ctp 3772/tcp #Chantry Tunnel Protocol +ctp 3772/udp #Chantry Tunnel Protocol +ctdhercules 3773/tcp #ctdhercules +ctdhercules 3773/udp #ctdhercules +zicom 3774/tcp #ZICOM +zicom 3774/udp #ZICOM +ispmmgr 3775/tcp #ISPM Manager Port +ispmmgr 3775/udp #ISPM Manager Port +dvcprov-port 3776/tcp #Device Provisioning Port +dvcprov-port 3776/udp #Device Provisioning Port +jibe-eb 3777/tcp #Jibe EdgeBurst +jibe-eb 3777/udp #Jibe EdgeBurst +c-h-it-port 3778/tcp #Cutler-Hammer IT Port +c-h-it-port 3778/udp #Cutler-Hammer IT Port +cognima 3779/tcp #Cognima Replication +cognima 3779/udp #Cognima Replication +nnp 3780/tcp #Nuzzler Network Protocol +nnp 3780/udp #Nuzzler Network Protocol +abcvoice-port 3781/tcp #ABCvoice server port +abcvoice-port 3781/udp #ABCvoice server port +iso-tp0s 3782/tcp #Secure ISO TP0 port +iso-tp0s 3782/udp #Secure ISO TP0 port +bim-pem 3783/tcp #Impact Mgr./PEM Gateway +bim-pem 3783/udp #Impact Mgr./PEM Gateway +bfd 3784/tcp #BFD +bfd 3784/udp #BFD +bfd-control 3785/tcp #BFD-Control +bfd-control 3785/udp #BFD-Control +upstriggervsw 3786/tcp #VSW Upstrigger port +upstriggervsw 3786/udp #VSW Upstrigger port +fintrx 3787/tcp #Fintrx +fintrx 3787/udp #Fintrx +isrp-port 3788/tcp #SPACEWAY Routing port +isrp-port 3788/udp #SPACEWAY Routing port +remotedeploy 3789/tcp #RemoteDeploy Administrati +remotedeploy 3789/udp #RemoteDeploy Administrati +quickbooksrds 3790/tcp #QuickBooks RDS +quickbooksrds 3790/udp #QuickBooks RDS +tvnetworkvideo 3791/tcp #TV NetworkVideo Data port +tvnetworkvideo 3791/udp #TV NetworkVideo Data port +sitewatch 3792/tcp #e-watch, Inc. SiteWatch +sitewatch 3792/udp #e-watch, Inc. Sitewatch +dcsoftware 3793/tcp #DataCore Software +dcsoftware 3793/udp #DataCore Software +jaus 3794/tcp #JAUS Robots +jaus 3794/udp #JAUS Robots +myblast 3795/tcp #myBLAST Mekentosj port +myblast 3795/udp #myBLAST Mekentosj port +spw-dialer 3796/tcp #Spaceway Dialer +spw-dialer 3796/udp #Spaceway Dialer +idps 3797/tcp #idps +idps 3797/udp #idps +minilock 3798/tcp #Minilock +minilock 3798/udp #Minilock +radius-dynauth 3799/tcp #RADIUS Dynamic Authorization +radius-dynauth 3799/udp #RADIUS Dynamic Authorization +pwgpsi 3800/tcp #Print Services Interface +pwgpsi 3800/udp #Print Services Interface +vhd 3802/tcp #VHD +vhd 3802/udp #VHD +soniqsync 3803/tcp #SoniqSync +soniqsync 3803/udp #SoniqSync +iqnet-port 3804/tcp #Harman IQNet Port +iqnet-port 3804/udp #Harman IQNet Port +tcpdataserver 3805/tcp #ThorGuard Server Port +tcpdataserver 3805/udp #ThorGuard Server Port +wsmlb 3806/tcp #Remote System Manager +wsmlb 3806/udp #Remote System Manager +spugna 3807/tcp #SpuGNA Communication Port +spugna 3807/udp #SpuGNA Communication Port +wlanauth 3810/tcp #WLAN AS server +wlanauth 3810/udp #WLAN AS server +amp 3811/tcp #AMP +amp 3811/udp #AMP +neto-wol-server 3812/tcp #netO WOL Server +neto-wol-server 3812/udp #netO WOL Server +rap-ip 3813/tcp #Rhapsody Interface Protocol +rap-ip 3813/udp #Rhapsody Interface Protocol +neto-dcs 3814/tcp #netO DCS +neto-dcs 3814/udp #netO DCS +lansurveyorxml 3815/tcp #LANsurveyor XML +lansurveyorxml 3815/udp #LANsurveyor XML +sunlps-http 3816/tcp #Sun Local Patch Server +sunlps-http 3816/udp #Sun Local Patch Server +tapeware 3817/tcp #Yosemite Tech Tapeware +tapeware 3817/udp #Yosemite Tech Tapeware +crinis-hb 3818/tcp #Crinis Heartbeat +crinis-hb 3818/udp #Crinis Heartbeat +sos 3838/tcp #Scito Object Server +sos 3838/udp #Scito Object Server +amx-mtgman 3839/tcp #AMX MeetingManager +amx-mtgman 3839/udp #AMX MeetingManager +flirtmitmir 3840/tcp #www.FlirtMitMir.de +flirtmitmir 3840/udp #www.FlirtMitMir.de +zfirm-shiprush3 3841/tcp #Z-Firm ShipRush v3 +zfirm-shiprush3 3841/udp #Z-Firm ShipRush v3 +nhci 3842/tcp #NHCI status port +nhci 3842/udp #NHCI status port +quest-agent 3843/tcp #Quest Common Agent +quest-agent 3843/udp #Quest Common Agent +rnm 3844/tcp #RNM +rnm 3844/udp #RNM +v-one-spp 3845/tcp #V-ONE Single Port Proxy +v-one-spp 3845/udp #V-ONE Single Port Proxy +an-pcp 3846/tcp #Astare Network PCP +an-pcp 3846/udp #Astare Network PCP +msfw-control 3847/tcp #MS Firewall Control +msfw-control 3847/udp #MS Firewall Control +item 3848/tcp #IT Environmental Monitor +item 3848/udp #IT Environmental Monitor +spw-dnspreload 3849/tcp #SPACEWAY DNS Preload +spw-dnspreload 3849/udp #SPACEWAY DNS Prelaod +qtms-bootstrap 3850/tcp #QTMS Bootstrap Protocol +qtms-bootstrap 3850/udp #QTMS Bootstrap Protocol +spectraport 3851/tcp #SpectraTalk Port +spectraport 3851/udp #SpectraTalk Port +sse-app-config 3852/tcp #SSE App Configuration +sse-app-config 3852/udp #SSE App Configuration +sscan 3853/tcp #SONY scanning protocol +sscan 3853/udp #SONY scanning protocol +stryker-com 3854/tcp #Stryker Comm Port +stryker-com 3854/udp #Stryker Comm Port +opentrac 3855/tcp #OpenTRAC +opentrac 3855/udp #OpenTRAC +informer 3856/tcp #INFORMER +informer 3856/udp #INFORMER +trap-port 3857/tcp #Trap Port +trap-port 3857/udp #Trap Port +trap-port-mom 3858/tcp #Trap Port MOM +trap-port-mom 3858/udp #Trap Port MOM +nav-port 3859/tcp #Navini Port +nav-port 3859/udp #Navini Port +ewlm 3860/tcp #eWLM +ewlm 3860/udp #eWLM +winshadow-hd 3861/tcp #winShadow Host Discovery +winshadow-hd 3861/udp #winShadow Host Discovery +giga-pocket 3862/tcp #GIGA-POCKET +giga-pocket 3862/udp #GIGA-POCKET +asap-tcp 3863/tcp #asap tcp port +asap-tcp 3863/udp #asap tcp port +asap-tcp-tls 3864/tcp #asap/tls tcp port +asap-tcp-tls 3864/udp #asap/tls tcp port +xpl 3865/tcp #xpl automation protocol +xpl 3865/udp #xpl automation protocol +dzdaemon 3866/tcp #Sun SDViz DZDAEMON Port +dzdaemon 3866/udp #Sun SDViz DZDAEMON Port +dzoglserver 3867/tcp #Sun SDViz DZOGLSERVER Port +dzoglserver 3867/udp #Sun SDViz DZOGLSERVER Port +diameter 3868/tcp #DIAMETER +ovsam-mgmt 3869/tcp #hp OVSAM MgmtServer Disco +ovsam-mgmt 3869/udp #hp OVSAM MgmtServer Disco +ovsam-d-agent 3870/tcp #hp OVSAM HostAgent Disco +ovsam-d-agent 3870/udp #hp OVSAM HostAgent Disco +avocent-adsap 3871/tcp #Avocent DS Authorization +avocent-adsap 3871/udp #Avocent DS Authorization +oem-agent 3872/tcp #OEM Agent +oem-agent 3872/udp #OEM Agent +fagordnc 3873/tcp #fagordnc +fagordnc 3873/udp #fagordnc +sixxsconfig 3874/tcp #SixXS Configuration +sixxsconfig 3874/udp #SixXS Configuration +pnbscada 3875/tcp #PNBSCADA +pnbscada 3875/udp #PNBSCADA +dl_agent 3876/tcp #DirectoryLockdown Agent +dl_agent 3876/udp #DirectoryLockdown Agent +xmpcr-interface 3877/tcp #XMPCR Interface Port +xmpcr-interface 3877/udp #XMPCR Interface Port +fotogcad 3878/tcp #FotoG CAD interface +fotogcad 3878/udp #FotoG CAD interface +appss-lm 3879/tcp #appss license manager +appss-lm 3879/udp #appss license manager +microgrid 3880/tcp #microgrid +microgrid 3880/udp #microgrid +idac 3881/tcp #Data Acquisition and Control +idac 3881/udp #Data Acquisition and Control +msdts1 3882/tcp #DTS Service Port +msdts1 3882/udp #DTS Service Port +vrpn 3883/tcp #VR Peripheral Network +vrpn 3883/udp #VR Peripheral Network +softrack-meter 3884/tcp #SofTrack Metering +softrack-meter 3884/udp #SofTrack Metering +topflow-ssl 3885/tcp #TopFlow SSL +topflow-ssl 3885/udp #TopFlow SSL +nei-management 3886/tcp #NEI management port +nei-management 3886/udp #NEI management port +leogic-data 3887/tcp #Leogic Data Transport +leogic-data 3887/udp #Leogic Data Transport +leogic-services 3888/tcp #Leogic Services +leogic-services 3888/udp #Leogic Services +dandv-tester 3889/tcp #D and V Tester Control Port +dandv-tester 3889/udp #D and V Tester Control Port +ndsconnect 3890/tcp #Niche Data Server Connect +ndsconnect 3890/udp #Niche Data Server Connect +rtc-pm-port 3891/tcp #Oracle RTC-PM port +rtc-pm-port 3891/udp #Oracle RTC-PM port +pcc-image-port 3892/tcp #PCC-image-port +pcc-image-port 3892/udp #PCC-image-port +cgi-starapi 3893/tcp #CGI StarAPI Server +cgi-starapi 3893/udp #CGI StarAPI Server +syam-agent 3894/tcp #SyAM Agent Port +syam-agent 3894/udp #SyAM Agent Port +syam-smc 3895/tcp #SyAm SMC Service Port +syam-smc 3895/udp #SyAm SMC Service Port +sdo-tls 3896/tcp #Simple Distributed Objects over TLS +sdo-tls 3896/udp #Simple Distributed Objects over TLS +sdo-ssh 3897/tcp #Simple Distributed Objects over SSH +sdo-ssh 3897/udp #Simple Distributed Objects over SSH +senip 3898/tcp #IAS, Inc. SmartEye NET Internet Protocol +senip 3898/udp #IAS, Inc. SmartEye NET Internet Protocol +itv-control 3899/tcp #ITV Port +itv-control 3899/udp #ITV Port +udt_os 3900/tcp #Unidata UDT OS +udt_os 3900/udp #Unidata UDT OS +nimsh 3901/tcp #NIM Service Handler +nimsh 3901/udp #NIM Service Handler +nimaux 3902/tcp #NIMsh Auxiliary Port +nimaux 3902/udp #NIMsh Auxiliary Port +charsetmgr 3903/tcp #CharsetMGR +charsetmgr 3903/udp #CharsetMGR +omnilink-port 3904/tcp #Arnet Omnilink Port +omnilink-port 3904/udp #Arnet Omnilink Port +mupdate 3905/tcp #Mailbox Update (MUPDATE) protocol +mupdate 3905/udp #Mailbox Update (MUPDATE) protocol +topovista-data 3906/tcp #TopoVista elevation data +topovista-data 3906/udp #TopoVista elevation data +imoguia-port 3907/tcp #Imoguia Port +imoguia-port 3907/udp #Imoguia Port +hppronetman 3908/tcp #HP Procurve NetManagement +hppronetman 3908/udp #HP Procurve NetManagement +surfcontrolcpa 3909/tcp #SurfControl CPA +surfcontrolcpa 3909/udp #SurfControl CPA +prnrequest 3910/tcp #Printer Request Port +prnrequest 3910/udp #Printer Request Port +prnstatus 3911/tcp #Printer Status Port +prnstatus 3911/udp #Printer Status Port +gbmt-stars 3912/tcp #Global Maintech Stars +gbmt-stars 3912/udp #Global Maintech Stars +listcrt-port 3913/tcp #ListCREATOR Port +listcrt-port 3913/udp #ListCREATOR Port +listcrt-port-2 3914/tcp #ListCREATOR Port 2 +listcrt-port-2 3914/udp #ListCREATOR Port 2 +agcat 3915/tcp #Auto-Graphics Cataloging +agcat 3915/udp #Auto-Graphics Cataloging +wysdmc 3916/tcp #WysDM Controller +wysdmc 3916/udp #WysDM Controller +aftmux 3917/tcp #AFT multiplex port +aftmux 3917/udp #AFT multiples port +pktcablemmcops 3918/tcp #PacketCableMultimediaCOPS +pktcablemmcops 3918/udp #PacketCableMultimediaCOPS +hyperip 3919/tcp #HyperIP +hyperip 3919/udp #HyperIP +exasoftport1 3920/tcp #Exasoft IP Port +exasoftport1 3920/udp #Exasoft IP Port +herodotus-net 3921/tcp #Herodotus Net +herodotus-net 3921/udp #Herodotus Net +sor-update 3922/tcp #Soronti Update Port +sor-update 3922/udp #Soronti Update Port +symb-sb-port 3923/tcp #Symbian Service Broker +symb-sb-port 3923/udp #Symbian Service Broker +mpl-gprs-port 3924/tcp #MPL_GPRS_PORT +mpl-gprs-port 3924/udp #MPL_GPRS_Port +zmp 3925/tcp #Zoran Media Port +zmp 3925/udp #Zoran Media Port +winport 3926/tcp #WINPort +winport 3926/udp #WINPort +natdataservice 3927/tcp #ScsTsr +natdataservice 3927/udp #ScsTsr +netboot-pxe 3928/tcp #PXE NetBoot Manager +netboot-pxe 3928/udp #PXE NetBoot Manager +smauth-port 3929/tcp #AMS Port +smauth-port 3929/udp #AMS Port +syam-webserver 3930/tcp #Syam Web Server Port +syam-webserver 3930/udp #Syam Web Server Port +msr-plugin-port 3931/tcp #MSR Plugin Port +msr-plugin-port 3931/udp #MSR Plugin Port +dyn-site 3932/tcp #Dynamic Site System +dyn-site 3932/udp #Dynamic Site System +plbserve-port 3933/tcp #PL/B App Server User Port +plbserve-port 3933/udp #PL/B App Server User Port +sunfm-port 3934/tcp #PL/B File Manager Port +sunfm-port 3934/udp #PL/B File Manager Port +sdp-portmapper 3935/tcp #SDP Port Mapper Protocol +sdp-portmapper 3935/udp #SDP Port Mapper Protocol +mailprox 3936/tcp #Mailprox +mailprox 3936/udp #Mailprox +dvbservdscport 3937/tcp #DVB Service Disc Port +dvbservdscport 3937/udp #DVB Service Disc Port +dbcontrol_agent 3938/tcp #Oracle dbControl Agent po +dbcontrol_agent 3938/udp #Oracel dbControl Agent po +aamp 3939/tcp #Anti-virus Application Management Port +aamp 3939/udp #Anti-virus Application Management Port +xecp-node 3940/tcp #XeCP Node Service +xecp-node 3940/udp #XeCP Node Service +homeportal-web 3941/tcp #Home Portal Web Server +homeportal-web 3941/udp #Home Portal Web Server +srdp 3942/tcp #satellite distribution +srdp 3942/udp #satellite distribution +tig 3943/tcp #TetraNode Ip Gateway +tig 3943/udp #TetraNode Ip Gateway +sops 3944/tcp #S-Ops Management +sops 3944/udp #S-Ops Management +emcads 3945/tcp #EMCADS Server Port +emcads 3945/udp #EMCADS Server Port +backupedge 3946/tcp #BackupEDGE Server +backupedge 3946/udp #BackupEDGE Server +ccp 3947/tcp #Connect and Control Protocol for Consumer, Commercial, and Industrial Electronic Devices +ccp 3947/udp #Connect and Control Protocol for Consumer, Commercial, and Industrial Electronic Devices +apdap 3948/tcp #Anton Paar Device Administration Protocol +apdap 3948/udp #Anton Paar Device Administration Protocol +drip 3949/tcp #Dynamic Routing Information Protocol +drip 3949/udp #Dynamic Routing Information Protocol +mapper-nodemgr 3984/tcp #MAPPER network node manager +mapper-nodemgr 3984/udp #MAPPER network node manager +mapper-mapethd 3985/tcp #MAPPER TCP/IP server +mapper-mapethd 3985/udp #MAPPER TCP/IP server +mapper-ws_ethd 3986/tcp #MAPPER workstation server +mapper-ws_ethd 3986/udp #MAPPER workstation server +centerline 3987/tcp #Centerline +centerline 3987/udp #Centerline +iss-mgmt-ssl 3995/tcp #ISS Management Svcs SSL +iss-mgmt-ssl 3995/udp #ISS Management Svcs SSL +abcsoftware 3996/tcp #abcsoftware-01 +abscoftware 3996/udp #abcsoftware-01 +terabase 4000/tcp #Terabase +terabase 4000/udp #Terabase +newoak 4001/tcp #NewOak +newoak 4001/udp #NewOak +pxc-spvr-ft 4002/tcp #pxc-spvr-ft +pxc-spvr-ft 4002/udp #pxc-spvr-ft +pxc-splr-ft 4003/tcp #pxc-splr-ft +pxc-splr-ft 4003/udp #pxc-splr-ft +pxc-roid 4004/tcp #pxc-roid +pxc-roid 4004/udp #pxc-roid +pxc-pin 4005/tcp #pxc-pin +pxc-pin 4005/udp #pxc-pin +pxc-spvr 4006/tcp #pxc-spvr +pxc-spvr 4006/udp #pxc-spvr +pxc-splr 4007/tcp #pxc-splr +pxc-splr 4007/udp #pxc-splr +netcheque 4008/tcp #NetCheque accounting +netcheque 4008/udp #NetCheque accounting +chimera-hwm 4009/tcp #Chimera HWM +chimera-hwm 4009/udp #Chimera HWM +samsung-unidex 4010/tcp #Samsung Unidex +samsung-unidex 4010/udp #Samsung Unidex +altserviceboot 4011/tcp #Alternate Service Boot +altserviceboot 4011/udp #Alternate Service Boot +pda-gate 4012/tcp #PDA Gate +pda-gate 4012/udp #PDA Gate +acl-manager 4013/tcp #ACL Manager +acl-manager 4013/udp #ACL Manager +taiclock 4014/tcp #TAICLOCK +taiclock 4014/udp #TAICLOCK +talarian-mcast1 4015/tcp #Talarian Mcast +talarian-mcast1 4015/udp #Talarian Mcast +talarian-mcast2 4016/tcp #Talarian Mcast +talarian-mcast2 4016/udp #Talarian Mcast +talarian-mcast3 4017/tcp #Talarian Mcast +talarian-mcast3 4017/udp #Talarian Mcast +talarian-mcast4 4018/tcp #Talarian Mcast +talarian-mcast4 4018/udp #Talarian Mcast +talarian-mcast5 4019/tcp #Talarian Mcast +talarian-mcast5 4019/udp #Talarian Mcast +trap 4020/tcp #TRAP Port +trap 4020/udp #TRAP Port +nexus-portal 4021/tcp #Nexus Portal +nexus-portal 4021/udp #Nexus Portal +dnox 4022/tcp #DNOX +dnox 4022/udp #DNOX +esnm-zoning 4023/tcp #ESNM Zoning Port +esnm-zoning 4023/udp #ESNM Zoning Port +tnp1-port 4024/tcp #TNP1 User Port +tnp1-port 4024/udp #TNP1 User Port +partimage 4025/tcp #Partition Image Port +partimage 4025/udp #Partition Image Port +as-debug 4026/tcp #Graphical Debug Server +as-debug 4026/udp #Graphical Debug Server +bxp 4027/tcp #bitxpress +bxp 4027/udp #bitxpress +dtserver-port 4028/tcp #DTServer Port +dtserver-port 4028/udp #DTServer Port +ip-qsig 4029/tcp #IP Q signaling protocol +ip-qsig 4029/udp #IP Q signaling protocol +jdmn-port 4030/tcp #Accell/JSP Daemon Port +jdmn-port 4030/udp #Accell/JSP Daemon Port +suucp 4031/tcp #UUCP over SSL +suucp 4031/udp #UUCP over SSL +vrts-auth-port 4032/tcp #VERITAS Authorization Service +vrts-auth-port 4032/udp #VERITAS Authorization Service +sanavigator 4033/tcp #SANavigator Peer Port +sanavigator 4033/udp #SANavigator Peer Port +ubxd 4034/tcp #Ubiquinox Daemon +ubxd 4034/udp #Ubiquinox Daemon +wap-push-http 4035/tcp #WAP Push OTA-HTTP port +wap-push-http 4035/udp #WAP Push OTA-HTTP port +wap-push-https 4036/tcp #WAP Push OTA-HTTP secure +wap-push-https 4036/udp #WAP Push OTA-HTTP secure +yo-main 4040/tcp #Yo.net main service +yo-main 4040/udp #Yo.net main service +houston 4041/tcp #Rocketeer-Houston +houston 4041/udp #Rocketeer-Houston +ldxp 4042/tcp #LDXP +ldxp 4042/udp #LDXP +bre 4096/tcp #BRE (Bridge Relay Element) +bre 4096/udp #BRE (Bridge Relay Element) +patrolview 4097/tcp #Patrol View +patrolview 4097/udp #Patrol View +drmsfsd 4098/tcp #drmsfsd +drmsfsd 4098/udp #drmsfsd +dpcp 4099/tcp #DPCP +dpcp 4099/udp #DPCP +igo-incognito 4100/tcp #IGo Incognito Data Port +igo-incognito 4100/udp #IGo Incognito Data Port +jomamqmonitor 4114/tcp #JomaMQMonitor +jomamqmonitor 4114/udp #JomaMQMonitor +nuts_dem 4132/tcp #NUTS Daemon +nuts_dem 4132/udp #NUTS Daemon +nuts_bootp 4133/tcp #NUTS Bootp Server +nuts_bootp 4133/udp #NUTS Bootp Server +nifty-hmi 4134/tcp #NIFTY-Serve HMI protocol +nifty-hmi 4134/udp #NIFTY-Serve HMI protocol +nettest 4138/tcp #nettest +nettest 4138/udp #nettest +oirtgsvc 4141/tcp #Workflow Server +oirtgsvc 4141/udp #Workflow Server +oidocsvc 4142/tcp #Document Server +oidocsvc 4142/udp #Document Server +oidsr 4143/tcp #Document Replication +oidsr 4143/udp #Document Replication +vvr-control 4145/tcp #VVR Control +vvr-control 4145/udp #VVR Control +atlinks 4154/tcp #atlinks device discovery +atlinks 4154/udp #atlinks device discovery +jini-discovery 4160/tcp #Jini Discovery +jini-discovery 4160/udp #Jini Discovery +eims-admin 4199/tcp #EIMS ADMIN +eims-admin 4199/udp #EIMS ADMIN +corelccam 4300/tcp #Corel CCam +corelccam 4300/udp #Corel CCam +rwhois 4321/tcp #Remote Who Is +rwhois 4321/udp #Remote Who Is +unicall 4343/tcp #UNICALL +unicall 4343/udp #UNICALL +vinainstall 4344/tcp #VinaInstall +vinainstall 4344/udp #VinaInstall +m4-network-as 4345/tcp #Macro 4 Network AS +m4-network-as 4345/udp #Macro 4 Network AS +elanlm 4346/tcp #ELAN LM +elanlm 4346/udp #ELAN LM +lansurveyor 4347/tcp #LAN Surveyor +lansurveyor 4347/udp #LAN Surveyor +itose 4348/tcp #ITOSE +itose 4348/udp #ITOSE +fsportmap 4349/tcp #File System Port Map +fsportmap 4349/udp #File System Port Map +net-device 4350/tcp #Net Device +net-device 4350/udp #Net Device +plcy-net-svcs 4351/tcp #PLCY Net Services +plcy-net-svcs 4351/udp #PLCY Net Services +f5-iquery 4353/tcp #F5 iQuery +f5-iquery 4353/udp #F5 iQuery +qsnet-trans 4354/tcp #QSNet Transmitter +qsnet-trans 4354/udp #QSNet Transmitter +qsnet-workst 4355/tcp #QSNet Workstation +qsnet-workst 4355/udp #QSNet Workstation +qsnet-assist 4356/tcp #QSNet Assistant +qsnet-assist 4356/udp #QSNet Assistant +qsnet-cond 4357/tcp #QSNet Conductor +qsnet-cond 4357/udp #QSNet Conductor +qsnet-nucl 4358/tcp #QSNet Nucleus +qsnet-nucl 4358/udp #QSNet Nucleus +beacon-port-2 4426/tcp #SMARTS Beacon Port +saris 4442/tcp #Saris +saris 4442/udp #Saris +pharos 4443/tcp #Pharos +pharos 4443/udp #Pharos +krb524 4444/tcp #KRB524 +krb524 4444/udp #KRB524 +nv-video 4444/tcp #NV Video default +nv-video 4444/udp #NV Video default +upnotifyp 4445/tcp #UPNOTIFYP +upnotifyp 4445/udp #UPNOTIFYP +n1-fwp 4446/tcp #N1-FWP +n1-fwp 4446/udp #N1-FWP +n1-rmgmt 4447/tcp #N1-RMGMT +n1-rmgmt 4447/udp #N1-RMGMT +asc-slmd 4448/tcp #ASC Licence Manager +asc-slmd 4448/udp #ASC Licence Manager +privatewire 4449/tcp #PrivateWire +privatewire 4449/udp #PrivateWire +camp 4450/tcp #Camp +camp 4450/udp #Camp +ctisystemmsg 4451/tcp #CTI System Msg +ctisystemmsg 4451/udp #CTI System Msg +ctiprogramload 4452/tcp #CTI Program Load +ctiprogramload 4452/udp #CTI Program Load +nssalertmgr 4453/tcp #NSS Alert Manager +nssalertmgr 4453/udp #NSS Alert Manager +nssagentmgr 4454/tcp #NSS Agent Manager +nssagentmgr 4454/udp #NSS Agent Manager +prchat-user 4455/tcp #PR Chat User +prchat-user 4455/udp #PR Chat User +prchat-server 4456/tcp #PR Chat Server +prchat-server 4456/udp #PR Chat Server +prRegister 4457/tcp #PR Register +prRegister 4457/udp #PR Register +ipsec-msft 4500/tcp #Microsoft IPsec NAT-T +ipsec-msft 4500/udp #Microsoft IPsec NAT-T +worldscores 4545/tcp #WorldScores +worldscores 4545/udp #WorldScores +sf-lm 4546/tcp #SF License Manager (Sentinel) +sf-lm 4546/udp #SF License Manager (Sentinel) +lanner-lm 4547/tcp #Lanner License Manager +lanner-lm 4547/udp #Lanner License Manager +rsip 4555/tcp #RSIP Port +rsip 4555/udp #RSIP Port +hylafax 4559/tcp #HylaFAX +hylafax 4559/udp #HylaFAX +tram 4567/tcp #TRAM +tram 4567/udp #TRAM +bmc-reporting 4568/tcp #BMC Reporting +bmc-reporting 4568/udp #BMC Reporting +piranha1 4600/tcp #Piranha1 +piranha1 4600/udp #Piranha1 +piranha2 4601/tcp #Piranha2 +piranha2 4601/udp #Piranha2 +smaclmgr 4660/tcp #smaclmgr +smaclmgr 4660/udp #smaclmgr +kar2ouche 4661/tcp #Kar2ouche Peer location service +kar2ouche 4661/udp #Kar2ouche Peer location service +rfa 4672/tcp #remote file access server +rfa 4672/udp #remote file access server +snap 4752/tcp #Simple Network Audio Protocol +snap 4752/udp #Simple Network Audio Protocol +iims 4800/tcp #Icona Instant Messenging System +iims 4800/udp #Icona Instant Messenging System +iwec 4801/tcp #Icona Web Embedded Chat +iwec 4801/udp #Icona Web Embedded Chat +ilss 4802/tcp #Icona License System Server +ilss 4802/udp #Icona License System Server +htcp 4827/tcp #HTCP +htcp 4827/udp #HTCP +varadero-0 4837/tcp #Varadero-0 +varadero-0 4837/udp #Varadero-0 +varadero-1 4838/tcp #Varadero-1 +varadero-1 4838/udp #Varadero-1 +varadero-2 4839/tcp #Varadero-2 +varadero-2 4839/udp #Varadero-2 +appserv-http 4848/tcp #App Server - Admin HTTP +appserv-http 4848/udp #App Server - Admin HTTP +appserv-https 4849/tcp #App Server - Admin HTTPS +appserv-https 4849/udp #App Server - Admin HTTPS +phrelay 4868/tcp #Photon Relay +phrelay 4868/udp #Photon Relay +phrelaydbg 4869/tcp #Photon Relay Debug +phrelaydbg 4869/udp #Photon Relay Debug +abbs 4885/tcp #ABBS +abbs 4885/udp #ABBS +lyskom 4894/tcp #LysKOM Protocol A +lyskom 4894/udp #LysKOM Protocol A +radmin-port 4899/tcp #RAdmin Port +radmin-port 4899/udp #RAdmin Port +att-intercom 4983/tcp #AT&T Intercom +att-intercom 4983/udp #AT&T Intercom +smar-se-port1 4987/tcp #SMAR Ethernet Port 1 +smar-se-port1 4987/udp #SMAR Ethernet Port 1 +smar-se-port2 4988/tcp #SMAR Ethernet Port 2 +smar-se-port2 4988/udp #SMAR Ethernet Port 2 +parallel 4989/tcp #Parallel for GAUSS (tm) +parallel 4989/udp #Parallel for GAUSS (tm) +rfe 5002/tcp #radio free ethernet +rfe 5002/udp #radio free ethernet +fmpro-internal 5003/tcp #FileMaker, Inc. - Proprietary transport +fmpro-internal 5003/udp #FileMaker, Inc. - Proprietary name binding +avt-profile-1 5004/tcp #avt-profile-1 +avt-profile-1 5004/udp #avt-profile-1 +avt-profile-2 5005/tcp #avt-profile-2 +avt-profile-2 5005/udp #avt-profile-2 +wsm-server 5006/tcp #wsm server +wsm-server 5006/udp #wsm server +wsm-server-ssl 5007/tcp #wsm server ssl +wsm-server-ssl 5007/udp #wsm server ssl +synapsis-edge 5008/tcp #Synapsis EDGE +synapsis-edge 5008/udp #Synapsis EDGE +telelpathstart 5010/tcp #TelepathStart +telelpathstart 5010/udp #TelepathStart +telelpathattack 5011/tcp #TelepathAttack +telelpathattack 5011/udp #TelepathAttack +zenginkyo-1 5020/tcp #zenginkyo-1 +zenginkyo-1 5020/udp #zenginkyo-1 +zenginkyo-2 5021/tcp #zenginkyo-2 +zenginkyo-2 5021/udp #zenginkyo-2 +mice 5022/tcp #mice server +mice 5022/udp #mice server +htuilsrv 5023/tcp #Htuil Server for PLD2 +htuilsrv 5023/udp #Htuil Server for PLD2 +scpi-telnet 5024/tcp #SCPI-TELNET +scpi-telnet 5024/udp #SCPI-TELNET +scpi-raw 5025/tcp #SCPI-RAW +scpi-raw 5025/udp #SCPI-RAW +asnaacceler8db 5042/tcp #asnaacceler8db +asnaacceler8db 5042/udp #asnaacceler8db +mmcc 5050/tcp #multimedia conference control tool +mmcc 5050/udp #multimedia conference control tool +ita-agent 5051/tcp #ITA Agent +ita-agent 5051/udp #ITA Agent +ita-manager 5052/tcp #ITA Manager +ita-manager 5052/udp #ITA Manager +unot 5055/tcp #UNOT +unot 5055/udp #UNOT +intecom-ps1 5056/tcp #Intecom PS 1 +intecom-ps1 5056/udp #Intecom PS 1 +intecom-ps2 5057/tcp #Intecom PS 2 +intecom-ps2 5057/udp #Intecom PS 2 +sip 5060/tcp #SIP +sip 5060/udp #SIP +sip-tls 5061/tcp #SIP-TLS +sip-tls 5061/udp #SIP-TLS +ca-1 5064/tcp #Channel Access 1 +ca-1 5064/udp #Channel Access 1 +ca-2 5065/tcp #Channel Access 2 +ca-2 5065/udp #Channel Access 2 +stanag-5066 5066/tcp #STANAG-5066-SUBNET-INTF +stanag-5066 5066/udp #STANAG-5066-SUBNET-INTF +i-net-2000-npr 5069/tcp #I/Net 2000-NPR +i-net-2000-npr 5069/udp #I/Net 2000-NPR +powerschool 5071/tcp #PowerSchool +powerschool 5071/udp #PowerSchool +sdl-ets 5081/tcp #SDL - Ent Trans Server +sdl-ets 5081/udp #SDL - Ent Trans Server +sentinel-lm 5093/tcp #Sentinel LM +sentinel-lm 5093/udp #Sentinel LM +sentlm-srv2srv 5099/tcp #SentLM Srv2Srv +sentlm-srv2srv 5099/udp #SentLM Srv2Srv +talarian-tcp 5101/tcp #Talarian_TCP +talarian-udp 5101/udp #Talarian_UDP +ctsd 5137/tcp #MyCTS server port +ctsd 5137/udp #MyCTS server port +rmonitor_secure 5145/tcp #RMONITOR SECURE +rmonitor_secure 5145/udp #RMONITOR SECURE +atmp 5150/tcp #Ascend Tunnel Management Protocol +atmp 5150/udp #Ascend Tunnel Management Protocol +esri_sde 5151/tcp #ESRI SDE Instance +esri_sde 5151/udp #ESRI SDE Remote Start +sde-discovery 5152/tcp #ESRI SDE Instance Discovery +sde-discovery 5152/udp #ESRI SDE Instance Discovery +bzflag 5154/tcp #BZFlag game server +bzflag 5154/udp #BZFlag game server +ife_icorp 5165/tcp #ife_1corp +ife_icorp 5165/udp #ife_1corp +aol 5190/tcp #America-Online +aol 5190/udp #America-Online +aol-1 5191/tcp #AmericaOnline1 +aol-1 5191/udp #AmericaOnline1 +aol-2 5192/tcp #AmericaOnline2 +aol-2 5192/udp #AmericaOnline2 +aol-3 5193/tcp #AmericaOnline3 +aol-3 5193/udp #AmericaOnline3 +targus-getdata 5200/tcp #TARGUS GetData +targus-getdata 5200/udp #TARGUS GetData +targus-getdata1 5201/tcp #TARGUS GetData 1 +targus-getdata1 5201/udp #TARGUS GetData 1 +targus-getdata2 5202/tcp #TARGUS GetData 2 +targus-getdata2 5202/udp #TARGUS GetData 2 +targus-getdata3 5203/tcp #TARGUS GetData 3 +targus-getdata3 5203/udp #TARGUS GetData 3 +xmpp-client 5222/tcp #XMPP Client Connection +xmpp-client 5222/udp #XMPP Client Connection +hp-server 5225/tcp #HP Server +hp-server 5225/udp #HP Server +hp-status 5226/tcp #HP Status +hp-status 5226/udp #HP Status +igateway 5250/tcp #iGateway +igateway 5250/udp #iGateway +3com-njack-1 5264/tcp #3Com Network Jack Port 1 +3com-njack-1 5264/udp #3Com Network Jack Port 1 +3com-njack-2 5265/tcp #3Com Network Jack Port 2 +3com-njack-2 5265/udp #3Com Network Jack Port 2 +xmpp-server 5269/tcp #XMPP Server Connection +xmpp-server 5269/udp #XMPP Server Connection +pk 5272/tcp #PK +pk 5272/udp #PK +transmit-port 5282/tcp #Marimba Transmitter Port +transmit-port 5282/udp #Marimba Transmitter Port +hacl-hb 5300/tcp ## HA cluster heartbeat +hacl-hb 5300/udp ## HA cluster heartbeat +hacl-gs 5301/tcp ## HA cluster general services +hacl-gs 5301/udp ## HA cluster general services +hacl-cfg 5302/tcp ## HA cluster configuration +hacl-cfg 5302/udp ## HA cluster configuration +hacl-probe 5303/tcp ## HA cluster probing +hacl-probe 5303/udp ## HA cluster probing +hacl-local 5304/tcp ## HA Cluster Commands +hacl-local 5304/udp +hacl-test 5305/tcp ## HA Cluster Test +hacl-test 5305/udp +sun-mc-grp 5306/tcp #Sun MC Group +sun-mc-grp 5306/udp #Sun MC Group +sco-aip 5307/tcp #SCO AIP +sco-aip 5307/udp #SCO AIP +cfengine 5308/tcp #CFengine +cfengine 5308/udp #CFengine +jprinter 5309/tcp #J Printer +jprinter 5309/udp #J Printer +outlaws 5310/tcp #Outlaws +outlaws 5310/udp #Outlaws +permabit-cs 5312/tcp #Permabit Client-Server +permabit-cs 5312/udp #Permabit Client-Server +rrdp 5313/tcp #Real-time & Reliable Data +rrdp 5313/udp #Real-time & Reliable Data +opalis-rbt-ipc 5314/tcp #opalis-rbt-ipc +opalis-rbt-ipc 5314/udp #opalis-rbt-ipc +hacl-poll 5315/tcp #HA Cluster UDP Polling +hacl-poll 5315/udp #HA Cluster UDP Polling +mdns 5353/tcp #Multicast DNS +mdns 5353/udp #Multicast DNS +mdnsresponder 5354/tcp #Multicast DNS Responder IPC +mdnsresponder 5354/udp #Multicast DNS Responder IPC +excerpt 5400/tcp #Excerpt Search +excerpt 5400/udp #Excerpt Search +excerpts 5401/tcp #Excerpt Search Secure +excerpts 5401/udp #Excerpt Search Secure +mftp 5402/tcp #MFTP +mftp 5402/udp #MFTP +hpoms-ci-lstn 5403/tcp #HPOMS-CI-LSTN +hpoms-ci-lstn 5403/udp #HPOMS-CI-LSTN +hpoms-dps-lstn 5404/tcp #HPOMS-DPS-LSTN +hpoms-dps-lstn 5404/udp #HPOMS-DPS-LSTN +netsupport 5405/tcp #NetSupport +netsupport 5405/udp #NetSupport +systemics-sox 5406/tcp #Systemics Sox +systemics-sox 5406/udp #Systemics Sox +foresyte-clear 5407/tcp #Foresyte-Clear +foresyte-clear 5407/udp #Foresyte-Clear +foresyte-sec 5408/tcp #Foresyte-Sec +foresyte-sec 5408/udp #Foresyte-Sec +salient-dtasrv 5409/tcp #Salient Data Server +salient-dtasrv 5409/udp #Salient Data Server +salient-usrmgr 5410/tcp #Salient User Manager +salient-usrmgr 5410/udp #Salient User Manager +actnet 5411/tcp #ActNet +actnet 5411/udp #ActNet +continuus 5412/tcp #Continuus +continuus 5412/udp #Continuus +wwiotalk 5413/tcp #WWIOTALK +wwiotalk 5413/udp #WWIOTALK +statusd 5414/tcp #StatusD +statusd 5414/udp #StatusD +ns-server 5415/tcp #NS Server +ns-server 5415/udp #NS Server +sns-gateway 5416/tcp #SNS Gateway +sns-gateway 5416/udp #SNS Gateway +sns-agent 5417/tcp #SNS Agent +sns-agent 5417/udp #SNS Agent +mcntp 5418/tcp #MCNTP +mcntp 5418/udp #MCNTP +dj-ice 5419/tcp #DJ-ICE +dj-ice 5419/udp #DJ-ICE +cylink-c 5420/tcp #Cylink-C +cylink-c 5420/udp #Cylink-C +netsupport2 5421/tcp #Net Support 2 +netsupport2 5421/udp #Net Support 2 +salient-mux 5422/tcp #Salient MUX +salient-mux 5422/udp #Salient MUX +virtualuser 5423/tcp #VIRTUALUSER +virtualuser 5423/udp #VIRTUALUSER +devbasic 5426/tcp #DEVBASIC +devbasic 5426/udp #DEVBASIC +sco-peer-tta 5427/tcp #SCO-PEER-TTA +sco-peer-tta 5427/udp #SCO-PEER-TTA +telaconsole 5428/tcp #TELACONSOLE +telaconsole 5428/udp #TELACONSOLE +base 5429/tcp #Billing and Accounting System Exchange +base 5429/udp #Billing and Accounting System Exchange +radec-corp 5430/tcp #RADEC CORP +radec-corp 5430/udp #RADEC CORP +park-agent 5431/tcp #PARK AGENT +park-agent 5431/udp #PARK AGENT +postgresql 5432/tcp #PostgreSQL Database +postgresql 5432/udp #PostgreSQL Database +dttl 5435/tcp #Data Tunneling Transceiver Linking (DTTL) +dttl 5435/udp #Data Tunneling Transceiver Linking (DTTL) +apc-5454 5454/tcp #APC 5454 +apc-5454 5454/udp #APC 5454 +apc-5455 5455/tcp #APC 5455 +apc-5455 5455/udp #APC 5455 +apc-5456 5456/tcp #APC 5456 +apc-5456 5456/udp #APC 5456 +silkmeter 5461/tcp #SILKMETER +silkmeter 5461/udp #SILKMETER +ttl-publisher 5462/tcp #TTL Publisher +ttl-publisher 5462/udp #TTL Publisher +ttlpriceproxy 5463/tcp #TTL Price Proxy +ttlpriceproxy 5463/udp #TTL Price Proxy +netops-broker 5465/tcp #NETOPS-BROKER +netops-broker 5465/udp #NETOPS-BROKER +fcp-addr-srvr1 5500/tcp #fcp-addr-srvr1 +fcp-addr-srvr1 5500/udp #fcp-addr-srvr1 +fcp-addr-srvr2 5501/tcp #fcp-addr-srvr2 +fcp-addr-srvr2 5501/udp #fcp-addr-srvr2 +fcp-srvr-inst1 5502/tcp #fcp-srvr-inst1 +fcp-srvr-inst1 5502/udp #fcp-srvr-inst1 +fcp-srvr-inst2 5503/tcp #fcp-srvr-inst2 +fcp-srvr-inst2 5503/udp #fcp-srvr-inst2 +fcp-cics-gw1 5504/tcp #fcp-cics-gw1 +fcp-cics-gw1 5504/udp #fcp-cics-gw1 +sgi-eventmond 5553/tcp #SGI Eventmond Port +sgi-eventmond 5553/udp #SGI Eventmond Port +sgi-esphttp 5554/tcp #SGI ESP HTTP +sgi-esphttp 5554/udp #SGI ESP HTTP +personal-agent 5555/tcp #Personal Agent +personal-agent 5555/udp #Personal Agent +udpplus 5566/tcp #UDPPlus +udpplus 5566/udp #UDPPlus +esinstall 5599/tcp #Enterprise Security Remote Install +esinstall 5599/udp #Enterprise Security Remote Install +esmmanager 5600/tcp #Enterprise Security Manager +esmmanager 5600/udp #Enterprise Security Manager +esmagent 5601/tcp #Enterprise Security Agent +esmagent 5601/udp #Enterprise Security Agent +a1-msc 5602/tcp #A1-MSC +a1-msc 5602/udp #A1-MSC +a1-bs 5603/tcp #A1-BS +a1-bs 5603/udp #A1-BS +a3-sdunode 5604/tcp #A3-SDUNode +a3-sdunode 5604/udp #A3-SDUNode +a4-sdunode 5605/tcp #A4-SDUNode +a4-sdunode 5605/udp #A4-SDUNode +pcanywheredata 5631/tcp #pcANYWHEREdata +pcanywheredata 5631/udp #pcANYWHEREdata +pcanywherestat 5632/tcp #pcANYWHEREstat +pcanywherestat 5632/udp #pcANYWHEREstat +jms 5673/tcp #JACL Message Server +jms 5673/udp #JACL Message Server +hyperscsi-port 5674/tcp #HyperSCSI Port +hyperscsi-port 5674/udp #HyperSCSI Port +v5ua 5675/tcp #V5UA application port +v5ua 5675/udp #V5UA application port +raadmin 5676/tcp #RA Administration +raadmin 5676/udp #RA Administration +questdb2-lnchr 5677/tcp #Quest Central DB2 Launchr +questdb2-lnchr 5677/udp #Quest Central DB2 Launchr +rrac 5678/tcp #Remote Replication Agent Connection +rrac 5678/udp #Remote Replication Agent Connection +dccm 5679/tcp #Direct Cable Connect Manager +dccm 5679/udp #Direct Cable Connect Manager +ggz 5688/tcp #GGZ Gaming Zone +ggz 5688/udp #GGZ Gaming Zone +proshareaudio 5713/tcp #proshare conf audio +proshareaudio 5713/udp #proshare conf audio +prosharevideo 5714/tcp #proshare conf video +prosharevideo 5714/udp #proshare conf video +prosharedata 5715/tcp #proshare conf data +prosharedata 5715/udp #proshare conf data +prosharerequest 5716/tcp #proshare conf request +prosharerequest 5716/udp #proshare conf request +prosharenotify 5717/tcp #proshare conf notify +prosharenotify 5717/udp #proshare conf notify +ms-licensing 5720/tcp #MS-Licensing +ms-licensing 5720/udp #MS-Licensing +openmail 5729/tcp #Openmail User Agent Layer +openmail 5729/udp #Openmail User Agent Layer +unieng 5730/tcp #Steltor's calendar access +unieng 5730/udp #Steltor's calendar access +ida-discover1 5741/tcp #IDA Discover Port 1 +ida-discover1 5741/udp #IDA Discover Port 1 +ida-discover2 5742/tcp #IDA Discover Port 2 +ida-discover2 5742/udp #IDA Discover Port 2 +fcopy-server 5745/tcp #fcopy-server +fcopy-server 5745/udp #fcopy-server +fcopys-server 5746/tcp #fcopys-server +fcopys-server 5746/udp #fcopys-server +openmailg 5755/tcp #OpenMail Desk Gateway server +openmailg 5755/udp #OpenMail Desk Gateway server +x500ms 5757/tcp #OpenMail X.500 Directory Server +x500ms 5757/udp #OpenMail X.500 Directory Server +openmailns 5766/tcp #OpenMail NewMail Server +openmailns 5766/udp #OpenMail NewMail Server +s-openmail 5767/tcp #OpenMail Suer Agent Layer (Secure) +s-openmail 5767/udp #OpenMail Suer Agent Layer (Secure) +openmailpxy 5768/tcp #OpenMail CMTS Server +openmailpxy 5768/udp #OpenMail CMTS Server +netagent 5771/tcp #NetAgent +netagent 5771/udp #NetAgent +dali-port 5777/tcp #DALI Port +dali-port 5777/udp #DALI Port +icmpd 5813/tcp #ICMPD +icmpd 5813/udp #ICMPD +spt-automation 5814/tcp #Support Automation +spt-automation 5814/udp #Support Automation +wherehoo 5859/tcp #WHEREHOO +wherehoo 5859/udp #WHEREHOO +mppolicy-v5 5968/tcp #mppolicy-v5 +mppolicy-v5 5968/udp #mppolicy-v5 +mppolicy-mgr 5969/tcp #mppolicy-mgr +mppolicy-mgr 5969/udp #mppolicy-mgr +wbem-rmi 5987/tcp #WBEM RMI +wbem-rmi 5987/udp #WBEM RMI +wbem-http 5988/tcp #WBEM HTTP +wbem-http 5988/udp #WBEM HTTP +wbem-https 5989/tcp #WBEM HTTPS +wbem-https 5989/udp #WBEM HTTPS +nuxsl 5991/tcp #NUXSL +nuxsl 5991/udp #NUXSL +cvsup 5999/tcp #CVSup +cvsup 5999/udp #CVSup +ndl-ahp-svc 6064/tcp #NDL-AHP-SVC +ndl-ahp-svc 6064/udp #NDL-AHP-SVC +winpharaoh 6065/tcp #WinPharaoh +winpharaoh 6065/udp #WinPharaoh +ewctsp 6066/tcp #EWCTSP +ewctsp 6066/udp #EWCTSP +srb 6067/tcp #SRB +srb 6067/udp #SRB +gsmp 6068/tcp #GSMP +gsmp 6068/udp #GSMP +trip 6069/tcp #TRIP +trip 6069/udp #TRIP +messageasap 6070/tcp #Messageasap +messageasap 6070/udp #Messageasap +ssdtp 6071/tcp #SSDTP +ssdtp 6071/udp #SSDTP +diagnose-proc 6072/tcp #DIAGNOSE-PROC +diagnose-proc 6072/udp #DIAGNOSE-PROC +directplay8 6073/tcp #DirectPlay8 +directplay8 6073/udp #DirectPlay8 +konspire2b 6085/tcp #konspire2b p2p network +konspire2b 6085/udp #konspire2b p2p network +synchronet-db 6100/tcp #SynchroNet-db +synchronet-db 6100/udp #SynchroNet-db +synchronet-rtc 6101/tcp #SynchroNet-rtc +synchronet-rtc 6101/udp #SynchroNet-rtc +synchronet-upd 6102/tcp #SynchroNet-upd +synchronet-upd 6102/udp #SynchroNet-upd +rets 6103/tcp #RETS +rets 6103/udp #RETS +dbdb 6104/tcp #DBDB +dbdb 6104/udp #DBDB +primaserver 6105/tcp #Prima Server +primaserver 6105/udp #Prima Server +mpsserver 6106/tcp #MPS Server +mpsserver 6106/udp #MPS Server +etc-control 6107/tcp #ETC Control +etc-control 6107/udp #ETC Control +sercomm-scadmin 6108/tcp #Sercomm-SCAdmin +sercomm-scadmin 6108/udp #Sercomm-SCAdmin +globecast-id 6109/tcp #GLOBECAST-ID +globecast-id 6109/udp #GLOBECAST-ID +softcm 6110/tcp #HP SoftBench CM +softcm 6110/udp #HP SoftBench CM +spc 6111/tcp #HP SoftBench Sub-Process Control +spc 6111/udp #HP SoftBench Sub-Process Control +dtspcd 6112/tcp #dtspcd +dtspcd 6112/udp #dtspcd +backup-express 6123/tcp #Backup Express +backup-express 6123/udp #Backup Express +meta-corp 6141/tcp #Meta Corporation License Manager +meta-corp 6141/udp #Meta Corporation License Manager +aspentec-lm 6142/tcp #Aspen Technology License Manager +aspentec-lm 6142/udp #Aspen Technology License Manager +watershed-lm 6143/tcp #Watershed License Manager +watershed-lm 6143/udp #Watershed License Manager +statsci1-lm 6144/tcp #StatSci License Manager - 1 +statsci1-lm 6144/udp #StatSci License Manager - 1 +statsci2-lm 6145/tcp #StatSci License Manager - 2 +statsci2-lm 6145/udp #StatSci License Manager - 2 +lonewolf-lm 6146/tcp #Lone Wolf Systems License Manager +lonewolf-lm 6146/udp #Lone Wolf Systems License Manager +montage-lm 6147/tcp #Montage License Manager +montage-lm 6147/udp #Montage License Manager +ricardo-lm 6148/tcp #Ricardo North America License Manager +ricardo-lm 6148/udp #Ricardo North America License Manager +tal-pod 6149/tcp #tal-pod +tal-pod 6149/udp #tal-pod +crip 6253/tcp #CRIP +crip 6253/udp #CRIP +bmc-grx 6300/tcp #BMC GRX +bmc-grx 6300/udp #BMC GRX +emp-server1 6321/tcp #Empress Software Connectivity Server 1 +emp-server1 6321/udp #Empress Software Connectivity Server 1 +emp-server2 6322/tcp #Empress Software Connectivity Server 2 +emp-server2 6322/udp #Empress Software Connectivity Server 2 +sflow 6343/tcp #sFlow traffic monitoring +sflow 6343/udp #sFlow traffic monitoring +gnutella-svc 6346/tcp #gnutella-svc +gnutella-svc 6346/udp #gnutella-svc +gnutella-rtr 6347/tcp #gnutella-rtr +gnutella-rtr 6347/udp #gnutella-rtr +metatude-mds 6382/tcp #Metatude Dialogue Server +metatude-mds 6382/udp #Metatude Dialogue Server +clariion-evr01 6389/tcp #clariion-evr01 +clariion-evr01 6389/udp #clariion-evr01 +skip-cert-recv 6455/tcp #SKIP Certificate Receive +skip-cert-send 6456/tcp #SKIP Certificate Send +lvision-lm 6471/tcp #LVision License Manager +lvision-lm 6471/udp #LVision License Manager +boks 6500/tcp #BoKS Master +boks 6500/udp #BoKS Master +boks_servc 6501/tcp #BoKS Servc +boks_servc 6501/udp #BoKS Servc +boks_servm 6502/tcp #BoKS Servm +boks_servm 6502/udp #BoKS Servm +boks_clntd 6503/tcp #BoKS Clntd +boks_clntd 6503/udp #BoKS Clntd +badm_priv 6505/tcp #BoKS Admin Private Port +badm_priv 6505/udp #BoKS Admin Private Port +badm_pub 6506/tcp #BoKS Admin Public Port +badm_pub 6506/udp #BoKS Admin Public Port +bdir_priv 6507/tcp #BoKS Dir Server, Private Port +bdir_priv 6507/udp #BoKS Dir Server, Private Port +bdir_pub 6508/tcp #BoKS Dir Server, Public Port +bdir_pub 6508/udp #BoKS Dir Server, Public Port +mgcs-mfp-port 6509/tcp #MGCS-MFP Port +mgcs-mfp-port 6509/udp #MGCS-MFP Port +mcer-port 6510/tcp #MCER Port +mcer-port 6510/udp #MCER Port +lds-distrib 6543/tcp #lds_distrib +lds-distrib 6543/udp #lds_distrib +apc-6547 6547/tcp #APC 6547 +apc-6547 6547/udp #APC 6547 +apc-6548 6548/tcp #APC 6548 +apc-6548 6548/udp #APC 6548 +apc-6549 6549/tcp #APC 6549 +apc-6549 6549/udp #APC 6549 +fg-sysupdate 6550/tcp #fg-sysupdate +fg-sysupdate 6550/udp #fg-sysupdate +xdsxdm 6558/tcp +xdsxdm 6558/udp +sane-port 6566/tcp #SANE Control Port +sane-port 6566/udp #SANE Control Port +parsec-master 6580/tcp #Parsec Masterserver +parsec-master 6580/udp #Parsec Masterserver +parsec-peer 6581/tcp #Parsec Peer-to-Peer +parsec-peer 6581/udp #Parsec Peer-to-Peer +parsec-game 6582/tcp #Parsec Gameserver +parsec-game 6582/udp #Parsec Gameserver +afesc-mc 6628/tcp #AFE Stock Channel M/C +afesc-mc 6628/udp #AFE Stock Channel M/C +vocaltec-gold 6670/tcp #Vocaltec Global Online Directory +vocaltec-gold 6670/udp #Vocaltec Global Online Directory +vision_server 6672/tcp #vision_server +vision_server 6672/udp #vision_server +vision_elmd 6673/tcp #vision_elmd +vision_elmd 6673/udp #vision_elmd +kti-icad-srvr 6701/tcp #KTI/ICAD Nameserver +kti-icad-srvr 6701/udp #KTI/ICAD Nameserver +ibprotocol 6714/tcp #Internet Backplane Protocol +ibprotocol 6714/udp #Internet Backplane Protocol +bmc-perf-agent 6767/tcp #BMC PERFORM AGENT +bmc-perf-agent 6767/udp #BMC PERFORM AGENT +bmc-perf-mgrd 6768/tcp #BMC PERFORM MGRD +bmc-perf-mgrd 6768/udp #BMC PERFORM MGRD +smc-http 6788/tcp #SMC-HTTP +smc-http 6788/udp #SMC-HTTP +smc-https 6789/tcp #SMC-HTTPS +smc-https 6789/udp #SMC-HTTPS +hnmp 6790/tcp #HNMP +hnmp 6790/udp #HNMP +ambit-lm 6831/tcp #ambit-lm +ambit-lm 6831/udp #ambit-lm +netmo-default 6841/tcp #Netmo Default +netmo-default 6841/udp #Netmo Default +netmo-http 6842/tcp #Netmo HTTP +netmo-http 6842/udp #Netmo HTTP +iccrushmore 6850/tcp #ICCRUSHMORE +iccrushmore 6850/udp #ICCRUSHMORE +muse 6888/tcp #MUSE +muse 6888/udp #MUSE +jmact3 6961/tcp #JMACT3 +jmact3 6961/udp #JMACT3 +jmevt2 6962/tcp #jmevt2 +jmevt2 6962/udp #jmevt2 +swismgr1 6963/tcp #swismgr1 +swismgr1 6963/udp #swismgr1 +swismgr2 6964/tcp #swismgr2 +swismgr2 6964/udp #swismgr2 +swistrap 6965/tcp #swistrap +swistrap 6965/udp #swistrap +swispol 6966/tcp #swispol +swispol 6966/udp #swispol +acmsoda 6969/tcp #acmsoda +acmsoda 6969/udp #acmsoda +iatp-highpri 6998/tcp #IATP-highPri +iatp-highpri 6998/udp #IATP-highPri +iatp-normalpri 6999/tcp #IATP-normalPri +iatp-normalpri 6999/udp #IATP-normalPri +afs3-fileserver 7000/tcp #file server itself +afs3-fileserver 7000/udp #file server itself +afs3-callback 7001/tcp #callbacks to cache managers +afs3-callback 7001/udp #callbacks to cache managers +afs3-prserver 7002/tcp #users & groups database +afs3-prserver 7002/udp #users & groups database +afs3-vlserver 7003/tcp #volume location database +afs3-vlserver 7003/udp #volume location database +afs3-kaserver 7004/tcp #AFS/Kerberos authentication service +afs3-kaserver 7004/udp #AFS/Kerberos authentication service +afs3-volser 7005/tcp #volume managment server +afs3-volser 7005/udp #volume managment server +afs3-errors 7006/tcp #error interpretation service +afs3-errors 7006/udp #error interpretation service +afs3-bos 7007/tcp #basic overseer process +afs3-bos 7007/udp #basic overseer process +afs3-update 7008/tcp #server-to-server updater +afs3-update 7008/udp #server-to-server updater +afs3-rmtsys 7009/tcp #remote cache manager service +afs3-rmtsys 7009/udp #remote cache manager service +ups-onlinet 7010/tcp #onlinet uninterruptable power supplies +ups-onlinet 7010/udp #onlinet uninterruptable power supplies +talon-disc 7011/tcp #Talon Discovery Port +talon-disc 7011/udp #Talon Discovery Port +talon-engine 7012/tcp #Talon Engine +talon-engine 7012/udp #Talon Engine +microtalon-dis 7013/tcp #Microtalon Discovery +microtalon-dis 7013/udp #Microtalon Discovery +microtalon-com 7014/tcp #Microtalon Communications +microtalon-com 7014/udp #Microtalon Communications +talon-webserver 7015/tcp #Talon Webserver +talon-webserver 7015/udp #Talon Webserver +dpserve 7020/tcp #DP Serve +dpserve 7020/udp #DP Serve +dpserveadmin 7021/tcp #DP Serve Admin +dpserveadmin 7021/udp #DP Serve Admin +op-probe 7030/tcp #ObjectPlanet probe +op-probe 7030/udp #ObjectPlanet probe +arcp 7070/tcp #ARCP +arcp 7070/udp #ARCP +lazy-ptop 7099/tcp #lazy-ptop +lazy-ptop 7099/udp #lazy-ptop +font-service 7100/tcp #X Font Service +font-service 7100/udp #X Font Service +virprot-lm 7121/tcp #Virtual Prototypes License Manager +virprot-lm 7121/udp #Virtual Prototypes License Manager +clutild 7174/tcp #Clutild +clutild 7174/udp #Clutild +fodms 7200/tcp #FODMS FLIP +fodms 7200/udp #FODMS FLIP +dlip 7201/tcp #DLIP +dlip 7201/udp #DLIP +ramp 7227/tcp #Registry A & M Protocol +ramp 7227/udp #Registry A $ M Protocol +itactionserver1 7280/tcp #ITACTIONSERVER 1 +itactionserver1 7280/udp #ITACTIONSERVER 1 +itactionserver2 7281/tcp #ITACTIONSERVER 2 +itactionserver2 7281/udp #ITACTIONSERVER 2 +mindfilesys 7391/tcp #mind-file system server +mindfilesys 7391/udp #mind-file system server +mrssrendezvous 7392/tcp #mrss-rendezvous server +mrssrendezvous 7392/udp #mrss-rendezvous server +winqedit 7395/tcp #winqedit +winqedit 7395/udp #winqedit +pmdmgr 7426/tcp #OpenView DM Postmaster Manager +pmdmgr 7426/udp #OpenView DM Postmaster Manager +oveadmgr 7427/tcp #OpenView DM Event Agent Manager +oveadmgr 7427/udp #OpenView DM Event Agent Manager +ovladmgr 7428/tcp #OpenView DM Log Agent Manager +ovladmgr 7428/udp #OpenView DM Log Agent Manager +opi-sock 7429/tcp #OpenView DM rqt communication +opi-sock 7429/udp #OpenView DM rqt communication +xmpv7 7430/tcp #OpenView DM xmpv7 api pipe +xmpv7 7430/udp #OpenView DM xmpv7 api pipe +pmd 7431/tcp #OpenView DM ovc/xmpv3 api pipe +pmd 7431/udp #OpenView DM ovc/xmpv3 api pipe +faximum 7437/tcp #Faximum +faximum 7437/udp #Faximum +telops-lmd 7491/tcp #telops-lmd +telops-lmd 7491/udp #telops-lmd +silhouette 7500/tcp #Silhouette User +silhouette 7500/udp #Silhouette User +ovbus 7501/tcp #HP OpenView Bus Daemon +ovbus 7501/udp #HP OpenView Bus Daemon +ovhpas 7510/tcp #HP OpenView Application Server +ovhpas 7510/udp #HP OpenView Application Server +pafec-lm 7511/tcp #pafec-lm +pafec-lm 7511/udp #pafec-lm +nta-ds 7544/tcp #FlowAnalyzer DisplayServer +nta-ds 7544/udp #FlowAnalyzer DisplayServer +nta-us 7545/tcp #FlowAnalyzer UtilityServer +nta-us 7545/udp #FlowAnalyzer UtilityServer +vsi-omega 7566/tcp #VSI Omega +vsi-omega 7566/udp #VSI Omega +aries-kfinder 7570/tcp #Aries Kfinder +aries-kfinder 7570/udp #Aries Kfinder +sun-lm 7588/tcp #Sun License Manager +sun-lm 7588/udp #Sun License Manager +indi 7624/tcp #Instrument Neutral Distributed Interface +indi 7624/udp #Instrument Neutral Distributed Interface +pmdfmgt 7633/tcp #PMDF Management +pmdfmgt 7633/udp #PMDF Management +imqtunnels 7674/tcp #iMQ SSL tunnel +imqtunnels 7674/udp #iMQ SSL tunnel +imqtunnel 7675/tcp #iMQ Tunnel +imqtunnel 7675/udp #iMQ Tunnel +imqbrokerd 7676/tcp #iMQ Broker Rendezvous +imqbrokerd 7676/udp #iMQ Broker Rendezvous +medimageportal 7720/tcp #MedImage Portal +medimageportal 7720/udp #MedImage Portal +sstp-1 7743/tcp #Sakura Script Transfer Protocol +sstp-1 7743/udp #Sakura Script Transfer Protocol +cbt 7777/tcp #cbt +cbt 7777/udp #cbt +interwise 7778/tcp #Interwise +interwise 7778/udp #Interwise +vstat 7779/tcp #VSTAT +vstat 7779/udp #VSTAT +accu-lmgr 7781/tcp #accu-lmgr +accu-lmgr 7781/udp #accu-lmgr +minivend 7786/tcp #MINIVEND +minivend 7786/udp #MINIVEND +pnet-conn 7797/tcp #Propel Connector port +pnet-conn 7797/udp #Propel Connector port +pnet-enc 7798/tcp #Propel Encoder port +pnet-enc 7798/udp #Propel Encoder port +apc-7845 7845/tcp #APC 7845 +apc-7845 7845/udp #APC 7845 +apc-7846 7846/tcp #APC 7846 +apc-7846 7846/udp #APC 7846 +qo-secure 7913/tcp #QuickObjects secure port +qo-secure 7913/udp #QuickObjects secure port +t2-drm 7932/tcp #Tier 2 Data Resource Manager +t2-drm 7932/udp #Tier 2 Data Resource Manager +t2-brm 7933/tcp #Tier 2 Business Rules Manager +t2-brm 7933/udp #Tier 2 Business Rules Manager +supercell 7967/tcp #Supercell +supercell 7967/udp #Supercell +micromuse-ncps 7979/tcp #Micromuse-ncps +micromuse-ncps 7979/udp #Micromuse-ncps +quest-vista 7980/tcp #Quest Vista +quest-vista 7980/udp #Quest Vista +irdmi2 7999/tcp #iRDMI2 +irdmi2 7999/udp #iRDMI2 +irdmi 8000/tcp #iRDMI +irdmi 8000/udp #iRDMI +vcom-tunnel 8001/tcp #VCOM Tunnel +vcom-tunnel 8001/udp #VCOM Tunnel +teradataordbms 8002/tcp #Teradata ORDBMS +teradataordbms 8002/udp #Teradata ORDBMS +http-alt 8008/tcp #HTTP Alternate +http-alt 8008/udp #HTTP Alternate +oa-system 8022/tcp #oa-system +oa-system 8022/udp #oa-system +pro-ed 8032/tcp #ProEd +pro-ed 8032/udp #ProEd +mindprint 8033/tcp #MindPrint +mindprint 8033/udp #MindPrint +http-alt 8080/tcp #HTTP Alternate (see port 80) +http-alt 8080/udp #HTTP Alternate (see port 80) +radan-http 8088/tcp #Radan HTTP +radan-http 8088/udp #Radan HTTP +xprint-server 8100/tcp #Xprint Server +xprint-server 8100/udp #Xprint Server +mtl8000-matrix 8115/tcp #MTL8000 Matrix +mtl8000-matrix 8115/udp #MTL8000 Matrix +cp-cluster 8116/tcp #Check Point Clustering +cp-cluster 8116/udp #Check Point Clustering +privoxy 8118/tcp #Privoxy HTTP proxy +privoxy 8118/udp #Privoxy HTTP proxy +apollo-data 8121/tcp #Apollo Data Port +apollo-data 8121/udp #Apollo Data Port +apollo-admin 8122/tcp #Apollo Admin Port +apollo-admin 8122/udp #Apollo Admin Port +indigo-vrmi 8130/tcp #INDIGO-VRMI +indigo-vrmi 8130/udp #INDIGO-VRMI +indigo-vbcp 8131/tcp #INDIGO-VBCP +indigo-vbcp 8131/udp #INDIGO-VBCP +dbabble 8132/tcp #dbabble +dbabble 8132/udp #dbabble +patrol 8160/tcp #Patrol +patrol 8160/udp #Patrol +patrol-snmp 8161/tcp #Patrol SNMP +patrol-snmp 8161/udp #Patrol SNMP +vvr-data 8199/tcp #VVR DATA +vvr-data 8199/udp #VVR DATA +trivnet1 8200/tcp #TRIVNET +trivnet1 8200/udp #TRIVNET +trivnet2 8201/tcp #TRIVNET +trivnet2 8201/udp #TRIVNET +lm-perfworks 8204/tcp #LM Perfworks +lm-perfworks 8204/udp #LM Perfworks +lm-instmgr 8205/tcp #LM Instmgr +lm-instmgr 8205/udp #LM Instmgr +lm-dta 8206/tcp #LM Dta +lm-dta 8206/udp #LM Dta +lm-sserver 8207/tcp #LM SServer +lm-sserver 8207/udp #LM SServer +lm-webwatcher 8208/tcp #LM Webwatcher +lm-webwatcher 8208/udp #LM Webwatcher +server-find 8351/tcp #Server Find +server-find 8351/udp #Server Find +cruise-enum 8376/tcp #Cruise ENUM +cruise-enum 8376/udp #Cruise ENUM +cruise-swroute 8377/tcp #Cruise SWROUTE +cruise-swroute 8377/udp #Cruise SWROUTE +cruise-config 8378/tcp #Cruise CONFIG +cruise-config 8378/udp #Cruise CONFIG +cruise-diags 8379/tcp #Cruise DIAGS +cruise-diags 8379/udp #Cruise DIAGS +cruise-update 8380/tcp #Cruise UPDATE +cruise-update 8380/udp #Cruise UPDATE +cvd 8400/tcp #cvd +cvd 8400/udp #cvd +sabarsd 8401/tcp #sabarsd +sabarsd 8401/udp #sabarsd +abarsd 8402/tcp #abarsd +abarsd 8402/udp #abarsd +admind 8403/tcp #admind +admind 8403/udp #admind +espeech 8416/tcp #eSpeech Session Protocol +espeech 8416/udp #eSpeech Session Protocol +espeech-rtp 8417/tcp #eSpeech RTP Protocol +espeech-rtp 8417/udp #eSpeech RTP Protocol +pcsync-https 8443/tcp #PCsync HTTPS +pcsync-https 8443/udp #PCsync HTTPS +pcsync-http 8444/tcp #PCsync HTTP +pcsync-http 8444/udp #PCsync HTTP +npmp 8450/tcp #npmp +npmp 8450/udp #npmp +vp2p 8473/tcp #Virtual Point to Point +vp2p 8473/udp #Virtual Point to Point +fde 8500/tcp #Flight Data Exchange +fde 8500/udp #Flight Data Exchange +rtsp-alt 8554/tcp #RTSP Alternate (see port 554) +rtsp-alt 8554/udp #RTSP Alternate (see port 554) +d-fence 8555/tcp #SYMAX D-FENCE +d-fence 8555/udp #SYMAX D-FENCE +canon-bjnp1 8611/tcp #Canon BJNP Port 1 +canon-bjnp1 8611/udp #Canon BJNP Port 1 +canon-bjnp2 8612/tcp #Canon BJNP Port 2 +canon-bjnp2 8612/udp #Canon BJNP Port 2 +canon-bjnp3 8613/tcp #Canon BJNP Port 3 +canon-bjnp3 8613/udp #Canon BJNP Port 3 +canon-bjnp4 8614/tcp #Canon BJNP Port 4 +canon-bjnp4 8614/udp #Canon BJNP Port 4 +ibus 8733/tcp #iBus +ibus 8733/udp #iBus +mc-appserver 8763/tcp #MC-APPSERVER +mc-appserver 8763/udp #MC-APPSERVER +openqueue 8764/tcp #OPENQUEUE +openqueue 8764/udp #OPENQUEUE +ultraseek-http 8765/tcp #Ultraseek HTTP +ultraseek-http 8765/udp #Ultraseek HTTP +msgclnt 8786/tcp #Message Client +msgclnt 8786/udp #Message Client +msgsrvr 8787/tcp #Message Server +msgsrvr 8787/udp #Message Server +truecm 8804/tcp #truecm +truecm 8804/udp #truecm +cddbp-alt 8880/tcp #CDDBP +cddbp-alt 8880/udp #CDDBP +ddi-tcp-1 8888/tcp #NewsEDGE server TCP (TCP 1) +ddi-udp-1 8888/udp #NewsEDGE server UDP (UDP 1) +ddi-tcp-2 8889/tcp #Desktop Data TCP 1 +ddi-udp-2 8889/udp #NewsEDGE server broadcast +ddi-tcp-3 8890/tcp #Desktop Data TCP 2 +ddi-udp-3 8890/udp #NewsEDGE client broadcast +ddi-tcp-4 8891/tcp #Desktop Data TCP 3: NESS application +ddi-udp-4 8891/udp #Desktop Data UDP 3: NESS application +ddi-tcp-5 8892/tcp #Desktop Data TCP 4: FARM product +ddi-udp-5 8892/udp #Desktop Data UDP 4: FARM product +ddi-tcp-6 8893/tcp #Desktop Data TCP 5: NewsEDGE/Web application +ddi-udp-6 8893/udp #Desktop Data UDP 5: NewsEDGE/Web application +ddi-tcp-7 8894/tcp #Desktop Data TCP 6: COAL application +ddi-udp-7 8894/udp #Desktop Data UDP 6: COAL application +jmb-cds1 8900/tcp #JMB-CDS 1 +jmb-cds1 8900/udp #JMB-CDS 1 +jmb-cds2 8901/tcp #JMB-CDS 2 +jmb-cds2 8901/udp #JMB-CDS 2 +manyone-http 8910/tcp #manyone-http +manyone-http 8910/udp #manyone-http +manyone-xml 8911/tcp #manyone-xml +manyone-xml 8911/udp #manyone-xml +cumulus-admin 8954/tcp #Cumulus Admin Port +cumulus-admin 8954/udp #Cumulus Admin Port +bctp 8999/tcp #Brodos Crypto Trade Protocol +bctp 8999/udp #Brodos Crypto Trade Protocol +cslistener 9000/tcp #CSlistener +cslistener 9000/udp #CSlistener +etlservicemgr 9001/tcp #ETL Service Manager +etlservicemgr 9001/udp #ETL Service Manager +dynamid 9002/tcp #DynamID authentication +dynamid 9002/udp #DynamID authentication +tambora 9020/tcp #TAMBORA +tambora 9020/udp #TAMBORA +panagolin-ident 9021/tcp #Pangolin Identification +panagolin-ident 9021/udp #Pangolin Identification +paragent 9022/tcp #PrivateArk Remote Agent +paragent 9022/udp #PrivateArk Remote Agent +swa-1 9023/tcp #Secure Web Access - 1 +swa-1 9023/udp #Secure Web Access - 1 +swa-2 9024/tcp #Secure Web Access - 2 +swa-2 9024/udp #Secure Web Access - 2 +swa-3 9025/tcp #Secure Web Access - 3 +swa-3 9025/udp #Secure Web Access - 3 +swa-4 9026/tcp #Secure Web Access - 4 +swa-4 9026/udp #Secure Web Access - 4 +glrpc 9080/tcp #Groove GLRPC +glrpc 9080/udp #Groove GLRPC +websm 9090/tcp #WebSM +websm 9090/udp #WebSM +xmltec-xmlmail 9091/tcp #xmltec-xmlmail +xmltec-xmlmail 9091/udp #xmltec-xmlmail +hp-pdl-datastr 9100/tcp #PDL Data Streaming Port +hp-pdl-datastr 9100/udp #PDL Data Streaming Port +pdl-datastream 9100/tcp #Printer PDL Data Stream +pdl-datastream 9100/udp #Printer PDL Data Stream +bacula-dir 9101/tcp #Bacula Director +bacula-dir 9101/udp #Bacula Director +bacula-fd 9102/tcp #Bacula File Daemon +bacula-fd 9102/udp #Bacula File Daemon +bacula-sd 9103/tcp #Bacula Storage Daemon +bacula-sd 9103/udp #Bacula Storage Daemon +peerwire 9104/tcp #PeerWire +peerwire 9104/udp #PeerWire +netlock1 9160/tcp #NetLOCK1 +netlock1 9160/udp #NetLOCK1 +netlock2 9161/tcp #NetLOCK2 +netlock2 9161/udp #NetLOCK2 +netlock3 9162/tcp #NetLOCK3 +netlock3 9162/udp #NetLOCK3 +netlock4 9163/tcp #NetLOCK4 +netlock4 9163/udp #NetLOCK4 +netlock5 9164/tcp #NetLOCK5 +netlock5 9164/udp #NetLOCK5 +wap-wsp 9200/tcp #WAP connectionless session service +wap-wsp 9200/udp #WAP connectionless session service +wap-wsp-wtp 9201/tcp #WAP session service +wap-wsp-wtp 9201/udp #WAP session service +wap-wsp-s 9202/tcp #WAP secure connectionless session service +wap-wsp-s 9202/udp #WAP secure connectionless session service +wap-wsp-wtp-s 9203/tcp #WAP secure session service +wap-wsp-wtp-s 9203/udp #WAP secure session service +wap-vcard 9204/tcp #WAP vCard +wap-vcard 9204/udp #WAP vCard +wap-vcal 9205/tcp #WAP vCal +wap-vcal 9205/udp #WAP vCal +wap-vcard-s 9206/tcp #WAP vCard Secure +wap-vcard-s 9206/udp #WAP vCard Secure +wap-vcal-s 9207/tcp #WAP vCal Secure +wap-vcal-s 9207/udp #WAP vCal Secure +oma-mlp 9210/tcp #OMA Mobile Location Protocol +oma-mlp 9210/udp #OMA Mobile Location Protocol +oma-mlp-s 9211/tcp #OMA Mobile Location Protocol Secure +oma-mlp-s 9211/udp #OMA Mobile Location Protocol Secure +fsc-port 9217/tcp #FSC Communication Port +fsc-port 9217/udp #FSC Communication Port +swtp-port1 9281/tcp #SofaWare transport port 1 +swtp-port1 9281/udp #SofaWare transport port 1 +swtp-port2 9282/tcp #SofaWare transport port 2 +swtp-port2 9282/udp #SofaWare transport port 2 +callwaveiam 9283/tcp #CallWaveIAM +callwaveiam 9283/udp #CallWaveIAM +visd 9284/tcp #VERITAS Information Serve +visd 9284/udp #VERITAS Information Serve +n2h2server 9285/tcp #N2H2 Filter Service Port +n2h2server 9285/udp #N2H2 Filter Service Port +cumulus 9287/tcp #Cumulus +cumulus 9287/udp #Cumulus +armtechdaemon 9292/tcp #ArmTech Daemon +armtechdaemon 9292/udp #ArmTech Daemon +guibase 9321/tcp #guibase +guibase 9321/udp #guibase +mpidcmgr 9343/tcp #MpIdcMgr +mpidcmgr 9343/udp #MpIdcMgr +mphlpdmc 9344/tcp #Mphlpdmc +mphlpdmc 9344/udp #Mphlpdmc +ctechlicensing 9346/tcp #C Tech Licensing +ctechlicensing 9346/udp #C Tech Licensing +fjdmimgr 9374/tcp #fjdmimgr +fjdmimgr 9374/udp #fjdmimgr +fjinvmgr 9396/tcp #fjinvmgr +fjinvmgr 9396/udp #fjinvmgr +mpidcagt 9397/tcp #MpIdcAgt +mpidcagt 9397/udp #MpIdcAgt +ismserver 9500/tcp #ismserver +ismserver 9500/udp #ismserver +mngsuite 9535/tcp #Management Suite Remote Control +mngsuite 9535/udp #Management Suite Remote Control +msgsys 9594/tcp #Message System +msgsys 9594/udp #Message System +pds 9595/tcp #Ping Discovery Service +pds 9595/udp #Ping Discovery Service +micromuse-ncpw 9600/tcp #MICROMUSE-NCPW +micromuse-ncpw 9600/udp #MICROMUSE-NCPW +streamcomm-ds 9612/tcp #StreamComm User Directory +streamcomm-ds 9612/udp #StreamComm User Directory +l5nas-parchan 9747/tcp #L5NAS Parallel Channel +l5nas-parchan 9747/udp #L5NAS Parallel Channel +rasadv 9753/tcp #rasadv +rasadv 9753/udp #rasadv +davsrc 9800/tcp #WebDav Source Port +davsrc 9800/udp #WebDav Source Port +sstp-2 9801/tcp #Sakura Script Transfer Protocol-2 +sstp-2 9801/udp #Sakura Script Transfer Protocol-2 +davsrcs 9802/tcp #WebDAV Source TLS/SSL +davsrcs 9802/udp #WebDAV Source TLS/SSL +sapv1 9875/tcp #Session Announcement v1 +sapv1 9875/udp #Session Announcement v1 +sd 9876/tcp #Session Director +sd 9876/udp #Session Director +cyborg-systems 9888/tcp #CYBORG Systems +cyborg-systems 9888/udp #CYBORG Systems +monkeycom 9898/tcp #MonkeyCom +monkeycom 9898/udp #MonkeyCom +sctp-tunneling 9899/tcp #SCTP TUNNELING +sctp-tunneling 9899/udp #SCTP TUNNELING +iua 9900/tcp #IUA +iua 9900/udp #IUA +domaintime 9909/tcp #domaintime +domaintime 9909/udp #domaintime +sype-transport 9911/tcp #SYPECom Transport Protocol +sype-transport 9911/udp #SYPECom Transport Protocol +apc-9950 9950/tcp #APC 9950 +apc-9950 9950/udp #APC 9950 +apc-9951 9951/tcp #APC 9951 +apc-9951 9951/udp #APC 9951 +apc-9952 9952/tcp #APC 9952 +apc-9952 9952/udp #APC 9952 +osm-appsrvr 9990/tcp #OSM Applet Server +osm-appsrvr 9990/udp #OSM Applet Server +osm-oev 9991/tcp #OSM Event Server +osm-oev 9991/udp #OSM Event Server +palace-1 9992/tcp #OnLive-1 +palace-1 9992/udp #OnLive-1 +palace-2 9993/tcp #OnLive-2 +palace-2 9993/udp #OnLive-2 +palace-3 9994/tcp #OnLive-3 +palace-3 9994/udp #OnLive-3 +palace-4 9995/tcp #Palace-4 +palace-4 9995/udp #Palace-4 +palace-5 9996/tcp #Palace-5 +palace-5 9996/udp #Palace-5 +palace-6 9997/tcp #Palace-6 +palace-6 9997/udp #Palace-6 +distinct32 9998/tcp #Distinct32 +distinct32 9998/udp #Distinct32 +distinct 9999/tcp #distinct +distinct 9999/udp #distinct +ndmp 10000/tcp #Network Data Management Protocol +ndmp 10000/udp #Network Data Management Protocol +scp-config 10001/tcp #SCP Configuration Port +scp-config 10001/udp #SCP Configuration Port +mvs-capacity 10007/tcp #MVS Capacity +mvs-capacity 10007/udp #MVS Capacity +octopus 10008/tcp #Octopus Multiplexer +octopus 10008/udp #Octopus Multiplexer +amanda 10080/tcp #Amanda +amanda 10080/udp #Amanda +itap-ddtp 10100/tcp #VERITAS ITAP DDTP +itap-ddtp 10100/udp #VERITAS ITAP DDTP +ezmeeting-2 10101/tcp #eZmeeting +ezmeeting-2 10101/udp #eZmeeting +ezproxy-2 10102/tcp #eZproxy +ezproxy-2 10102/udp #eZproxy +ezrelay 10103/tcp #eZrelay +ezrelay 10103/udp #eZrelay +bctp-server 10107/tcp #VERITAS BCTP, server +bctp-server 10107/udp #VERITAS BCTP, server +netiq-endpoint 10113/tcp #NetIQ Endpoint +netiq-endpoint 10113/udp #NetIQ Endpoint +netiq-qcheck 10114/tcp #NetIQ Qcheck +netiq-qcheck 10114/udp #NetIQ Qcheck +netiq-endpt 10115/tcp #NetIQ Endpoint +netiq-endpt 10115/udp #NetIQ Endpoint +netiq-voipa 10116/tcp #NetIQ VoIP Assessor +netiq-voipa 10116/udp #NetIQ VoIP Assessor +bmc-perf-sd 10128/tcp #BMC-PERFORM-SERVICE DAEMON +bmc-perf-sd 10128/udp #BMC-PERFORM-SERVICE DAEMON +apollo-relay 10252/tcp #Apollo Relay Port +apollo-relay 10252/udp #Apollo Relay Port +axis-wimp-port 10260/tcp #Axis WIMP Port +axis-wimp-port 10260/udp #Axis WIMP Port +blocks 10288/tcp #Blocks +blocks 10288/udp #Blocks +rmiaux 10990/tcp #Auxiliary RMI Port +rmiaux 10990/udp #Auxiliary RMI Port +irisa 11000/tcp #IRISA +irisa 11000/udp #IRISA +metasys 11001/tcp #Metasys +metasys 11001/udp #Metasys +vce 11111/tcp #Viral Computing Environment (VCE) +vce 11111/udp #Viral Computing Environment (VCE) +smsqp 11201/tcp #smsqp +smsqp 11201/udp #smsqp +imip 11319/tcp #IMIP +imip 11319/udp #IMIP +imip-channels 11320/tcp #IMIP Channels Port +imip-channels 11320/udp #IMIP Channels Port +arena-server 11321/tcp #Arena Server Listen +arena-server 11321/udp #Arena Server Listen +atm-uhas 11367/tcp #ATM UHAS +atm-uhas 11367/udp #ATM UHAS +hkp 11371/tcp #OpenPGP HTTP Keyserver +hkp 11371/udp #OpenPGP HTTP Keyserver +tempest-port 11600/tcp #Tempest Protocol Port +tempest-port 11600/udp #Tempest Protocol Port +h323callsigalt 11720/tcp #h323 Call Signal Alternate +h323callsigalt 11720/udp #h323 Call Signal Alternate +intrepid-ssl 11751/tcp #Intrepid SSL +intrepid-ssl 11751/udp #Intrepid SSL +sysinfo-sp 11967/tcp #SysInfo Service Protocol +sysinfo-sp 11967/udp #SysInfo Sercice Protocol +entextxid 12000/tcp #IBM Enterprise Extender SNA XID Exchange +entextxid 12000/udp #IBM Enterprise Extender SNA XID Exchange +entextnetwk 12001/tcp #IBM Enterprise Extender SNA COS Network Priority +entextnetwk 12001/udp #IBM Enterprise Extender SNA COS Network Priority +entexthigh 12002/tcp #IBM Enterprise Extender SNA COS High Priority +entexthigh 12002/udp #IBM Enterprise Extender SNA COS High Priority +entextmed 12003/tcp #IBM Enterprise Extender SNA COS Medium Priority +entextmed 12003/udp #IBM Enterprise Extender SNA COS Medium Priority +entextlow 12004/tcp #IBM Enterprise Extender SNA COS Low Priority +entextlow 12004/udp #IBM Enterprise Extender SNA COS Low Priority +dbisamserver1 12005/tcp #DBISAM Database Server - Regular +dbisamserver1 12005/udp #DBISAM Database Server - Regular +dbisamserver2 12006/tcp #DBISAM Database Server - Admin +dbisamserver2 12006/udp #DBISAM Database Server - Admin +rets-ssl 12109/tcp #RETS over SSL +rets-ssl 12109/udp #RETS over SSL +hivep 12172/tcp #HiveP +hivep 12172/udp #HiveP +italk 12345/tcp #Italk Chat System +italk 12345/udp #Italk Chat System +tsaf 12753/tcp #tsaf port +tsaf 12753/udp #tsaf port +i-zipqd 13160/tcp #I-ZIPQD +i-zipqd 13160/udp #I-ZIPQD +powwow-client 13223/tcp #PowWow Client +powwow-client 13223/udp #PowWow Client +powwow-server 13224/tcp #PowWow Server +powwow-server 13224/udp #PowWow Server +bprd 13720/tcp #BPRD Protocol (VERITAS NetBackup) +bprd 13720/udp #BPRD Protocol (VERITAS NetBackup) +bpdbm 13721/tcp #BPDBM Protocol (VERITAS NetBackup) +bpdbm 13721/udp #BPDBM Protocol (VERITAS NetBackup) +bpjava-msvc 13722/tcp #BP Java MSVC Protocol +bpjava-msvc 13722/udp #BP Java MSVC Protocol +vnetd 13724/tcp #Veritas Network Utility +vnetd 13724/udp #Veritas Network Utility +bpcd 13782/tcp #VERITAS NetBackup +bpcd 13782/udp #VERITAS NetBackup +vopied 13783/tcp #VOPIED Protocol +vopied 13783/udp #VOPIED Protocol +dsmcc-config 13818/tcp #DSMCC Config +dsmcc-config 13818/udp #DSMCC Config +dsmcc-session 13819/tcp #DSMCC Session Messages +dsmcc-session 13819/udp #DSMCC Session Messages +dsmcc-passthru 13820/tcp #DSMCC Pass-Thru Messages +dsmcc-passthru 13820/udp #DSMCC Pass-Thru Messages +dsmcc-download 13821/tcp #DSMCC Download Protocol +dsmcc-download 13821/udp #DSMCC Download Protocol +dsmcc-ccp 13822/tcp #DSMCC Channel Change Protocol +dsmcc-ccp 13822/udp #DSMCC Channel Change Protocol +sua 14001/tcp #SUA +sua 14001/udp #De-Registered (2001 June 06) +sage-best-com1 14033/tcp #sage Best! Config Server 1 +sage-best-com1 14033/udp #sage Best! Config Server 1 +sage-best-com2 14034/tcp #sage Best! Config Server 2 +sage-best-com2 14034/udp #sage Best! Config Server 2 +vcs-app 14141/tcp #VCS Application +vcs-app 14141/udp #VCS Application +gcm-app 14145/tcp #GCM Application +gcm-app 14145/udp #GCM Application +vrts-tdd 14149/tcp #Veritas Traffic Director +vrts-tdd 14149/udp #Veritas Traffic Director +hde-lcesrvr-1 14936/tcp #hde-lcesrvr-1 +hde-lcesrvr-1 14936/udp #hde-lcesrvr-1 +hde-lcesrvr-2 14937/tcp #hde-lcesrvr-2 +hde-lcesrvr-2 14937/udp #hde-lcesrvr-2 +hydap 15000/tcp #Hypack Data Aquisition +hydap 15000/udp #Hypack Data Aquisition +xpilot 15345/tcp #XPilot Contact Port +xpilot 15345/udp #XPilot Contact Port +3link 15363/tcp #3Link Negotiation +3link 15363/udp #3Link Negotiation +sun-sea-port 16161/tcp #Solaris SEA Port +sun-sea-port 16161/udp #Solaris SEA Port +netserialext1 16360/tcp #netserialext1 +netserialext1 16360/udp #netserialext1 +netserialext2 16361/tcp #netserialext2 +netserialext2 16361/udp #netserialext2 +netserialext3 16367/tcp #netserialext3 +netserialext3 16367/udp #netserialext3 +netserialext4 16368/tcp #netserialext4 +netserialext4 16368/udp #netserialext4 +connected 16384/tcp #Connected Corp +connected 16384/udp #Connected Corp +intel-rci-mp 16991/tcp #INTEL-RCI-MP +intel-rci-mp 16991/udp #INTEL-RCI-MP +soundsvirtual 17185/tcp #Sounds Virtual +soundsvirtual 17185/udp #Sounds Virtual +chipper 17219/tcp #Chipper +chipper 17219/udp #Chipper +biimenu 18000/tcp #Beckman Instruments, Inc. +biimenu 18000/udp #Beckman Instruments, Inc. +opsec-cvp 18181/tcp #OPSEC CVP +opsec-cvp 18181/udp #OPSEC CVP +opsec-ufp 18182/tcp #OPSEC UFP +opsec-ufp 18182/udp #OPSEC UFP +opsec-sam 18183/tcp #OPSEC SAM +opsec-sam 18183/udp #OPSEC SAM +opsec-lea 18184/tcp #OPSEC LEA +opsec-lea 18184/udp #OPSEC LEA +opsec-omi 18185/tcp #OPSEC OMI +opsec-omi 18185/udp #OPSEC OMI +ohsc 18186/tcp #Occupational Health SC +ohsc 18186/udp #Occupational Health Sc +opsec-ela 18187/tcp #OPSEC ELA +opsec-ela 18187/udp #OPSEC ELA +checkpoint-rtm 18241/tcp #Check Point RTM +checkpoint-rtm 18241/udp #Check Point RTM +ac-cluster 18463/tcp #AC Cluster +ac-cluster 18463/udp #AC Cluster +ique 18769/tcp #IQue Protocol +ique 18769/udp #IQue Protocol +apc-necmp 18888/tcp #APCNECMP +apc-necmp 18888/udp #APCNECMP +opsec-uaa 19191/tcp #OPSEC UAA +opsec-uaa 19191/udp #OPSEC UAA +ua-secureagent 19194/tcp #UserAuthority SecureAgent +ua-secureagent 19194/udp #UserAuthority SecureAgent +keysrvr 19283/tcp #Key Server for SASSAFRAS +keysrvr 19283/udp #Key Server for SASSAFRAS +keyshadow 19315/tcp #Key Shadow for SASSAFRAS +keyshadow 19315/udp #Key Shadow for SASSAFRAS +mtrgtrans 19398/tcp #mtrgtrans +mtrgtrans 19398/udp #mtrgtrans +hp-sco 19410/tcp #hp-sco +hp-sco 19410/udp #hp-sco +hp-sca 19411/tcp #hp-sca +hp-sca 19411/udp #hp-sca +hp-sessmon 19412/tcp #HP-SESSMON +hp-sessmon 19412/udp #HP-SESSMON +sxuptp 19540/tcp #SXUPTP +sxuptp 19540/udp #SXUPTP +jcp 19541/tcp #JCP Client +jcp 19541/udp #JCP Client +dnp 20000/tcp #DNP +dnp 20000/udp #DNP +microsan 20001/tcp #MicroSAN +microsan 20001/udp #MicroSAN +nburn_id 20034/tcp #NetBurner ID Port +nburn_id 20034/udp #NetBurner ID Port +ipdtp-port 20202/tcp #IPD Tunneling Port +ipdtp-port 20202/udp #IPD Tunneling Port +ipulse-ics 20222/tcp #iPulse-ICS +ipulse-ics 20222/udp #iPulse-ICS +track 20670/tcp #Track +track 20670/udp #Track +athand-mmp 20999/tcp #At Hand MMP +athand-mmp 20999/udp #AT Hand MMP +vofr-gateway 21590/tcp #VoFR Gateway +vofr-gateway 21590/udp #VoFR Gateway +tvpm 21800/tcp #TVNC Pro Multiplexing +tvpm 21800/udp #TVNC Pro Multiplexing +webphone 21845/tcp #webphone +webphone 21845/udp #webphone +netspeak-is 21846/tcp #NetSpeak Corp. Directory Services +netspeak-is 21846/udp #NetSpeak Corp. Directory Services +netspeak-cs 21847/tcp #NetSpeak Corp. Connection Services +netspeak-cs 21847/udp #NetSpeak Corp. Connection Services +netspeak-acd 21848/tcp #NetSpeak Corp. Automatic Call Distribution +netspeak-acd 21848/udp #NetSpeak Corp. Automatic Call Distribution +netspeak-cps 21849/tcp #NetSpeak Corp. Credit Processing System +netspeak-cps 21849/udp #NetSpeak Corp. Credit Processing System +snapenetio 22000/tcp #SNAPenetIO +snapenetio 22000/udp #SNAPenetIO +optocontrol 22001/tcp #OptoControl +optocontrol 22001/udp #OptoControl +wnn6 22273/tcp #wnn6 +wnn6 22273/udp #wnn6 +vocaltec-wconf 22555/tcp #Vocaltec Web Conference +vocaltec-phone 22555/udp #Vocaltec Internet Phone +aws-brf 22800/tcp #Telerate Information Platform LAN +aws-brf 22800/udp #Telerate Information Platform LAN +brf-gw 22951/tcp #Telerate Information Platform WAN +brf-gw 22951/udp #Telerate Information Platform WAN +med-ltp 24000/tcp #med-ltp +med-ltp 24000/udp #med-ltp +med-fsp-rx 24001/tcp #med-fsp-rx +med-fsp-rx 24001/udp #med-fsp-rx +med-fsp-tx 24002/tcp #med-fsp-tx +med-fsp-tx 24002/udp #med-fsp-tx +med-supp 24003/tcp #med-supp +med-supp 24003/udp #med-supp +med-ovw 24004/tcp #med-ovw +med-ovw 24004/udp #med-ovw +med-ci 24005/tcp #med-ci +med-ci 24005/udp #med-ci +med-net-svc 24006/tcp #med-net-svc +med-net-svc 24006/udp #med-net-svc +filesphere 24242/tcp #fileSphere +filesphere 24242/udp #fileSphere +vista-4gl 24249/tcp #Vista 4GL +vista-4gl 24249/udp #Vista 4GL +intel_rci 24386/tcp #Intel RCI +intel_rci 24386/udp #Intel RCI +binkp 24554/tcp #BINKP +binkp 24554/udp #BINKP +flashfiler 24677/tcp #FlashFiler +flashfiler 24677/udp #FlashFiler +proactivate 24678/tcp #Turbopower Proactivate +proactivate 24678/udp #Turbopower Proactivate +snip 24922/tcp #Simple Net Ident Protocol +snip 24922/udp #Simple Net Ident Protocol +icl-twobase1 25000/tcp #icl-twobase1 +icl-twobase1 25000/udp #icl-twobase1 +icl-twobase2 25001/tcp #icl-twobase2 +icl-twobase2 25001/udp #icl-twobase2 +icl-twobase3 25002/tcp #icl-twobase3 +icl-twobase3 25002/udp #icl-twobase3 +icl-twobase4 25003/tcp #icl-twobase4 +icl-twobase4 25003/udp #icl-twobase4 +icl-twobase5 25004/tcp #icl-twobase5 +icl-twobase5 25004/udp #icl-twobase5 +icl-twobase6 25005/tcp #icl-twobase6 +icl-twobase6 25005/udp #icl-twobase6 +icl-twobase7 25006/tcp #icl-twobase7 +icl-twobase7 25006/udp #icl-twobase7 +icl-twobase8 25007/tcp #icl-twobase8 +icl-twobase8 25007/udp #icl-twobase8 +icl-twobase9 25008/tcp #icl-twobase9 +icl-twobase9 25008/udp #icl-twobase9 +icl-twobase10 25009/tcp #icl-twobase10 +icl-twobase10 25009/udp #icl-twobase10 +vocaltec-hos 25793/tcp #Vocaltec Address Server +vocaltec-hos 25793/udp #Vocaltec Address Server +niobserver 25901/tcp #NIObserver +niobserver 25901/udp #NIObserver +niprobe 25903/tcp #NIProbe +niprobe 25903/udp #NIProbe +quake 26000/tcp #quake +quake 26000/udp #quake +wnn6-ds 26208/tcp #wnn6-ds +wnn6-ds 26208/udp #wnn6-ds +ezproxy 26260/tcp #eZproxy +ezproxy 26260/udp #eZproxy +ezmeeting 26261/tcp #eZmeeting +ezmeeting 26261/udp #eZmeeting +k3software-svr 26262/tcp #K3 Software-Server +k3software-svr 26262/udp #K3 Software-Server +k3software-cli 26263/tcp #K3 Software-Client +k3software-cli 26263/udp #K3 Software-Client +gserver 26264/tcp #Gserver +gserver 26264/udp #Gserver +imagepump 27345/tcp #ImagePump +imagepump 27345/udp #ImagePump +kopek-httphead 27504/tcp #Kopek HTTP Head Port +kopek-httphead 27504/udp #Kopek HTTP Head Port +tw-auth-key 27999/tcp #TW Authentication/Key Distribution and +tw-auth-key 27999/udp #Attribute Certificate Services +pago-services1 30001/tcp #Pago Services 1 +pago-services1 30001/udp #Pago Services 1 +pago-services2 30002/tcp #Pago Services 2 +pago-services2 30002/udp #Pago Services 2 +xqosd 31416/tcp #XQoS network monitor +xqosd 31416/udp #XQoS network monitor +lm-mon 31620/tcp #lm mon +lm-mon 31620/udp #lm mon +gamesmith-port 31765/tcp #GameSmith Port +gamesmith-port 31765/udp #GameSmith Port +filenet-tms 32768/tcp #Filenet TMS +filenet-tms 32768/udp #Filenet TMS +filenet-rpc 32769/tcp #Filenet RPC +filenet-rpc 32769/udp #Filenet RPC +filenet-nch 32770/tcp #Filenet NCH +filenet-nch 32770/udp #Filenet NCH +filenet-rmi 32771/tcp #FileNET RMI +filenet-rmi 32771/udp #FileNet RMI +filenet-pa 32772/tcp #FileNET Process Analyzer +filenet-pa 32772/udp #FileNET Process Analyzer +filenet-cm 32773/tcp #FileNET Component Manager +filenet-cm 32773/udp #FileNET Component Manager +filenet-re 32774/tcp #FileNET Rules Engine +filenet-re 32774/udp #FileNET Rules Engine +idmgratm 32896/tcp #Attachmate ID Manager +idmgratm 32896/udp #Attachmate ID Manager +diamondport 33331/tcp #DiamondCentral Interface +diamondport 33331/udp #DiamondCentral Interface +traceroute 33434/tcp #traceroute use +traceroute 33434/udp #traceroute use +turbonote-2 34249/tcp #TurboNote Relay Server Default Port +turbonote-2 34249/udp #TurboNote Relay Server Default Port +p-net-local 34378/tcp #P-Net on IP local +p-net-local 34378/udp #P-Net on IP local +p-net-remote 34379/tcp #P-Net on IP remote +p-net-remote 34379/udp #P-Net on IP remote +ethercat 34980/tcp #EtherCAT Port +ethercat 34980/udp #EhterCAT Port +kastenxpipe 36865/tcp #KastenX Pipe +kastenxpipe 36865/udp #KastenX Pipe +neckar 37475/tcp #science + computing's Venus Administration Port +neckar 37475/udp #science + computing's Venus Administration Port +galaxy7-data 38201/tcp #Galaxy7 Data Tunnel +galaxy7-data 38201/udp #Galaxy7 Data Tunnel +turbonote-1 39681/tcp #TurboNote Default Port +turbonote-1 39681/udp #TurboNote Default Port +cscp 40841/tcp #CSCP +cscp 40841/udp #CSCP +csccredir 40842/tcp #CSCCREDIR +csccredir 40842/udp #CSCCREDIR +csccfirewall 40843/tcp #CSCCFIREWALL +csccfirewall 40843/udp #CSCCFIREWALL +fs-qos 41111/tcp #Foursticks QoS Protocol +fs-qos 41111/udp #Foursticks QoS Protocol +crestron-cip 41794/tcp #Crestron Control Port +crestron-cip 41794/udp #Crestron Control Port +crestron-ctp 41795/tcp #Crestron Terminal Port +crestron-ctp 41795/udp #Crestron Terminal Port +reachout 43188/tcp #REACHOUT +reachout 43188/udp #REACHOUT +ndm-agent-port 43189/tcp #NDM-AGENT-PORT +ndm-agent-port 43189/udp #NDM-AGENT-PORT +ip-provision 43190/tcp #IP-PROVISION +ip-provision 43190/udp #IP-PROVISION +pmcd 44321/tcp #PCP server (pmcd) +pmcd 44321/udp #PCP server (pmcd) +pmcdproxy 44322/tcp #PCP server (pmcd) proxy +pmcdproxy 44322/udp #PCP server (pmcd) proxy +rockwell-encap 44818/tcp #Rockwell Encapsulation +rockwell-encap 44818/udp #Rockwell Encapsulation +invision-ag 45054/tcp #InVision AG +invision-ag 45054/udp #InVision AG +eba 45678/tcp #EBA PRISE +eba 45678/udp #EBA PRISE +ssr-servermgr 45966/tcp #SSRServerMgr +ssr-servermgr 45966/udp #SSRServerMgr +mbus 47000/tcp #Message Bus +mbus 47000/udp #Message Bus +dbbrowse 47557/tcp #Databeam Corporation +dbbrowse 47557/udp #Databeam Corporation +directplaysrvr 47624/tcp #Direct Play Server +directplaysrvr 47624/udp #Direct Play Server +ap 47806/tcp #ALC Protocol +ap 47806/udp #ALC Protocol +bacnet 47808/tcp #Building Automation and Control Networks +bacnet 47808/udp #Building Automation and Control Networks +nimcontroller 48000/tcp #Nimbus Controller +nimcontroller 48000/udp #Nimbus Controller +nimspooler 48001/tcp #Nimbus Spooler +nimspooler 48001/udp #Nimbus Spooler +nimhub 48002/tcp #Nimbus Hub +nimhub 48002/udp #Nimbus Hub +nimgtw 48003/tcp #Nimbus Gateway +nimgtw 48003/udp #Nimbus Gateway +com-bardac-dw 48556/tcp #com-bardac-dw +com-bardac-dw 48556/udp #com-bardac-dw +iqobject 48619/tcp #iqobject +iqobject 48619/udp #iqobject From c76e4992960cbff08a4613d9647288d6185d814b Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 2 Jul 2004 01:36:25 +0000 Subject: [PATCH 165/356] NtRaiseException fixed to not clobber EAX any more, and both NtContinue and NtRaiseException no longer clobber EDX. kmode SEH works now, but there are likely some lingering bugs. This patch was made possible by the collaborative efforts of myself, kjk_hyperion, Art Yerkes, and Skywing. svn path=/trunk/; revision=9967 --- reactos/ntoskrnl/ke/catch.c | 25 ++++++--- reactos/ntoskrnl/ke/i386/exp.c | 97 +++++++++++++++++++++------------- reactos/ntoskrnl/ps/debug.c | 8 +-- 3 files changed, 81 insertions(+), 49 deletions(-) diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index d526002d5ee..73e0e5c2102 100644 --- a/reactos/ntoskrnl/ke/catch.c +++ b/reactos/ntoskrnl/ke/catch.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: catch.c,v 1.43 2004/06/23 22:31:51 ion Exp $ +/* $Id: catch.c,v 1.44 2004/07/02 01:36:25 royce Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/catch.c @@ -256,17 +256,28 @@ ExSystemExceptionFilter() return FALSE; } +VOID +FASTCALL +KeRosTrapReturn ( PKTRAP_FRAME TrapFrame, PKTRAP_FRAME PrevTrapFrame ); + NTSTATUS STDCALL NtRaiseException (IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context, IN BOOLEAN SearchFrames) { - KiDispatchException(ExceptionRecord, - Context, - PsGetCurrentThread()->Tcb.TrapFrame, - (KPROCESSOR_MODE)ExGetPreviousMode(), - SearchFrames); - return(STATUS_SUCCESS); + PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; + PKTRAP_FRAME PrevTrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; + + KeGetCurrentKPCR()->Tib.ExceptionList = TrapFrame->ExceptionList; + + KiDispatchException(ExceptionRecord, + Context, + PsGetCurrentThread()->Tcb.TrapFrame, + (KPROCESSOR_MODE)ExGetPreviousMode(), + SearchFrames); + + KeRosTrapReturn ( TrapFrame, PrevTrapFrame ); + return(STATUS_SUCCESS); } /* diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 58e237b20e7..1778b9a6d26 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -79,7 +79,7 @@ extern VOID KiTrapUnknown(VOID); extern ULONG init_stack; extern ULONG init_stack_top; -static char *ExceptionTypeStrings[] = +static char *ExceptionTypeStrings[] = { "Divide Error", "Debug Trap", @@ -101,7 +101,7 @@ static char *ExceptionTypeStrings[] = "Machine Check" }; -static NTSTATUS ExceptionToNtStatus[] = +static NTSTATUS ExceptionToNtStatus[] = { STATUS_INTEGER_DIVIDE_BY_ZERO, STATUS_SINGLE_STEP, @@ -142,11 +142,11 @@ KeRosPrintAddress(PVOID address) ULONG_PTR RelativeAddress; current_entry = ModuleTextListHead.Flink; - + while (current_entry != &ModuleTextListHead && current_entry != NULL) { - current = + current = CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION, ListEntry); if (address >= (PVOID)current->Base && @@ -219,7 +219,7 @@ KiDoubleFaultHandler(VOID) ULONG TraceLength; BOOLEAN FoundRepeat; #endif - + OldTss = KeGetCurrentKPCR()->TSS; Esp0 = OldTss->Esp; @@ -243,7 +243,7 @@ KiDoubleFaultHandler(VOID) { OldCr3 = 0xBEADF0AL; } - + /* * Check for stack underflow */ @@ -254,7 +254,7 @@ KiDoubleFaultHandler(VOID) Esp0, (ULONG)PsGetCurrentThread()->Tcb.StackLimit); ExceptionNr = 12; } - + /* * Print out the CPU registers */ @@ -286,9 +286,9 @@ KiDoubleFaultHandler(VOID) DbgPrint("\n"); DbgPrint("DS %x ES %x FS %x GS %x\n", OldTss->Ds, OldTss->Es, OldTss->Fs, OldTss->Gs); - DbgPrint("EAX: %.8x EBX: %.8x ECX: %.8x\n", OldTss->Eax, OldTss->Ebx, + DbgPrint("EAX: %.8x EBX: %.8x ECX: %.8x\n", OldTss->Eax, OldTss->Ebx, OldTss->Ecx); - DbgPrint("EDX: %.8x EBP: %.8x ESI: %.8x\n ESP: %.8x", OldTss->Edx, + DbgPrint("EDX: %.8x EBP: %.8x ESI: %.8x\n ESP: %.8x", OldTss->Edx, OldTss->Ebp, OldTss->Esi, Esp0); DbgPrint("EDI: %.8x EFLAGS: %.8x ", OldTss->Edi, OldTss->Eflags); if (OldTss->Cs == KERNEL_CS) @@ -298,7 +298,7 @@ KiDoubleFaultHandler(VOID) { DbgPrint("kernel stack base %x\n", PsGetCurrentThread()->Tcb.StackLimit); - + } } else @@ -318,10 +318,10 @@ KiDoubleFaultHandler(VOID) StackBase = (ULONG)&init_stack; } - /* + /* Change to an #if 0 to reduce the amount of information printed on - a recursive stack trace. - */ + a recursive stack trace. + */ #if 1 DbgPrint("Frames: "); Frame = (PULONG)OldTss->Ebp; @@ -351,7 +351,7 @@ KiDoubleFaultHandler(VOID) FoundRepeat = FALSE; while ((j - i) <= (TraceLength - j) && FoundRepeat == FALSE) { - if (memcmp(&StackTrace[i], &StackTrace[j], + if (memcmp(&StackTrace[i], &StackTrace[j], (j - i) * sizeof(PVOID)) == 0) { StackRepeatCount[i] = 2; @@ -369,10 +369,10 @@ KiDoubleFaultHandler(VOID) continue; } j = j + StackRepeatLength[i]; - while ((TraceLength - j) >= StackRepeatLength[i] && + while ((TraceLength - j) >= StackRepeatLength[i] && FoundRepeat == TRUE) { - if (memcmp(&StackTrace[i], &StackTrace[j], + if (memcmp(&StackTrace[i], &StackTrace[j], StackRepeatLength[i] * sizeof(PVOID)) == 0) { StackRepeatCount[i]++; @@ -411,7 +411,7 @@ KiDoubleFaultHandler(VOID) } #endif } - + DbgPrint("\n"); for(;;); return 0; @@ -429,7 +429,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) ULONG cr2 = (ULONG)Tf->DebugPointer; Esp0 = (ULONG)Tf; - + /* * Print out the CPU registers */ @@ -464,7 +464,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) DbgPrint("DS %x ES %x FS %x GS %x\n", Tf->Ds&0xffff, Tf->Es&0xffff, Tf->Fs&0xffff, Tf->Gs&0xfff); DbgPrint("EAX: %.8x EBX: %.8x ECX: %.8x\n", Tf->Eax, Tf->Ebx, Tf->Ecx); - DbgPrint("EDX: %.8x EBP: %.8x ESI: %.8x ESP: %.8x\n", Tf->Edx, + DbgPrint("EDX: %.8x EBP: %.8x ESI: %.8x ESP: %.8x\n", Tf->Edx, Tf->Ebp, Tf->Esi, Esp0); DbgPrint("EDI: %.8x EFLAGS: %.8x ", Tf->Edi, Tf->Eflags); if ((Tf->Cs&0xffff) == KERNEL_CS) @@ -474,7 +474,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) { DbgPrint("kernel stack base %x\n", PsGetCurrentThread()->Tcb.StackLimit); - + } } @@ -486,7 +486,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) { StackLimit = (ULONG)&init_stack_top; } - + /* * Dump the stack frames */ @@ -536,7 +536,7 @@ KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2) ULONG KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) /* - * FUNCTION: Called by the lowlevel execption handlers to print an amusing + * FUNCTION: Called by the lowlevel execption handlers to print an amusing * message and halt the computer * ARGUMENTS: * Complete CPU context @@ -551,7 +551,7 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) /* Use the address of the trap frame as approximation to the ring0 esp */ Esp0 = (ULONG)&Tf->Eip; - + /* Get CR2 */ #if defined(__GNUC__) __asm__("movl %%cr2,%0\n\t" : "=d" (cr2_)); @@ -562,7 +562,7 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) #error Unknown compiler for inline assembler #endif Tf->DebugPointer = (PVOID)cr2_; - + /* * If this was a V86 mode exception then handle it specially */ @@ -607,7 +607,7 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) */ if (ExceptionNr == 3 && Tf->Eip == ((ULONG)DbgBreakPointNoBugCheck) + 1) { - /* + /* EIP is already adjusted by the processor to point to the instruction after the breakpoint. */ @@ -627,13 +627,10 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) } } -VOID +VOID KeDumpStackFrames(PULONG Frame) { - ULONG i; - DbgPrint("Frames: "); - i = 1; while ( MmIsAddressValid(Frame) ) { if (!KeRosPrintAddress((PVOID)Frame[1])) @@ -641,15 +638,15 @@ KeDumpStackFrames(PULONG Frame) DbgPrint("<%X>", (PVOID)Frame[1]); } Frame = (PULONG)Frame[0]; - i++; DbgPrint(" "); } + DbgPrint("\n"); } VOID STDCALL KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ) { - ULONG i; + ULONG i=0; DbgPrint("Frames: "); if ( !Frame ) @@ -657,7 +654,6 @@ KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ) __asm__("mov %%ebp, %%ebx" : "=b" (Frame) : ); Frame = (PULONG)Frame[0]; // step out of KeRosDumpStackFrames } - i = 1; while ( MmIsAddressValid(Frame) && i++ < FrameCount ) { if (!KeRosPrintAddress((PVOID)Frame[1])) @@ -667,6 +663,7 @@ KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount ) Frame = (PULONG)Frame[0]; DbgPrint(" "); } + DbgPrint("\n"); } static void set_system_call_gate(unsigned int sel, unsigned int func) @@ -683,7 +680,7 @@ static void set_interrupt_gate(unsigned int sel, unsigned int func) DPRINT("set_interrupt_gate(sel %d, func %x)\n",sel,func); KiIdt[sel].a = (((int)func)&0xffff) + (KERNEL_CS << 16); - KiIdt[sel].b = 0x8e00 + (((int)func)&0xffff0000); + KiIdt[sel].b = 0x8e00 + (((int)func)&0xffff0000); } static void set_trap_gate(unsigned int sel, unsigned int func, unsigned int dpl) @@ -692,7 +689,7 @@ static void set_trap_gate(unsigned int sel, unsigned int func, unsigned int dpl) assert(dpl <= 3); KiIdt[sel].a = (((int)func)&0xffff) + (KERNEL_CS << 16); - KiIdt[sel].b = 0x8f00 + (dpl << 13) + (((int)func)&0xffff0000); + KiIdt[sel].b = 0x8f00 + (dpl << 13) + (((int)func)&0xffff0000); } static void @@ -732,12 +729,12 @@ KeInitExceptions(VOID) set_interrupt_gate(14, (ULONG)KiTrap14); set_trap_gate(15, (ULONG)KiTrap15, 0); set_trap_gate(16, (ULONG)KiTrap16, 0); - + for (i=17;i<256;i++) { set_trap_gate(i,(int)KiTrapUnknown, 0); } - + set_system_call_gate(0x2d,(int)interrupt_handler2d); set_system_call_gate(0x2e,(int)interrupt_handler2e); } @@ -759,3 +756,31 @@ KeRaiseUserException(IN NTSTATUS ExceptionCode) Thread->Teb->ExceptionCode = ExceptionCode; return((NTSTATUS)OldEip); } + +VOID +FASTCALL +KeRosTrapReturn ( PKTRAP_FRAME TrapFrame, PKTRAP_FRAME PrevTrapFrame ); + +/* + * @implemented + */ +NTSTATUS STDCALL +NtRaiseException ( + IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOLEAN SearchFrames) +{ + PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; + PKTRAP_FRAME PrevTrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; + + KeGetCurrentKPCR()->Tib.ExceptionList = TrapFrame->ExceptionList; + + KiDispatchException(ExceptionRecord, + Context, + PsGetCurrentThread()->Tcb.TrapFrame, + (KPROCESSOR_MODE)ExGetPreviousMode(), + SearchFrames); + + KeRosTrapReturn ( TrapFrame, PrevTrapFrame ); + return(STATUS_SUCCESS); +} diff --git a/reactos/ntoskrnl/ps/debug.c b/reactos/ntoskrnl/ps/debug.c index 29b09071511..146209c3e65 100644 --- a/reactos/ntoskrnl/ps/debug.c +++ b/reactos/ntoskrnl/ps/debug.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: debug.c,v 1.11 2003/07/21 21:36:01 dwelch Exp $ +/* $Id: debug.c,v 1.12 2004/07/02 01:36:25 royce Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ps/debug.c @@ -69,11 +69,7 @@ KeContextToTrapFrame(PCONTEXT Context, TrapFrame->Eax = Context->Eax; TrapFrame->Ebx = Context->Ebx; TrapFrame->Ecx = Context->Ecx; - /* - * Edx is used in the TrapFrame to hold the old trap frame pointer - * so we don't want to overwrite it here - */ -/* TrapFrame->Edx = Context->Edx; */ + TrapFrame->Edx = Context->Edx; TrapFrame->Esi = Context->Esi; TrapFrame->Edi = Context->Edi; } From 9860c72592f45688ceb4926557d1d185917b2a88 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Fri, 2 Jul 2004 08:06:47 +0000 Subject: [PATCH 166/356] Added installation of services file needed for getservbyname and kin. The services file was created by Cameron Palmer from the official IANA list. svn path=/trunk/; revision=9968 --- reactos/Makefile | 6 +++++- reactos/bootdata/packages/reactos.dff | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/Makefile b/reactos/Makefile index da718be5d00..a196acc3be6 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.232 2004/07/01 02:40:21 hyperion Exp $ +# $Id: Makefile,v 1.233 2004/07/02 08:06:46 arty Exp $ # # Global makefile # @@ -187,6 +187,7 @@ bootcd_install_before: $(CP) media/nls/c_1252.nls $(BOOTCD_DIR)/reactos/c_1252.nls $(CP) media/nls/c_437.nls $(BOOTCD_DIR)/reactos/c_437.nls $(CP) media/nls/l_intl.nls $(BOOTCD_DIR)/reactos/l_intl.nls + $(CP) media/drivers/etc/services $(BOOTCD_DIR)/reactos/services bootcd_basic: bootcd_directory_layout bootcd_bootstrap_files bootcd_install_before @@ -829,6 +830,7 @@ install_dirs: $(RMKDIR) $(INSTALL_DIR)/system32 $(RMKDIR) $(INSTALL_DIR)/system32/config $(RMKDIR) $(INSTALL_DIR)/system32/drivers + $(RMKDIR) $(INSTALL_DIR)/system32/drivers/etc install_before: $(CP) bootc.lst $(INSTALL_DIR)/bootc.lst @@ -839,6 +841,8 @@ install_before: $(CP) media/nls/c_1252.nls $(INSTALL_DIR)/system32/ansi.nls $(CP) media/nls/c_437.nls $(INSTALL_DIR)/system32/oem.nls $(CP) media/nls/l_intl.nls $(INSTALL_DIR)/system32/casemap.nls + $(CP) media/drivers/etc/services \ + $(INSTALL_DIR)/system32/drivers/etc/services .PHONY: install_clean install_dirs install_before diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 6efcbfde4ba..8ed34fae39f 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -17,6 +17,7 @@ Signature = "$ReactOS$" 2 = system32\drivers 3 = media\fonts 4 = . +5 = system32\drivers\etc .InfEnd @@ -182,3 +183,4 @@ media\nls\c_28596.nls 1 media\nls\c_28597.nls 1 media\nls\c_28598.nls 1 media\nls\c_28599.nls 1 +media\drivers\etc\services 5 \ No newline at end of file From 7bca32fad2cb51dd5c3c69f5e6396558deb6edfd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 2 Jul 2004 08:46:50 +0000 Subject: [PATCH 167/356] allow changing the cursor position with the mouse svn path=/trunk/; revision=9969 --- reactos/subsys/system/regedit/hexedit.c | 104 +++++++++++++++--------- 1 file changed, 65 insertions(+), 39 deletions(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 6333c131438..332a937e372 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -271,57 +271,47 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO } static DWORD -HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed, POINTS pt, POINTS *ptClient) +HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed, POINTS pt) { WINDOWINFO wi; - int d, x; + int d; - wi.cbSize = sizeof(WINDOWINFO); - GetWindowInfo(hed->hWndSelf, &wi); - - x = pt.x - wi.rcClient.left; - if(ptClient) - { - ptClient->x = x; - ptClient->y = pt.y - wi.rcClient.top; - } - - if(x <= hed->LeftMargin) + if(pt.x <= hed->LeftMargin) { return HEHT_LEFTMARGIN; } - x -= hed->LeftMargin; + pt.x -= hed->LeftMargin; d = (4 * hed->CharWidth); - if(x <= d) + if(pt.x <= d) { return HEHT_ADDRESS; } - x -= d; + pt.x -= d; d = (hed->AddressSpacing * hed->CharWidth); - if(x <= d) + if(pt.x <= d) { return HEHT_ADDRESSSPACING; } - x -= d; + pt.x -= d; d = (3 * hed->ColumnsPerLine * hed->CharWidth); - if(x <= d) + if(pt.x <= d) { return HEHT_HEXDUMP; } - x -= d; + pt.x -= d; d = (hed->SplitSpacing * hed->CharWidth); - if(x <= d) + if(pt.x <= d) { return HEHT_HEXDUMPSPACING; } - x -= d; + pt.x -= d; d = (hed->ColumnsPerLine * hed->CharWidth); - if(x <= d) + if(pt.x <= d) { return HEHT_ASCIIDUMP; } @@ -330,41 +320,57 @@ HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed, POINTS pt, POINTS *ptClient) } static DWORD -HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD *Hit) +HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos, BOOL *EditField) { SCROLLINFO si; - POINTS ptClient; - DWORD Line; - - *Hit = HEXEDIT_HitRegionTest(hed, pt, &ptClient); + DWORD Pos, bufsize; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_POS; GetScrollInfo(hed->hWndSelf, SB_VERT, &si); + EditPos->x = 0; + if(hed->LineHeight > 0) { - Line = min(si.nPos + (ptClient.y / hed->LineHeight), hed->nLines); + EditPos->y = min(si.nPos + (pt.y / hed->LineHeight), hed->nLines - 1); } else - return 0; + { + EditPos->y = si.nPos; + } - switch(*Hit) + switch(Hit) { case HEHT_LEFTMARGIN: case HEHT_ADDRESS: case HEHT_ADDRESSSPACING: - return Line * hed->ColumnsPerLine; - case HEHT_HEXDUMP: - return 0; + pt.x -= hed->LeftMargin + ((4 + hed->AddressSpacing) * hed->CharWidth); + *EditField = TRUE; + break; - case HEHT_ASCIIDUMP: - return 0; - - case HEHT_RIGHTMARGIN: - return (Line + 1) * hed->ColumnsPerLine; + default: + pt.x -= hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine)) * hed->CharWidth); + *EditField = FALSE; + break; } + + if(pt.x > 0) + { + INT BlockWidth = (*EditField ? hed->CharWidth * 3 : hed->CharWidth); + EditPos->x = min(hed->ColumnsPerLine, pt.x / BlockWidth); + } + + bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); + Pos = (EditPos->y * hed->ColumnsPerLine) + EditPos->x; + if(Pos > bufsize) + { + INT tmp = bufsize % hed->ColumnsPerLine; + Pos = bufsize; + EditPos->x = (tmp == 0 ? hed->ColumnsPerLine : tmp); + } + return Pos; } /*** Control specific messages ************************************************/ @@ -735,6 +741,23 @@ HEXEDIT_WM_GETDLGCODE(LPMSG Msg) return DLGC_WANTARROWS | DLGC_WANTCHARS; } +static LRESULT +HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt) +{ + BOOL NewField; + POINT EditPos; + DWORD Hit = HEXEDIT_HitRegionTest(hed, Pt); + + hed->Position = HEXEDIT_PositionFromPoint(hed, Pt, Hit, &EditPos, &NewField); + hed->EditingField = NewField; + hed->CaretCol = EditPos.x; + hed->CaretLine = EditPos.y; + + HEXEDIT_MoveCaret(hed, TRUE); + + return 0; +} + static BOOL HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) { @@ -857,6 +880,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SIZE: return HEXEDIT_WM_SIZE(hed, (DWORD)wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_LBUTTONDOWN: + return HEXEDIT_WM_LBUTTONDOWN(hed, (INT)wParam, MAKEPOINTS(lParam)); + case WM_MOUSEWHEEL: { UINT nScrollLines = 3; From 386450b0181e8d0505947ea52a182fb0f143e3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 2 Jul 2004 12:18:04 +0000 Subject: [PATCH 168/356] Fix WinExec return value svn path=/trunk/; revision=9970 --- reactos/lib/kernel32/process/proc.c | 43 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index 1bf9048a184..a0fc16931f1 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.62 2004/05/29 15:10:28 navaraf Exp $ +/* $Id: proc.c,v 1.63 2004/07/02 12:18:04 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -380,7 +380,6 @@ WinExec(LPCSTR lpCmdLine, { STARTUPINFOA StartupInfo; PROCESS_INFORMATION ProcessInformation; - HINSTANCE hInst; DWORD dosErr; RtlZeroMemory(&StartupInfo, sizeof(StartupInfo)); @@ -388,31 +387,31 @@ WinExec(LPCSTR lpCmdLine, StartupInfo.wShowWindow = uCmdShow; StartupInfo.dwFlags = 0; - hInst = (HINSTANCE)CreateProcessA(NULL, - (PVOID)lpCmdLine, - NULL, - NULL, - FALSE, - 0, - NULL, - NULL, - &StartupInfo, - &ProcessInformation); - if ( hInst == NULL ) + if (! CreateProcessA(NULL, + (PVOID)lpCmdLine, + NULL, + NULL, + FALSE, + 0, + NULL, + NULL, + &StartupInfo, + &ProcessInformation)) { dosErr = GetLastError(); - return dosErr; + return dosErr < 32 ? dosErr : ERROR_BAD_FORMAT; } if (NULL != lpfnGlobalRegisterWaitForInputIdle) - { - lpfnGlobalRegisterWaitForInputIdle ( - ProcessInformation.hProcess, - 10000 + { + lpfnGlobalRegisterWaitForInputIdle ( + ProcessInformation.hProcess, + 10000 ); - } - NtClose (ProcessInformation.hProcess); - NtClose (ProcessInformation.hThread); - return 0; + } + NtClose(ProcessInformation.hProcess); + NtClose(ProcessInformation.hThread); + + return 33; /* Something bigger than 31 means success. */ } From b04f8c0e2234a1310c55e7a10b7c424e3fb1ec04 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 2 Jul 2004 12:43:38 +0000 Subject: [PATCH 169/356] oops, if you're going to move a function, get rid of the old one... sorry... svn path=/trunk/; revision=9971 --- reactos/ntoskrnl/ke/catch.c | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index 73e0e5c2102..8702c0a4c1d 100644 --- a/reactos/ntoskrnl/ke/catch.c +++ b/reactos/ntoskrnl/ke/catch.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: catch.c,v 1.44 2004/07/02 01:36:25 royce Exp $ +/* $Id: catch.c,v 1.45 2004/07/02 12:43:38 royce Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/catch.c @@ -256,30 +256,6 @@ ExSystemExceptionFilter() return FALSE; } -VOID -FASTCALL -KeRosTrapReturn ( PKTRAP_FRAME TrapFrame, PKTRAP_FRAME PrevTrapFrame ); - -NTSTATUS STDCALL -NtRaiseException (IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context, - IN BOOLEAN SearchFrames) -{ - PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; - PKTRAP_FRAME PrevTrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; - - KeGetCurrentKPCR()->Tib.ExceptionList = TrapFrame->ExceptionList; - - KiDispatchException(ExceptionRecord, - Context, - PsGetCurrentThread()->Tcb.TrapFrame, - (KPROCESSOR_MODE)ExGetPreviousMode(), - SearchFrames); - - KeRosTrapReturn ( TrapFrame, PrevTrapFrame ); - return(STATUS_SUCCESS); -} - /* * @unimplemented */ From 0155d5acde6293cf0b507b95414f3affd1fa8e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 2 Jul 2004 20:04:48 +0000 Subject: [PATCH 170/356] Only accept matching palette svn path=/trunk/; revision=9972 --- reactos/subsys/win32k/objects/color.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index c28fd426ae1..a86dbdfd55b 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.45 2004/06/29 20:08:05 navaraf Exp $ */ +/* $Id: color.c,v 1.46 2004/07/02 20:04:48 gvg Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -452,9 +452,19 @@ HPALETTE STDCALL NtGdiSelectPalette(HDC hDC, PalGDI = PALETTE_LockPalette(hpal); if (NULL != PalGDI) { - PALETTE_UnlockPalette(hpal); - oldPal = dc->w.hPalette; - dc->w.hPalette = hpal; + /* Is this a valid palette for this depth? */ + if ((dc->w.bitsPerPixel <= 8 && PAL_INDEXED == PalGDI->Mode) + || (8 < dc->w.bitsPerPixel && PAL_INDEXED != PalGDI->Mode)) + { + PALETTE_UnlockPalette(hpal); + oldPal = dc->w.hPalette; + dc->w.hPalette = hpal; + } + else + { + PALETTE_UnlockPalette(hpal); + oldPal = NULL; + } } else { From 8af3ba8548bc6448c64f2daccbe7844982dbb2b5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 2 Jul 2004 20:28:00 +0000 Subject: [PATCH 171/356] Add partial implementation of the environment variables dialog. svn path=/trunk/; revision=9973 --- reactos/lib/cpl/sysdm/Makefile | 5 +- reactos/lib/cpl/sysdm/advanced.c | 14 +- reactos/lib/cpl/sysdm/environment.c | 248 ++++++++++++++++++++++++++++ reactos/lib/cpl/sysdm/resource.h | 30 +++- reactos/lib/cpl/sysdm/sysdm.h | 4 +- reactos/lib/cpl/sysdm/sysdm.rc | 49 ++++-- 6 files changed, 322 insertions(+), 28 deletions(-) create mode 100644 reactos/lib/cpl/sysdm/environment.c diff --git a/reactos/lib/cpl/sysdm/Makefile b/reactos/lib/cpl/sysdm/Makefile index 6a480a0811f..9a6b0770913 100644 --- a/reactos/lib/cpl/sysdm/Makefile +++ b/reactos/lib/cpl/sysdm/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2004/06/30 10:53:05 ekohl Exp $ +# $Id: Makefile,v 1.4 2004/07/02 20:28:00 ekohl Exp $ PATH_TO_TOP = ../../.. @@ -34,7 +34,8 @@ TARGET_PCH = TARGET_CLEAN = -TARGET_OBJECTS = sysdm.o general.o computer.o hardware.o advanced.o userprofile.o +TARGET_OBJECTS = sysdm.o general.o computer.o hardware.o advanced.o userprofile.o\ + environment.o DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/lib/cpl/sysdm/advanced.c b/reactos/lib/cpl/sysdm/advanced.c index c21c1b34c35..d61039ad8d6 100644 --- a/reactos/lib/cpl/sysdm/advanced.c +++ b/reactos/lib/cpl/sysdm/advanced.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: advanced.c,v 1.2 2004/06/30 10:53:05 ekohl Exp $ +/* $Id: advanced.c,v 1.3 2004/07/02 20:28:00 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/advanced.c @@ -38,8 +38,7 @@ AdvancedPageProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam -) + LPARAM lParam) { switch (uMsg) { @@ -47,6 +46,15 @@ AdvancedPageProc( break; case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_ENVVAR: + DialogBox(hApplet, + MAKEINTRESOURCE(IDD_ENVIRONMENT_VARIABLES), + hwndDlg, + EnvironmentDlgProc); + break; + } break; } diff --git a/reactos/lib/cpl/sysdm/environment.c b/reactos/lib/cpl/sysdm/environment.c new file mode 100644 index 00000000000..ad3f3577f8a --- /dev/null +++ b/reactos/lib/cpl/sysdm/environment.c @@ -0,0 +1,248 @@ +/* + * ReactOS + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: environment.c,v 1.1 2004/07/02 20:28:00 ekohl Exp $ + * + * PROJECT: ReactOS System Control Panel + * FILE: lib/cpl/sysdm/environment.c + * PURPOSE: Environment variable settings + * PROGRAMMER: Eric Kohl + */ + +#include +#include +#include +#include + +#include "resource.h" +#include "sysdm.h" + + +static VOID +SetEnvironmentVariables(HWND hwndListView, + HKEY hRootKey, + LPTSTR lpSubKeyName) +{ + HKEY hKey; + DWORD dwValues; + DWORD dwMaxValueNameLength; + DWORD dwMaxValueDataLength; + DWORD i; + LPTSTR lpName; + LPTSTR lpData; + LPTSTR lpExpandData; + DWORD dwNameLength; + DWORD dwDataLength; + DWORD dwType; + + LV_ITEM lvi; + int nIndex; + + if (RegOpenKeyEx(hRootKey, + lpSubKeyName, + 0, + KEY_READ, + &hKey)) + return; + + if (RegQueryInfoKey(hKey, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &dwValues, + &dwMaxValueNameLength, + &dwMaxValueDataLength, + NULL, + NULL)) + { + RegCloseKey(hKey); + return; + } + + lpName = GlobalAlloc(GPTR, (dwMaxValueNameLength + 1) * sizeof(TCHAR)); + if (lpName == NULL) + { + RegCloseKey(hKey); + return; + } + + lpData = GlobalAlloc(GPTR, (dwMaxValueDataLength + 1) * sizeof(TCHAR)); + if (lpData == NULL) + { + GlobalFree(lpData); + RegCloseKey(hKey); + return; + } + + for (i = 0; i < dwValues; i++) + { + dwNameLength = dwMaxValueNameLength + 1; + dwDataLength = dwMaxValueDataLength + 1; + if (RegEnumValue(hKey, + i, + lpName, + &dwNameLength, + NULL, + &dwType, + (LPBYTE)lpData, + &dwDataLength)) + { + GlobalFree(lpName); + GlobalFree(lpData); + RegCloseKey(hKey); + return; + } + + if (dwType == REG_EXPAND_SZ) + { + lpExpandData = GlobalAlloc(GPTR, MAX_PATH * sizeof(TCHAR)); + if (lpExpandData == NULL) + { + GlobalFree(lpName); + GlobalFree(lpData); + RegCloseKey(hKey); + return; + } + + ExpandEnvironmentStrings(lpData, + lpExpandData, + MAX_PATH); + } + + memset(&lvi, 0x00, sizeof(lvi)); + lvi.mask = LVIF_TEXT | LVIF_STATE; + lvi.pszText = lpName; + lvi.state=0; + nIndex = ListView_InsertItem(hwndListView, &lvi); + + if (dwType == REG_EXPAND_SZ) + { + ListView_SetItemText(hwndListView, nIndex, 1, lpExpandData); + GlobalFree(lpExpandData); + } + else + { + ListView_SetItemText(hwndListView, nIndex, 1, lpData); + } + } + + GlobalFree(lpName); + GlobalFree(lpData); + RegCloseKey(hKey); +} + + +static VOID +SetListViewColumns(HWND hwndListView) +{ + RECT rect; + LV_COLUMN column; + + GetClientRect(hwndListView, &rect); + + memset(&column, 0x00, sizeof(column)); + column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM|LVCF_TEXT; + column.fmt=LVCFMT_LEFT; + column.cx = (rect.right - rect.left) / 3; + column.iSubItem = 0; + column.pszText = _T("Variable"); + ListView_InsertColumn(hwndListView, 0, &column); + + column.cx = (rect.right - rect.left) - ((rect.right - rect.left) / 3) - 1; + column.iSubItem = 1; + column.pszText = _T("Value"); + ListView_InsertColumn(hwndListView, 1, &column); +} + + +static VOID +OnInitDialog(HWND hwndDlg) +{ + HWND hwndListView; + + /* Set user environment variables */ + hwndListView = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_LIST); + + SetListViewColumns(hwndListView); + + SetEnvironmentVariables(hwndListView, + HKEY_CURRENT_USER, + _T("Environment")); + + ListView_SetColumnWidth(hwndListView,2,LVSCW_AUTOSIZE_USEHEADER); + ListView_Update(hwndListView,0); + + + /* Set system environment variables */ + hwndListView = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); + + SetListViewColumns(hwndListView); + + SetEnvironmentVariables(hwndListView, + HKEY_LOCAL_MACHINE, + _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment")); + + ListView_SetColumnWidth(hwndListView,2,LVSCW_AUTOSIZE_USEHEADER); + ListView_Update(hwndListView,0); +} + + +/* Environment dialog procedure */ +BOOL CALLBACK +EnvironmentDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + OnInitDialog(hwndDlg); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_USER_VARIABLE_NEW: + case IDC_USER_VARIABLE_EDIT: + case IDC_USER_VARIABLE_DELETE: + break; + + case IDC_SYSTEM_VARIABLE_NEW: + case IDC_SYSTEM_VARIABLE_EDIT: + case IDC_SYSTEM_VARIABLE_DELETE: + break; + + case IDOK: + EndDialog(hwndDlg, 0); + return TRUE; + + case IDCANCEL: + EndDialog(hwndDlg, 0); + return TRUE; + } + break; + } + + return FALSE; +} + +/* EOF */ diff --git a/reactos/lib/cpl/sysdm/resource.h b/reactos/lib/cpl/sysdm/resource.h index a6f4ff1bc87..e4d56fb1615 100644 --- a/reactos/lib/cpl/sysdm/resource.h +++ b/reactos/lib/cpl/sysdm/resource.h @@ -2,12 +2,12 @@ #define __CPL_RESOURCE_H /* metrics */ -#define PROPSHEETWIDTH 246 -#define PROPSHEETHEIGHT 228 -#define PROPSHEETPADDING 6 -#define SYSTEM_COLUMN (18 * PROPSHEETPADDING) -#define LABELLINE(x) (((PROPSHEETPADDING + 2) * x) + (x + 2)) -#define ICONSIZE 16 +#define PROPSHEETWIDTH 256 +#define PROPSHEETHEIGHT 218 +#define PROPSHEETPADDING 6 +#define SYSTEM_COLUMN (18 * PROPSHEETPADDING) +#define LABELLINE(x) (((PROPSHEETPADDING + 2) * x) + (x + 2)) +#define ICONSIZE 16 /* ids */ #define RC_LICENSE 101 @@ -45,9 +45,21 @@ #define IDC_HARDWARE_PROFILE 210 #define IDC_HARDWARE_DRIVER_SIGN 211 #define IDC_HARDWARE_DEVICE_MANAGER 212 -#define IDC_USERPROFILE_DELETE 213 -#define IDC_USERPROFILE_CHANGE 214 -#define IDC_USERPROFILE_COPY 215 + +#define IDC_USERPROFILE_LIST 213 +#define IDC_USERPROFILE_DELETE 214 +#define IDC_USERPROFILE_CHANGE 215 +#define IDC_USERPROFILE_COPY 216 + +#define IDD_ENVIRONMENT_VARIABLES 105 +#define IDC_USER_VARIABLE_LIST 220 +#define IDC_USER_VARIABLE_NEW 221 +#define IDC_USER_VARIABLE_EDIT 222 +#define IDC_USER_VARIABLE_DELETE 223 +#define IDC_SYSTEM_VARIABLE_LIST 224 +#define IDC_SYSTEM_VARIABLE_NEW 225 +#define IDC_SYSTEM_VARIABLE_EDIT 226 +#define IDC_SYSTEM_VARIABLE_DELETE 227 #endif /* __CPL_RESOURCE_H */ diff --git a/reactos/lib/cpl/sysdm/sysdm.h b/reactos/lib/cpl/sysdm/sysdm.h index 0fc26155f9d..915203dfed8 100644 --- a/reactos/lib/cpl/sysdm/sysdm.h +++ b/reactos/lib/cpl/sysdm/sysdm.h @@ -21,8 +21,8 @@ BOOL CALLBACK HardwarePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP BOOL CALLBACK AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK UserProfilePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); - -//BOOL CALLBACK EnvironmentDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +/* environment.c */ +BOOL CALLBACK EnvironmentDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif /* __CPL_SYSDM_H */ diff --git a/reactos/lib/cpl/sysdm/sysdm.rc b/reactos/lib/cpl/sysdm/sysdm.rc index a47bcd20ba3..d9344bd6d27 100644 --- a/reactos/lib/cpl/sysdm/sysdm.rc +++ b/reactos/lib/cpl/sysdm/sysdm.rc @@ -72,9 +72,9 @@ BEGIN LTEXT "Workgroup:",IDC_WORKGROUPDOMAIN,PROPSHEETPADDING,LABELLINE(6)-6,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(6)-6 LTEXT "",IDC_WORKGROUPDOMAIN_NAME,90,LABELLINE(6)-6,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(6)-6 LTEXT "To use the Network Identfication Wizard to join a domain and create a local user, click Network ID.",-1,PROPSHEETPADDING,LABELLINE(7)+5,PROPSHEETWIDTH-(12*PROPSHEETPADDING)-ICONSIZE,LABELLINE(8)+5 - PUSHBUTTON "&Network ID",IDC_NETWORK_ID,185,LABELLINE(7)+5,54,LABELLINE(1)+4 + PUSHBUTTON "&Network ID...",IDC_NETWORK_ID,185,LABELLINE(7)+5,54,LABELLINE(1)+4 LTEXT "To rename this computer or join a domain, click Properties.",-1,PROPSHEETPADDING,LABELLINE(11)+2,PROPSHEETWIDTH-(12*PROPSHEETPADDING)-ICONSIZE,LABELLINE(12)+2 - PUSHBUTTON "&Properties",IDC_NETWORK_PROPERTY,185,LABELLINE(11)+2,54,LABELLINE(1)+4 + PUSHBUTTON "&Properties...",IDC_NETWORK_PROPERTY,185,LABELLINE(11)+2,54,LABELLINE(1)+4 END IDD_PROPPAGEHARDWARE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -85,18 +85,18 @@ BEGIN GROUPBOX "Hardware Wizard",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING LTEXT "The Hardware wizard helps you install, uninstall, repair, unplug, eject, and configure your hardware.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(2), ICONSIZE, ICONSIZE, SS_ICON - PUSHBUTTON "&Hardware Wizard",IDC_HARDWARE_WIZARD,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Hardware Wizard...",IDC_HARDWARE_WIZARD,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 GROUPBOX "Device Manager",-1,PROPSHEETPADDING,LABELLINE(8)+5,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(7)+2 ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(10)-3,ICONSIZE, ICONSIZE, SS_ICON LTEXT "The Device Manager lists all the hardware devices installed on your computer. Use the Device Manager to change the properties of any device.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(10)-3,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) - PUSHBUTTON "&Device Manager",IDC_HARDWARE_DEVICE_MANAGER,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(13)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Device Manager...",IDC_HARDWARE_DEVICE_MANAGER,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(13)+2,(15*PROPSHEETPADDING),14 GROUPBOX "Hardware Profiles",-1,PROPSHEETPADDING,LABELLINE(16)+3,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(18)-5, ICONSIZE, ICONSIZE, SS_ICON LTEXT "Hardware profiles provide a way for you to set up and store different hardware configurations.",0,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(18)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) - PUSHBUTTON "&Hardware Profiles",IDC_HARDWARE_PROFILE,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(20)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Hardware Profiles...",IDC_HARDWARE_PROFILE,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(20)+2,(15*PROPSHEETPADDING),14 END IDD_PROPPAGEUSERPROFILE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -106,10 +106,12 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_DEVMGR, IDC_ICON1, PROPSHEETPADDING,LABELLINE(1), ICONSIZE, ICONSIZE, SS_ICON LTEXT "User profiles contain desktop settings and other information related to your login. A different profile can be created on each computer you use, or you can select a roaming profile that is the same on every computer you use.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(1),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(4) - LTEXT "Profiles stored on this computer:",-1,PROPSHEETPADDING,LABELLINE(6),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(6) - PUSHBUTTON "Delete",IDC_USERPROFILE_DELETE,PROPSHEETPADDING,LABELLINE(23),60,LABELLINE(1)+2 - PUSHBUTTON "Change Type",IDC_USERPROFILE_CHANGE,95,LABELLINE(23),60,LABELLINE(1)+2 - PUSHBUTTON "Copy To",IDC_USERPROFILE_COPY,180,LABELLINE(23),60,LABELLINE(1)+2 + LTEXT "Profiles stored on this computer:",-1,PROPSHEETPADDING,LABELLINE(6),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(1) + CONTROL "",IDC_USERPROFILE_LIST,"SysListView32",LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS|LVS_SORTASCENDING|WS_BORDER|WS_TABSTOP,PROPSHEETPADDING,LABELLINE(8),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(11),WS_EX_CLIENTEDGE + + PUSHBUTTON "Delete",IDC_USERPROFILE_DELETE,PROPSHEETPADDING,LABELLINE(20),60,LABELLINE(1)+2 + PUSHBUTTON "Change Type...",IDC_USERPROFILE_CHANGE,95,LABELLINE(20),60,LABELLINE(1)+2 + PUSHBUTTON "Copy To...",IDC_USERPROFILE_COPY,180,LABELLINE(20),60,LABELLINE(1)+2 END IDD_PROPPAGEADVANCED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -120,15 +122,38 @@ BEGIN GROUPBOX "Performance",-1,PROPSHEETPADDING,LABELLINE(1),PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(2), ICONSIZE, ICONSIZE, SS_ICON LTEXT "Performance options control how applications use memory, which affects the speed of your computer.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(2),PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) - PUSHBUTTON "&Performance Options",IDC_ENVVAR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Performance Options...",IDC_ENVVAR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(5)+2,(15*PROPSHEETPADDING),14 GROUPBOX "Environment Variables",-1,PROPSHEETPADDING,LABELLINE(8)+2,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(10)-5, ICONSIZE, ICONSIZE, SS_ICON LTEXT "Environment variables tell your computer where to find certain types of information.",-1,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(10)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(11) - PUSHBUTTON "&Environment Variables",IDC_ENVVAR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(12)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Environment Variables...",IDC_ENVVAR,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(12)+2,(15*PROPSHEETPADDING),14 GROUPBOX "Startup and Recovery",-1,PROPSHEETPADDING,LABELLINE(15)+3,PROPSHEETWIDTH-(2*PROPSHEETPADDING),LABELLINE(6)+PROPSHEETPADDING ICON IDI_DEVMGR, IDC_ICON1, (2*PROPSHEETPADDING),LABELLINE(17)-5, ICONSIZE, ICONSIZE, SS_ICON LTEXT "Startup and recovery options tell your computer how to start and what to do if an error causes your computer to stop.",0,(4*PROPSHEETPADDING)+ICONSIZE,LABELLINE(17)-5,PROPSHEETWIDTH-(6*PROPSHEETPADDING)-ICONSIZE,LABELLINE(3) - PUSHBUTTON "&Startup and Recovery",IDC_STAREC,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(19)+2,(15*PROPSHEETPADDING),14 + PUSHBUTTON "&Startup and Recovery...",IDC_STAREC,PROPSHEETWIDTH-(17*PROPSHEETPADDING),LABELLINE(19)+2,(15*PROPSHEETPADDING),14 +END + +IDD_ENVIRONMENT_VARIABLES DIALOGEX 6, 18, 252, 245 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Environment Variables" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "User variables",-1,7,12,238,100 + LTEXT "&Variables:",-1,14,24,224,8 + CONTROL "",IDC_USER_VARIABLE_LIST,"SysListView32",LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS|LVS_SORTASCENDING|LVS_NOSORTHEADER|WS_VSCROLL|WS_HSCROLL|WS_TABSTOP,14,35,224,48,WS_EX_CLIENTEDGE + PUSHBUTTON "&New...",IDC_USER_VARIABLE_NEW,80,90,50,14 + PUSHBUTTON "&Edit...",IDC_USER_VARIABLE_EDIT,134,90,50,14 + PUSHBUTTON "&Delete",IDC_USER_VARIABLE_DELETE,188,90,50,14 + + GROUPBOX "System variables",-1,7,116,238,100 + LTEXT "V&ariables:",410,14,128,224,8 + CONTROL "",IDC_SYSTEM_VARIABLE_LIST,"SysListView32",LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS|LVS_SORTASCENDING|LVS_NOSORTHEADER|WS_VSCROLL|WS_HSCROLL|WS_TABSTOP,14,139,224,48,WS_EX_CLIENTEDGE + PUSHBUTTON "Ne&w...",IDC_SYSTEM_VARIABLE_NEW,80,194,50,14 + PUSHBUTTON "Ed&it...",IDC_SYSTEM_VARIABLE_EDIT,134,194,50,14 + PUSHBUTTON "De&lete",IDC_SYSTEM_VARIABLE_DELETE,188,194,50,14 + + DEFPUSHBUTTON "OK",IDOK,141,224,50,14,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,195,224,50,14 END STRINGTABLE From 14377c13f53e98126a70421a615e428c164a49bd Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Fri, 2 Jul 2004 21:02:54 +0000 Subject: [PATCH 172/356] small cleanup svn path=/trunk/; revision=9974 --- reactos/ntoskrnl/Makefile | 87 +++++++++++++-------------------------- 1 file changed, 29 insertions(+), 58 deletions(-) diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 1e89359f57f..ddfb1eddd28 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.128 2004/06/23 22:32:45 ion Exp $ +# $Id: Makefile,v 1.129 2004/07/02 21:02:54 royce Exp $ # # ReactOS Operating System # @@ -535,25 +535,31 @@ OBJECTS := \ $(OBJECTS_PATH)/inbv.o \ $(OBJECTS_RESOURCE) +NTOSKRNL_LIBS := \ + $(DDK_PATH_LIB)/hal.a \ + $(SDK_PATH_LIB)/rtl.a \ + $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ + $(SDK_PATH_LIB)/pseh.a -$(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/rtl.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a +NTOSKRNL_LD_FLAGS := \ + -Wl,--subsystem,native \ + -Wl,--image-base,0xc0000000 \ + -Wl,--file-alignment,0x1000 \ + -Wl,--section-alignment,0x1000 \ + -Wl,--entry,_NtProcessStartup + +$(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(NTOSKRNL_LIBS) $(CC) \ -Wl,-T,ntoskrnl.lnk \ -nostartfiles \ -nostdlib \ -mdll \ -o junk.tmp \ - -Wl,--subsystem,native \ - -Wl,--image-base,0xc0000000 \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,--entry,_NtProcessStartup \ + $(NTOSKRNL_LD_FLAGS) \ -Wl,--base-file,base.tmp \ $(TARGETNAME).o -lgcc \ - $(SDK_PATH_LIB)/rtl.a \ - $(SDK_PATH_LIB)/string.a \ - $(SDK_PATH_LIB)/rosrtl.a \ - $(DDK_PATH_LIB)/hal.a + $(NTOSKRNL_LIBS) - $(RM) junk.tmp $(DLLTOOL) \ --dllname $(TARGETNAME).exe \ @@ -568,37 +574,23 @@ $(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/rtl.a $(SD -Wl,-T,ntoskrnl.lnk \ -mdll \ -o $(TARGETNAME).nostrip.exe \ - -Wl,--subsystem,native \ - -Wl,--image-base,0xc0000000 \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,--entry,_NtProcessStartup \ + $(NTOSKRNL_LD_FLAGS) \ -Wl,temp.exp \ $(TARGETNAME).o -lgcc \ - $(SDK_PATH_LIB)/rtl.a \ - $(SDK_PATH_LIB)/string.a \ - $(SDK_PATH_LIB)/rosrtl.a \ - $(DDK_PATH_LIB)/hal.a + $(NTOSKRNL_LIBS) - $(RM) temp.exp -$(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/rtl.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a +$(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(NTOSKRNL_LIBS) - $(CC) \ -Wl,-T,$(LINKER_SCRIPT) \ -nostartfiles \ -nostdlib \ -mdll \ -o junk.tmp \ - -Wl,--subsystem,native \ - -Wl,--image-base,0xc0000000 \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,--entry,_NtProcessStartup \ + $(NTOSKRNL_LD_FLAGS) \ -Wl,--base-file,base.tmp \ $(TARGETNAME).o -lgcc \ - $(SDK_PATH_LIB)/rtl.a \ - $(SDK_PATH_LIB)/string.a \ - $(SDK_PATH_LIB)/rosrtl.a \ - $(DDK_PATH_LIB)/hal.a + $(NTOSKRNL_LIBS) - $(RM) junk.tmp $(DLLTOOL) \ --dllname $(TARGETNAME).exe \ @@ -613,40 +605,26 @@ $(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_ -nostdlib \ -mdll \ -o $(TARGETNAME).exe \ - -Wl,--subsystem,native \ - -Wl,--image-base,0xc0000000 \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,--entry,_NtProcessStartup \ + $(NTOSKRNL_LD_FLAGS) \ -Wl,temp.exp \ $(TARGETNAME).o -lgcc \ - $(SDK_PATH_LIB)/rtl.a \ - $(SDK_PATH_LIB)/string.a \ - $(SDK_PATH_LIB)/rosrtl.a \ - $(DDK_PATH_LIB)/hal.a + $(NTOSKRNL_LIBS) - $(RM) temp.exp $(TARGETNAME).dbg.o: $(TARGETNAME).o $(STRIP) --strip-debug -o $(TARGETNAME).dbg.o $(TARGETNAME).o -$(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/rtl.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a +$(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(NTOSKRNL_LIBS) $(CC) \ -Wl,-T,$(TARGETNAME).dbg.lnk \ -nostartfiles \ -nostdlib \ -mdll \ -o junk.tmp \ - -Wl,--subsystem,native \ - -Wl,--image-base,0xc0000000 \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,--entry,_NtProcessStartup \ + $(NTOSKRNL_LD_FLAGS) \ -Wl,--base-file,base.tmp \ $(TARGETNAME).dbg.o -lgcc \ - $(SDK_PATH_LIB)/rtl.a \ - $(SDK_PATH_LIB)/string.a \ - $(SDK_PATH_LIB)/rosrtl.a \ - $(DDK_PATH_LIB)/hal.a + $(NTOSKRNL_LIBS) - $(RM) junk.tmp $(DLLTOOL) \ --dllname $(TARGETNAME).dbg \ @@ -661,17 +639,10 @@ $(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(D -nostdlib \ -mdll \ -o $(TARGETNAME).dbg \ - -Wl,--subsystem,native \ - -Wl,--image-base,0xc0000000 \ - -Wl,--file-alignment,0x1000 \ - -Wl,--section-alignment,0x1000 \ - -Wl,--entry,_NtProcessStartup \ + $(NTOSKRNL_LD_FLAGS) \ -Wl,temp.exp \ $(TARGETNAME).dbg.o -lgcc \ - $(SDK_PATH_LIB)/rtl.a \ - $(SDK_PATH_LIB)/string.a \ - $(SDK_PATH_LIB)/rosrtl.a \ - $(DDK_PATH_LIB)/hal.a + $(NTOSKRNL_LIBS) - $(RM) temp.exp $(TARGETNAME).sym: $(TARGETNAME).nostrip.exe From 40afa3d500206509aedfe00999d6086a92ad3d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 2 Jul 2004 21:20:51 +0000 Subject: [PATCH 173/356] NtCreateKey doesn't create nested keys, but RegCreateKey should. Fixes issues 2) and 3) of bug #331 svn path=/trunk/; revision=9975 --- reactos/lib/advapi32/reg/reg.c | 138 +++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 15 deletions(-) diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index 1f720b98c34..fcd890716f4 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.47 2004/06/17 09:07:12 ekohl Exp $ +/* $Id: reg.c,v 1.48 2004/07/02 21:20:51 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -313,6 +313,115 @@ RegConnectRegistryW (LPCWSTR lpMachineName, } +/************************************************************************ + * CreateNestedKey + * + * Create key and all necessary intermediate keys + */ +static NTSTATUS +CreateNestedKey(PHKEY KeyHandle, + POBJECT_ATTRIBUTES ObjectAttributes, + PUNICODE_STRING ClassString, + DWORD dwOptions, + REGSAM samDesired, + DWORD *lpdwDisposition) +{ + OBJECT_ATTRIBUTES LocalObjectAttributes; + UNICODE_STRING LocalKeyName; + ULONG Disposition; + NTSTATUS Status; + ULONG FullNameLength; + ULONG Length; + PWCHAR Ptr; + HANDLE LocalKeyHandle; + + Status = NtCreateKey((PHANDLE) KeyHandle, + samDesired, + ObjectAttributes, + 0, + ClassString, + dwOptions, + (PULONG)lpdwDisposition); + DPRINT("NtCreateKey(%wZ) called (Status %lx)\n", ObjectAttributes->ObjectName, Status); + if (Status != STATUS_OBJECT_NAME_NOT_FOUND) + return Status; + + /* Copy object attributes */ + RtlCopyMemory (&LocalObjectAttributes, + ObjectAttributes, + sizeof(OBJECT_ATTRIBUTES)); + RtlCreateUnicodeString (&LocalKeyName, + ObjectAttributes->ObjectName->Buffer); + LocalObjectAttributes.ObjectName = &LocalKeyName; + FullNameLength = LocalKeyName.Length / sizeof(WCHAR); + + /* Remove the last part of the key name and try to create the key again. */ + while (Status == STATUS_OBJECT_NAME_NOT_FOUND) + { + Ptr = wcsrchr (LocalKeyName.Buffer, '\\'); + if (Ptr == NULL || Ptr == LocalKeyName.Buffer) + { + Status = STATUS_UNSUCCESSFUL; + break; + } + *Ptr = (WCHAR)0; + LocalKeyName.Length = wcslen (LocalKeyName.Buffer) * sizeof(WCHAR); + + Status = NtCreateKey (&LocalKeyHandle, + KEY_ALL_ACCESS, + &LocalObjectAttributes, + 0, + NULL, + 0, + &Disposition); + DPRINT("NtCreateKey(%wZ) called (Status %lx)\n", &LocalKeyName, Status); + } + + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString (&LocalKeyName); + return Status; + } + + /* Add removed parts of the key name and create them too. */ + Length = wcslen (LocalKeyName.Buffer); + while (TRUE) + { + NtClose (LocalKeyHandle); + + LocalKeyName.Buffer[Length] = L'\\'; + Length = wcslen (LocalKeyName.Buffer); + LocalKeyName.Length = Length * sizeof(WCHAR); + + if (Length == FullNameLength) + { + Status = NtCreateKey((PHANDLE) KeyHandle, + samDesired, + ObjectAttributes, + 0, + ClassString, + dwOptions, + (PULONG)lpdwDisposition); + break; + } + Status = NtCreateKey (&LocalKeyHandle, + KEY_ALL_ACCESS, + &LocalObjectAttributes, + 0, + NULL, + 0, + &Disposition); + DPRINT("NtCreateKey(%wZ) called (Status %lx)\n", &LocalKeyName, Status); + if (!NT_SUCCESS(Status)) + break; + } + + RtlFreeUnicodeString (&LocalKeyName); + + return Status; +} + + /************************************************************************ * RegCreateKeyExA * @@ -361,13 +470,12 @@ RegCreateKeyExA (HKEY hKey, OBJ_CASE_INSENSITIVE, (HANDLE)ParentKey, (PSECURITY_DESCRIPTOR)lpSecurityAttributes); - Status = NtCreateKey ((PHANDLE)phkResult, - samDesired, - &Attributes, - 0, - (lpClass == NULL)? NULL : &ClassString, - dwOptions, - (PULONG)lpdwDisposition); + Status = CreateNestedKey(phkResult, + &Attributes, + (lpClass == NULL)? NULL : &ClassString, + dwOptions, + samDesired, + lpdwDisposition); RtlFreeUnicodeString (&SubKeyString); if (lpClass != NULL) { @@ -430,13 +538,12 @@ RegCreateKeyExW (HKEY hKey, OBJ_CASE_INSENSITIVE, (HANDLE)ParentKey, (PSECURITY_DESCRIPTOR)lpSecurityAttributes); - Status = NtCreateKey ((PHANDLE)phkResult, - samDesired, - &Attributes, - 0, - (lpClass == NULL)? NULL : &ClassString, - dwOptions, - (PULONG)lpdwDisposition); + Status = CreateNestedKey(phkResult, + &Attributes, + (lpClass == NULL)? NULL : &ClassString, + dwOptions, + samDesired, + lpdwDisposition); DPRINT("Status %x\n", Status); if (!NT_SUCCESS(Status)) { @@ -1622,6 +1729,7 @@ RegOpenKeyA (HKEY hKey, LONG ErrorCode; NTSTATUS Status; +DPRINT1("RegOpenKeyA hKey 0x%x subkey %s\n", hKey, lpSubKey); Status = MapDefaultKey (&KeyHandle, hKey); if (!NT_SUCCESS(Status)) From ac183abd237145228390ec2606b743b77b98f10e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 3 Jul 2004 13:45:42 +0000 Subject: [PATCH 174/356] - Handle correctly bottom-up surfaces in the VGA driver. svn path=/trunk/; revision=9976 --- reactos/drivers/video/displays/vga/objects/bitblt.c | 6 +++--- reactos/drivers/video/displays/vga/objects/pointer.c | 10 +++++----- reactos/drivers/video/displays/vga/objects/transblt.c | 2 +- reactos/drivers/video/displays/vga/vgavideo/vgavideo.c | 5 ++++- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/reactos/drivers/video/displays/vga/objects/bitblt.c b/reactos/drivers/video/displays/vga/objects/bitblt.c index 2f8b8e30cfa..b80fc8ff520 100644 --- a/reactos/drivers/video/displays/vga/objects/bitblt.c +++ b/reactos/drivers/video/displays/vga/objects/bitblt.c @@ -77,7 +77,7 @@ VGAtoDIB(SURFOBJ *Dest, SURFOBJ *Source, XLATEOBJ *ColorTranslation, // FIXME: Optimize to retrieve entire bytes at a time (see /display/vgavideo/vgavideo.c:vgaGetByte) - GDIpos = Dest->pvBits /* + (DestRect->top * Dest->lDelta) + (DestRect->left >> 1) */ ; + GDIpos = Dest->pvScan0 /* + (DestRect->top * Dest->lDelta) + (DestRect->left >> 1) */ ; dx = DestRect->right - DestRect->left; dy = DestRect->bottom - DestRect->top; @@ -87,7 +87,7 @@ VGAtoDIB(SURFOBJ *Dest, SURFOBJ *Source, XLATEOBJ *ColorTranslation, DestDevSurf.NextScan = Dest->lDelta; DestDevSurf.StartBmp = Dest->pvScan0; - DIB_BltFromVGA(SourcePoint->x, SourcePoint->y, dx, dy, Dest->pvBits, Dest->lDelta); + DIB_BltFromVGA(SourcePoint->x, SourcePoint->y, dx, dy, Dest->pvScan0, Dest->lDelta); } else { // Color translation @@ -353,7 +353,7 @@ VGADDI_BltMask(SURFOBJ* Dest, SURFOBJ* Source, SURFOBJ* Mask, { if (Mask != NULL) { - tMask = Mask->pvBits; + tMask = Mask->pvScan0; for (j=0; jflCursor = ppdev->flCursor & (~ CURSOR_DOWN); - NewWidth = psoMask->lDelta << 3; - NewHeight = (psoMask->cjBits / psoMask->lDelta) / 2; + NewWidth = abs(psoMask->lDelta) << 3; + NewHeight = (psoMask->cjBits / abs(psoMask->lDelta)) / 2; /* Reallocate the space for the cursor if necessary. */ if (ppdev->pPointerAttributes->Width != NewWidth || @@ -275,11 +275,10 @@ DrvSetPointerShape(SURFOBJ* pso, ImageBehindCursor = VGADDI_AllocSavedScreenBits(SavedMemSize); } + Src = (PUCHAR)psoMask->pvScan0; /* Copy the new cursor in. */ for (i = 0; i < (NewHeight * 2); i++) { - Src = (PUCHAR)psoMask->pvBits; - Src += (i * (NewWidth >> 3)); Dest = (PUCHAR)ppdev->pPointerAttributes->Pixels; if (i >= NewHeight) { @@ -290,6 +289,7 @@ DrvSetPointerShape(SURFOBJ* pso, Dest += ((NewHeight - i - 1) * (NewWidth >> 3)); } memcpy(Dest, Src, NewWidth >> 3); + Src += psoMask->lDelta; } /* Set the new cursor position */ diff --git a/reactos/drivers/video/displays/vga/objects/transblt.c b/reactos/drivers/video/displays/vga/objects/transblt.c index 25eb5fc0c2b..eabb2347337 100644 --- a/reactos/drivers/video/displays/vga/objects/transblt.c +++ b/reactos/drivers/video/displays/vga/objects/transblt.c @@ -28,7 +28,7 @@ DrvTransparentBlt(SURFOBJ* Dest, if(syleft, DestRect->top, dx, dy, Source->pvBits, Source->lDelta, TransparentColor); + DIB_TransparentBltToVGA(DestRect->left, DestRect->top, dx, dy, Source->pvScan0, Source->lDelta, TransparentColor); return TRUE; } diff --git a/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c b/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c index f740b797d39..aadc24aac04 100644 --- a/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c +++ b/reactos/drivers/video/displays/vga/vgavideo/vgavideo.c @@ -407,7 +407,10 @@ void DIB_BltFromVGA(int x, int y, int w, int h, void *b, int Dest_lDelta) } /* Reset the destination. */ - memset(b, 0, h * Dest_lDelta); + for (j = 0; j < h; j++) + { + memset(b + (j * Dest_lDelta), 0, abs(Dest_lDelta)); + } for (plane = 0; plane < 4; plane++) { From 0a89ed6e1ce4e0a11740d26d0906c5629791d3ff Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 3 Jul 2004 13:55:37 +0000 Subject: [PATCH 175/356] [Sorry for too many changes in one patch, but it's nearly impossible to separate it without breaking the functionality] - Remove the eng/brush.h header and all occurrences of BRUSHINST. - Remove eng/nls.c and make the NLS functions forward exports to ntoskrnl. - Remove DDBITMAP definition. - Overall cleanup of eng/xlate.c. - Stop processing if exact match is found in ClosestColorMatch. - Move SURFGDI->PointerStatus to GDIDEVICE structure. - Remove the GDIDEVICE->DriverLock. - Replace BITMAP by SURFOBJ in BITMAPOBJ structure and added two new members (Flags and Hooks). - Replace function pointers to driver functions in SURFGDI with flHooks variable specifying the bitmask of hooked functions. - Added two new macros: GDIDEV and GDIDEVFUNCS. - Fixed locking in NtGdiGetBitmapBits. - Removed IntCopyBitmap and replaced it's usage by BITMAPOBJ_CopyBitmap. - Fixed setting of SURFOBJ->pvBits and SURFOBJ->pvScan0 in EngCreateBitmap for bottom-up surfaces. - Fix DPRINTs. - Remove unused definitions from eng/objects.h. - Call IntEngBitBlt instead of EngBitBlt from EngCopyBits. - Correctly set the SURFOBJ->hsurf field. - Merge Engine surface handling with the GDI one and remove DC->Surface, SURFGDI, BitmapToSurf. - Support for bottom-up mouse cursors in the Eng* cursor emulation routines. - Fix locking in error cases of NtGdiRestoreDC (get Primitives demo to start). - Fix BitmapFormat to return 0 for unknown bit depth. - Move code from EngCreateBitmap to IntCreateBitmap and use this function in EngCreateBitmap, NtGdiCreateBitmap and DIB_CreateDIBSection. - New implementation of NtGdiGetDIBits. svn path=/trunk/; revision=9977 --- reactos/include/win32k/bitmaps.h | 15 +- reactos/include/win32k/dc.h | 3 +- reactos/subsys/win32k/dib/dib.c | 161 +++-- reactos/subsys/win32k/dib/dib.h | 60 +- reactos/subsys/win32k/dib/dib16bpp.c | 98 ++- reactos/subsys/win32k/dib/dib1bpp.c | 45 +- reactos/subsys/win32k/dib/dib24bpp.c | 37 +- reactos/subsys/win32k/dib/dib32bpp.c | 88 ++- reactos/subsys/win32k/dib/dib4bpp.c | 53 +- reactos/subsys/win32k/dib/dib8bpp.c | 98 ++- reactos/subsys/win32k/eng/bitblt.c | 220 +++---- reactos/subsys/win32k/eng/brush.h | 77 --- reactos/subsys/win32k/eng/copybits.c | 78 ++- reactos/subsys/win32k/eng/gradient.c | 52 +- reactos/subsys/win32k/eng/lineto.c | 61 +- reactos/subsys/win32k/eng/misc.c | 15 +- reactos/subsys/win32k/eng/misc.h | 3 +- reactos/subsys/win32k/eng/mouse.c | 67 +- reactos/subsys/win32k/eng/nls.c | 80 --- reactos/subsys/win32k/eng/objects.h | 87 +-- reactos/subsys/win32k/eng/paint.c | 44 +- reactos/subsys/win32k/eng/surface.c | 233 +++---- reactos/subsys/win32k/eng/transblt.c | 69 +- reactos/subsys/win32k/eng/xlate.c | 239 ++++--- reactos/subsys/win32k/include/copybits.h | 9 - reactos/subsys/win32k/include/dib.h | 2 - reactos/subsys/win32k/include/eng.h | 6 - reactos/subsys/win32k/include/inteng.h | 121 ++-- reactos/subsys/win32k/include/mouse.h | 4 +- reactos/subsys/win32k/include/object.h | 6 - reactos/subsys/win32k/include/paint.h | 2 +- reactos/subsys/win32k/include/surface.h | 4 + reactos/subsys/win32k/makefile | 9 +- reactos/subsys/win32k/ntuser/desktop.c | 13 +- reactos/subsys/win32k/ntuser/input.c | 78 ++- reactos/subsys/win32k/ntuser/misc.c | 10 +- reactos/subsys/win32k/objects/bitmaps.c | 242 ++++--- reactos/subsys/win32k/objects/brush.c | 12 +- reactos/subsys/win32k/objects/color.c | 13 +- reactos/subsys/win32k/objects/cursoricon.c | 110 ++-- reactos/subsys/win32k/objects/dc.c | 70 +-- reactos/subsys/win32k/objects/dib.c | 698 ++++++--------------- reactos/subsys/win32k/objects/fillshap.c | 82 +-- reactos/subsys/win32k/objects/gdiobj.c | 6 +- reactos/subsys/win32k/objects/line.c | 39 +- reactos/subsys/win32k/objects/objconv.c | 51 -- reactos/subsys/win32k/objects/polyfill.c | 18 +- reactos/subsys/win32k/objects/print.c | 16 +- reactos/subsys/win32k/objects/region.c | 13 +- reactos/subsys/win32k/objects/text.c | 43 +- reactos/subsys/win32k/w32k.h | 1 - reactos/subsys/win32k/win32k.edf | 8 +- 52 files changed, 1431 insertions(+), 2238 deletions(-) delete mode 100644 reactos/subsys/win32k/eng/brush.h delete mode 100644 reactos/subsys/win32k/eng/nls.c delete mode 100644 reactos/subsys/win32k/include/copybits.h delete mode 100644 reactos/subsys/win32k/objects/objconv.c diff --git a/reactos/include/win32k/bitmaps.h b/reactos/include/win32k/bitmaps.h index 3e2282fb6bb..084519ed94c 100644 --- a/reactos/include/win32k/bitmaps.h +++ b/reactos/include/win32k/bitmaps.h @@ -5,29 +5,24 @@ #include #include -typedef struct _DDBITMAP -{ - const PDRIVER_FUNCTIONS pDriverFunctions; -/* DHPDEV PDev; */ -/* HSURF Surface; */ -} DDBITMAP; - /* GDI logical bitmap object */ typedef struct _BITMAPOBJ { - BITMAP bitmap; + SURFOBJ SurfObj; + FLONG flHooks; + FLONG flFlags; SIZE dimension; /* For SetBitmapDimension(), do NOT use to get width/height of bitmap, use bitmap.bmWidth/bitmap.bmHeight for that */ - DDBITMAP *DDBitmap; - /* For device-independent bitmaps: */ DIBSECTION *dib; RGBQUAD *ColorMap; } BITMAPOBJ, *PBITMAPOBJ; +#define BITMAPOBJ_IS_APIBITMAP 0x1 + /* Internal interface */ #define BITMAPOBJ_AllocBitmap() \ diff --git a/reactos/include/win32k/dc.h b/reactos/include/win32k/dc.h index cc1c1289335..4f877f0bfd9 100644 --- a/reactos/include/win32k/dc.h +++ b/reactos/include/win32k/dc.h @@ -83,7 +83,6 @@ typedef struct _DC HSURF FillPatternSurfaces[HS_DDI_MAX]; PGDIINFO GDIInfo; PDEVINFO DevInfo; - HSURF Surface; HDEV GDIDevice; DRIVER_FUNCTIONS DriverFunctions; @@ -116,7 +115,6 @@ typedef struct DEVINFO DevInfo; DRIVER_FUNCTIONS DriverFunctions; PFILE_OBJECT VideoFileObject; - FAST_MUTEX DriverLock; struct { BOOL Enable; @@ -130,6 +128,7 @@ typedef struct HSURF PointerMaskSurface; HSURF PointerSaveSurface; POINTL PointerHotSpot; + ULONG PointerStatus; } GDIDEVICE; /* Internal functions */ diff --git a/reactos/subsys/win32k/dib/dib.c b/reactos/subsys/win32k/dib/dib.c index e7a62938f18..2ed9d8a906a 100644 --- a/reactos/subsys/win32k/dib/dib.c +++ b/reactos/subsys/win32k/dib/dib.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib.c,v 1.10 2004/05/10 17:07:16 weiden Exp $ */ +/* $Id: dib.c,v 1.11 2004/07/03 13:55:35 navaraf Exp $ */ #include /* Static data */ @@ -24,62 +24,107 @@ unsigned char notmask[2] = { 0x0f, 0xf0 }; unsigned char altnotmask[2] = { 0xf0, 0x0f }; -ULONG -DIB_GetSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation) +DIB_FUNCTIONS DibFunctionsForBitmapFormat[] = { - switch (SourceGDI->BitsPerPixel) + /* 0 */ + { + Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, + Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + }, + /* BMF_1BPP */ + { + DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine, + DIB_1BPP_BitBlt, DIB_1BPP_StretchBlt, DIB_1BPP_TransparentBlt + }, + /* BMF_4BPP */ + { + DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine, + DIB_4BPP_BitBlt, DIB_4BPP_StretchBlt, DIB_4BPP_TransparentBlt + }, + /* BMF_8BPP */ + { + DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine, + DIB_8BPP_BitBlt, DIB_8BPP_StretchBlt, DIB_8BPP_TransparentBlt + }, + /* BMF_16BPP */ + { + DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine, + DIB_16BPP_BitBlt, DIB_16BPP_StretchBlt, DIB_16BPP_TransparentBlt + }, + /* BMF_24BPP */ + { + DIB_24BPP_PutPixel, DIB_24BPP_GetPixel, DIB_24BPP_HLine, DIB_24BPP_VLine, + DIB_24BPP_BitBlt, DIB_24BPP_StretchBlt, DIB_24BPP_TransparentBlt + }, + /* BMF_32BPP */ + { + DIB_32BPP_PutPixel, DIB_32BPP_GetPixel, DIB_32BPP_HLine, DIB_32BPP_VLine, + DIB_32BPP_BitBlt, DIB_32BPP_StretchBlt, DIB_32BPP_TransparentBlt + }, + /* BMF_4RLE */ + { + Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, + Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + }, + /* BMF_8RLE */ + { + Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, + Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + }, + /* BMF_JPEG */ + { + Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, + Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + }, + /* BMF_PNG */ + { + Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, + Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + } +}; + +ULONG +DIB_GetSource(SURFOBJ* SourceSurf, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation) +{ + switch (SourceSurf->iBitmapFormat) { - case 1: - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy)) - { - return(XLATEOBJ_iXlate(ColorTranslation, 1)); - } - else - { - return(XLATEOBJ_iXlate(ColorTranslation, 0)); - } - case 4: - if (ColorTranslation != NULL) - { - return(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy))); - } - else - { - return(DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - } - case 8: + case BMF_1BPP: + return(XLATEOBJ_iXlate(ColorTranslation, DIB_1BPP_GetPixel(SourceSurf, sx, sy))); + case BMF_4BPP: + return(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy))); + case BMF_8BPP: return(XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy))); - case 16: + case BMF_16BPP: return(XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy))); - case 24: + case BMF_24BPP: return(XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy))); - case 32: + case BMF_32BPP: return(XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy))); default: - DPRINT1("DIB_GetSource: Unhandled number of bits per pixel in source (%d).\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_GetSource: Unhandled number of bits per pixel in source (%d).\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return(0); } } ULONG -DIB_GetSourceIndex(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy) +DIB_GetSourceIndex(SURFOBJ* SourceSurf, ULONG sx, ULONG sy) { - switch (SourceGDI->BitsPerPixel) + switch (SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: return DIB_1BPP_GetPixel(SourceSurf, sx, sy); - case 4: + case BMF_4BPP: return DIB_4BPP_GetPixel(SourceSurf, sx, sy); - case 8: + case BMF_8BPP: return DIB_8BPP_GetPixel(SourceSurf, sx, sy); - case 16: + case BMF_16BPP: return DIB_16BPP_GetPixel(SourceSurf, sx, sy); - case 24: + case BMF_24BPP: return DIB_24BPP_GetPixel(SourceSurf, sx, sy); - case 32: + case BMF_32BPP: return DIB_32BPP_GetPixel(SourceSurf, sx, sy); default: - DPRINT1("DIB_GetOriginalSource: Unhandled number of bits per pixel in source (%d).\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_GetOriginalSource: Unhandled number of bits per pixel in source (%d).\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return(0); } } @@ -184,4 +229,48 @@ DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern) return(Result); } +VOID Dummy_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c) +{ + return; +} + +ULONG Dummy_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y) +{ + return 0; +} + +VOID Dummy_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c) +{ + return; +} + +VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c) +{ + return; +} + +BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + RECTL* DestRect, POINTL *SourcePoint, + BRUSHOBJ* BrushObj, POINTL BrushOrign, + XLATEOBJ *ColorTranslation, ULONG Rop4) +{ + return FALSE; +} + +BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrign, + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode) +{ + return FALSE; +} + +BOOLEAN Dummy_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor) +{ + return FALSE; +} + /* EOF */ diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index 24a07cdb767..b6ca70fa58c 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -1,30 +1,65 @@ #ifndef _W32K_DIB_DIB_H #define _W32K_DIB_DIB_H +typedef VOID (*PFN_DIB_PutPixel)(SURFOBJ*,LONG,LONG,ULONG); +typedef ULONG (*PFN_DIB_GetPixel)(SURFOBJ*,LONG,LONG); +typedef VOID (*PFN_DIB_HLine)(SURFOBJ*,LONG,LONG,LONG,ULONG); +typedef VOID (*PFN_DIB_VLine)(SURFOBJ*,LONG,LONG,LONG,ULONG); +typedef BOOLEAN (*PFN_DIB_BitBlt)(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,BRUSHOBJ*,POINTL,XLATEOBJ*,ULONG); +typedef BOOLEAN (*PFN_DIB_StretchBlt)(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +typedef BOOLEAN (*PFN_DIB_TransparentBlt)(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +typedef struct +{ + PFN_DIB_PutPixel DIB_PutPixel; + PFN_DIB_GetPixel DIB_GetPixel; + PFN_DIB_HLine DIB_HLine; + PFN_DIB_VLine DIB_VLine; + PFN_DIB_BitBlt DIB_BitBlt; + PFN_DIB_StretchBlt DIB_StretchBlt; + PFN_DIB_TransparentBlt DIB_TransparentBlt; +} DIB_FUNCTIONS; + +extern DIB_FUNCTIONS DibFunctionsForBitmapFormat[]; + extern unsigned char notmask[2]; extern unsigned char altnotmask[2]; #define MASK1BPP(x) (1<<(7-((x)&7))) ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern); -ULONG DIB_GetSource(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation); -ULONG DIB_GetSourceIndex(SURFOBJ* SourceSurf, SURFGDI* SourceGDI, ULONG sx, ULONG sy); +ULONG DIB_GetSource(SURFOBJ* SourceSurf, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation); +ULONG DIB_GetSourceIndex(SURFOBJ* SourceSurf, ULONG sx, ULONG sy); + +VOID Dummy_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); +ULONG Dummy_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); +VOID Dummy_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); +VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); +BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + RECTL* DestRect, POINTL *SourcePoint, + BRUSHOBJ* BrushObj, POINTL BrushOrign, + XLATEOBJ *ColorTranslation, ULONG Rop4); +BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + RECTL* DestRect, RECTL *SourceRect, + POINTL* MaskOrigin, POINTL BrushOrign, + CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, + ULONG Mode); +BOOLEAN Dummy_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, + RECTL* DestRect, POINTL *SourcePoint, + XLATEOBJ *ColorTranslation, ULONG iTransColor); VOID DIB_1BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); ULONG DIB_1BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); VOID DIB_1BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); VOID DIB_1BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); BOOLEAN DIB_1BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, BRUSHOBJ* Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4); BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); @@ -33,18 +68,15 @@ ULONG DIB_4BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); VOID DIB_4BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); VOID DIB_4BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); BOOLEAN DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, BRUSHOBJ* Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4); BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); @@ -53,18 +85,15 @@ ULONG DIB_8BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); VOID DIB_8BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); VOID DIB_8BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); BOOLEAN DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, BRUSHOBJ* Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4); BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); @@ -73,18 +102,15 @@ ULONG DIB_16BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); VOID DIB_16BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); VOID DIB_16BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); BOOLEAN DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, BRUSHOBJ* Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4); BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); @@ -93,18 +119,15 @@ ULONG DIB_24BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); VOID DIB_24BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); VOID DIB_24BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); BOOLEAN DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, BRUSHOBJ* Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4); BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); @@ -113,18 +136,15 @@ ULONG DIB_32BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); VOID DIB_32BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); VOID DIB_32BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); BOOLEAN DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, POINTL *SourcePoint, BRUSHOBJ* Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4); BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode); BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor); diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 21ff5cd0b42..e85958231ab 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib16bpp.c,v 1.32 2004/05/14 22:56:17 gvg Exp $ */ +/* $Id: dib16bpp.c,v 1.33 2004/07/03 13:55:35 navaraf Exp $ */ #include VOID @@ -69,7 +69,6 @@ DIB_16BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) BOOLEAN STATIC DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation) { @@ -78,9 +77,9 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, PBYTE SourceBits_4BPP, SourceLine_4BPP; DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 2 * DestRect->left; - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: sx = SourcePoint->x; sy = SourcePoint->y; @@ -101,7 +100,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 4: + case BMF_4BPP: SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); for (j=DestRect->top; jbottom; j++) @@ -123,7 +122,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 8: + case BMF_8BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; DestLine = DestBits; @@ -144,7 +143,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 16: + case BMF_16BPP: if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) { if (DestRect->top < SourcePoint->y) @@ -210,7 +209,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 24: + case BMF_24BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; DestLine = DestBits; @@ -234,7 +233,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 32: + case BMF_32BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; DestLine = DestBits; @@ -256,7 +255,7 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DPRINT1("DIB_16BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_16BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -265,7 +264,6 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) @@ -288,8 +286,6 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return DIB_16BPP_BitBltSrcCopy( DestSurf, SourceSurf, - DestGDI, - SourceGDI, DestRect, SourcePoint, ColorTranslation); @@ -309,11 +305,10 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, NULL); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -348,8 +343,8 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); - Source |= DIB_GetSource(SourceSurf, SourceGDI, SourceX + 1, SourceY, ColorTranslation) << 16; + Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); + Source |= DIB_GetSource(SourceSurf, SourceX + 1, SourceY, ColorTranslation) << 16; } if (UsesPattern) @@ -367,7 +362,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); } if (UsesPattern) @@ -385,7 +380,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } @@ -506,14 +501,14 @@ FinalCopy16(PIXEL *Target, PIXEL *Source, PSPAN ClipSpans, UINT ClipSpansCount, } //NOTE: If you change something here, please do the same in other dibXXbpp.c files! -BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, +BOOLEAN ScaleRectAvg16(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { int NumPixels = DestRect->bottom - DestRect->top; - int IntPart = (((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * SourceGDI->SurfObj.lDelta) >> 1; /* ((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * (SourceRect->right - SourceRect->left); */ + int IntPart = (((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * SourceSurf->lDelta) >> 1; int FractPart = (SourceRect->bottom - SourceRect->top) % (DestRect->bottom - DestRect->top); int Mid = (DestRect->bottom - DestRect->top) >> 1; int E = 0; @@ -521,8 +516,8 @@ BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, PIXEL *ScanLine, *ScanLineAhead; PIXEL *PrevSource = NULL; PIXEL *PrevSourceAhead = NULL; - PIXEL *Target = (PIXEL *) (DestGDI->SurfObj.pvScan0 + (DestRect->top * DestGDI->SurfObj.lDelta) + 2 * DestRect->left); - PIXEL *Source = (PIXEL *) (SourceGDI->SurfObj.pvScan0 + (SourceRect->top * SourceGDI->SurfObj.lDelta) + 2 * SourceRect->left); + PIXEL *Target = (PIXEL *) (DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 2 * DestRect->left); + PIXEL *Source = (PIXEL *) (SourceSurf->pvScan0 + (SourceRect->top * SourceSurf->lDelta) + 2 * SourceRect->left); PSPAN ClipSpans; UINT ClipSpansCount; UINT SpanIndex; @@ -562,12 +557,12 @@ BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, PrevSource = Source; } /* if */ - if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta)) { + if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceSurf->lDelta)) { int x; - ScaleLineAvg16(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta), SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); + ScaleLineAvg16(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceSurf->lDelta), SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); for (x = 0; x < DestRect->right - DestRect->left; x++) ScanLine[x] = average16(ScanLine[x], ScanLineAhead[x]); - PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); + PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceSurf->lDelta); } /* if */ if (! FinalCopy16(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) @@ -579,12 +574,12 @@ BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, return TRUE; } DestY++; - Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); + Target = (PIXEL *)((BYTE *)Target + DestSurf->lDelta); Source += IntPart; E += FractPart; if (E >= DestRect->bottom - DestRect->top) { E -= DestRect->bottom - DestRect->top; - Source = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); + Source = (PIXEL *)((BYTE *)Source + SourceSurf->lDelta); } /* if */ } /* while */ @@ -600,7 +595,7 @@ BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, return TRUE; } DestY++; - Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); + Target = (PIXEL *)((BYTE *)Target + DestSurf->lDelta); } /* while */ ExFreePool(ClipSpans); @@ -612,45 +607,33 @@ BOOLEAN ScaleRectAvg16(SURFGDI *DestGDI, SURFGDI *SourceGDI, //NOTE: If you change something here, please do the same in other dibXXbpp.c files! BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { DPRINT("DIB_16BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", - SourceGDI->BitsPerPixel, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: - return FALSE; - break; - - case 4: - return FALSE; - break; - - case 8: - return FALSE; + case BMF_1BPP: + case BMF_4BPP: + case BMF_8BPP: + case BMF_24BPP: + case BMF_32BPP: + /* Not implemented yet. */ + return FALSE; break; - case 16: - return ScaleRectAvg16(DestGDI, SourceGDI, DestRect, SourceRect, MaskOrigin, BrushOrigin, + case BMF_16BPP: + return ScaleRectAvg16(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin, ClipRegion, ColorTranslation, Mode); break; - - case 24: - return FALSE; - break; - - case 32: - return FALSE; - break; default: - DPRINT1("DIB_16BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_16BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -661,7 +644,6 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { @@ -682,14 +664,14 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { Dest = *DestBits; - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX, SourceY); if(Source != iTransColor) { Dest &= 0xFFFF0000; Dest |= (XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFFFF); } - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX + 1, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX + 1, SourceY); if(Source != iTransColor) { Dest &= 0xFFFF; @@ -701,7 +683,7 @@ DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if(X < DestRect->right) { - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX, SourceY); if(Source != iTransColor) { *((USHORT*)DestBits) = (USHORT)XLATEOBJ_iXlate(ColorTranslation, Source); diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 57c7e6daf34..00e1f8cd820 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib1bpp.c,v 1.29 2004/05/27 12:35:23 royce Exp $ */ +/* $Id: dib1bpp.c,v 1.30 2004/07/03 13:55:35 navaraf Exp $ */ #include VOID @@ -229,19 +229,18 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( BOOLEAN DIB_1BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation) { LONG i, j, sx, sy = SourcePoint->y; - switch ( SourceGDI->BitsPerPixel ) + switch ( SourceSurf->iBitmapFormat ) { - case 1: + case BMF_1BPP: DIB_1BPP_BitBltSrcCopy_From1BPP ( DestSurf, SourceSurf, DestRect, SourcePoint ); break; - case 4: + case BMF_4BPP: for (j=DestRect->top; jbottom; j++) { sx = SourcePoint->x; @@ -259,7 +258,7 @@ DIB_1BPP_BitBltSrcCopy( } break; - case 8: + case BMF_8BPP: for (j=DestRect->top; jbottom; j++) { sx = SourcePoint->x; @@ -277,7 +276,7 @@ DIB_1BPP_BitBltSrcCopy( } break; - case 16: + case BMF_16BPP: for (j=DestRect->top; jbottom; j++) { sx = SourcePoint->x; @@ -295,7 +294,7 @@ DIB_1BPP_BitBltSrcCopy( } break; - case 24: + case BMF_24BPP: for (j=DestRect->top; jbottom; j++) { sx = SourcePoint->x; @@ -313,7 +312,7 @@ DIB_1BPP_BitBltSrcCopy( } break; - case 32: + case BMF_32BPP: for (j=DestRect->top; jbottom; j++) { sx = SourcePoint->x; @@ -332,7 +331,7 @@ DIB_1BPP_BitBltSrcCopy( break; default: - DbgPrint("DIB_1BPP_BitBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DbgPrint("DIB_1BPP_BitBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -342,7 +341,6 @@ DIB_1BPP_BitBltSrcCopy( BOOLEAN DIB_1BPP_BitBlt( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) @@ -365,8 +363,6 @@ DIB_1BPP_BitBlt( return DIB_1BPP_BitBltSrcCopy( DestSurf, SourceSurf, - DestGDI, - SourceGDI, DestRect, SourcePoint, ColorTranslation); @@ -386,11 +382,10 @@ DIB_1BPP_BitBlt( GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, NULL); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -431,7 +426,7 @@ DIB_1BPP_BitBlt( { Source = 0; for (k = 31 - NoBits; k < NoBits; k++) - Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (31 - k)); + Source |= (DIB_GetSource(SourceSurf, SourceX + k, SourceY, ColorTranslation) << (31 - k)); } if (UsesPattern) @@ -460,10 +455,10 @@ DIB_1BPP_BitBlt( Source = 0; for (k = 0; k < 8; k++) { - Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (7 - k)); - Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k + 8, SourceY, ColorTranslation) << (8 + (7 - k))); - Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k + 16, SourceY, ColorTranslation) << (16 + (7 - k))); - Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k + 24, SourceY, ColorTranslation) << (24 + (7 - k))); + Source |= (DIB_GetSource(SourceSurf, SourceX + k, SourceY, ColorTranslation) << (7 - k)); + Source |= (DIB_GetSource(SourceSurf, SourceX + k + 8, SourceY, ColorTranslation) << (8 + (7 - k))); + Source |= (DIB_GetSource(SourceSurf, SourceX + k + 16, SourceY, ColorTranslation) << (16 + (7 - k))); + Source |= (DIB_GetSource(SourceSurf, SourceX + k + 24, SourceY, ColorTranslation) << (24 + (7 - k))); } } @@ -492,7 +487,7 @@ DIB_1BPP_BitBlt( if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); } if (UsesPattern) @@ -509,7 +504,7 @@ DIB_1BPP_BitBlt( } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } @@ -517,19 +512,17 @@ DIB_1BPP_BitBlt( BOOLEAN DIB_1BPP_StretchBlt ( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); + DbgPrint("DIB_1BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 709c67a36ac..56e35822bce 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib24bpp.c,v 1.28 2004/06/09 20:39:41 sedwards Exp $ */ +/* $Id: dib24bpp.c,v 1.29 2004/07/03 13:55:35 navaraf Exp $ */ #include VOID @@ -67,7 +67,6 @@ DIB_24BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) BOOLEAN DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation) { @@ -78,9 +77,9 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + DestRect->left * 3; - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: sx = SourcePoint->x; sy = SourcePoint->y; @@ -101,7 +100,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 4: + case BMF_4BPP: SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); for (j=DestRect->top; jbottom; j++) @@ -127,7 +126,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 8: + case BMF_8BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; DestLine = DestBits; @@ -150,7 +149,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 16: + case BMF_16BPP: SourceBits_16BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; for (j=DestRect->top; jbottom; j++) @@ -172,7 +171,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 24: + case BMF_24BPP: if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) { if (DestRect->top < SourcePoint->y) @@ -205,7 +204,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 32: + case BMF_32BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; DestLine = DestBits; @@ -229,7 +228,7 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_24BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DbgPrint("DIB_24BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -238,7 +237,6 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) @@ -260,8 +258,6 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return DIB_24BPP_BitBltSrcCopy( DestSurf, SourceSurf, - DestGDI, - SourceGDI, DestRect, SourcePoint, ColorTranslation); @@ -281,11 +277,10 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, NULL); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -317,7 +312,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); } if (UsesPattern) @@ -336,25 +331,23 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - DbgPrint("DIB_24BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); + DbgPrint("DIB_24BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { @@ -372,7 +365,7 @@ DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceX = SourcePoint->x; for(X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) { - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX, SourceY); if(Source != iTransColor) { Dest = XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFFFFFF; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index f33c9d5cead..fe378627eda 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib32bpp.c,v 1.27 2004/05/14 22:56:17 gvg Exp $ */ +/* $Id: dib32bpp.c,v 1.28 2004/07/03 13:55:35 navaraf Exp $ */ #include VOID @@ -68,7 +68,6 @@ DIB_32BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) BOOLEAN DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation) { @@ -79,9 +78,9 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 4 * DestRect->left; - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: sx = SourcePoint->x; sy = SourcePoint->y; @@ -102,7 +101,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 4: + case BMF_4BPP: SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); for (j=DestRect->top; jbottom; j++) @@ -124,7 +123,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 8: + case BMF_8BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; DestLine = DestBits; @@ -146,7 +145,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 16: + case BMF_16BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; DestLine = DestBits; @@ -168,7 +167,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 24: + case BMF_24BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; DestLine = DestBits; @@ -192,7 +191,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 32: + case BMF_32BPP: if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) { if (DestRect->top < SourcePoint->y) @@ -278,7 +277,7 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -287,7 +286,6 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) @@ -309,8 +307,6 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return DIB_32BPP_BitBltSrcCopy( DestSurf, SourceSurf, - DestGDI, - SourceGDI, DestRect, SourcePoint, ColorTranslation); @@ -330,11 +326,10 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, NULL); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -368,7 +363,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); } if (UsesPattern) @@ -385,7 +380,7 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } @@ -476,14 +471,14 @@ FinalCopy32(PIXEL *Target, PIXEL *Source, PSPAN ClipSpans, UINT ClipSpansCount, } //NOTE: If you change something here, please do the same in other dibXXbpp.c files! -BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, +BOOLEAN ScaleRectAvg32(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { int NumPixels = DestRect->bottom - DestRect->top; - int IntPart = (((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * SourceGDI->SurfObj.lDelta) / 4; //((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * (SourceRect->right - SourceRect->left); + int IntPart = (((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * SourceSurf->lDelta) / 4; int FractPart = (SourceRect->bottom - SourceRect->top) % (DestRect->bottom - DestRect->top); int Mid = (DestRect->bottom - DestRect->top) >> 1; int E = 0; @@ -491,8 +486,8 @@ BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, PIXEL *ScanLine, *ScanLineAhead; PIXEL *PrevSource = NULL; PIXEL *PrevSourceAhead = NULL; - PIXEL *Target = (PIXEL *) (DestGDI->SurfObj.pvScan0 + (DestRect->top * DestGDI->SurfObj.lDelta) + 4 * DestRect->left); - PIXEL *Source = (PIXEL *) (SourceGDI->SurfObj.pvScan0 + (SourceRect->top * SourceGDI->SurfObj.lDelta) + 4 * SourceRect->left); + PIXEL *Target = (PIXEL *) (DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 4 * DestRect->left); + PIXEL *Source = (PIXEL *) (SourceSurf->pvScan0 + (SourceRect->top * SourceSurf->lDelta) + 4 * SourceRect->left); PSPAN ClipSpans; UINT ClipSpansCount; UINT SpanIndex; @@ -532,12 +527,12 @@ BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, PrevSource = Source; } /* if */ - if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta)) { + if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceSurf->lDelta)) { int x; - ScaleLineAvg32(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta), SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); + ScaleLineAvg32(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceSurf->lDelta), SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); for (x = 0; x < DestRect->right - DestRect->left; x++) ScanLine[x] = average32(ScanLine[x], ScanLineAhead[x]); - PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); + PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceSurf->lDelta); } /* if */ if (! FinalCopy32(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) @@ -549,12 +544,12 @@ BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, return TRUE; } DestY++; - Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); + Target = (PIXEL *)((BYTE *)Target + DestSurf->lDelta); Source += IntPart; E += FractPart; if (E >= DestRect->bottom - DestRect->top) { E -= DestRect->bottom - DestRect->top; - Source = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); + Source = (PIXEL *)((BYTE *)Source + SourceSurf->lDelta); } /* if */ } /* while */ @@ -570,7 +565,7 @@ BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, return TRUE; } DestY++; - Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); + Target = (PIXEL *)((BYTE *)Target + DestSurf->lDelta); } /* while */ ExFreePool(ClipSpans); @@ -582,45 +577,33 @@ BOOLEAN ScaleRectAvg32(SURFGDI *DestGDI, SURFGDI *SourceGDI, //NOTE: If you change something here, please do the same in other dibXXbpp.c files! BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { DPRINT("DIB_32BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", - SourceGDI->BitsPerPixel, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: + case BMF_4BPP: + case BMF_8BPP: + case BMF_16BPP: + case BMF_24BPP: + /* Not implemented yet. */ return FALSE; break; - case 4: - return FALSE; - break; - - case 8: - return FALSE; - break; - - case 16: - return FALSE; - break; - - case 24: - return FALSE; - break; - - case 32: - return ScaleRectAvg32(DestGDI, SourceGDI, DestRect, SourceRect, MaskOrigin, BrushOrigin, + case BMF_32BPP: + return ScaleRectAvg32(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin, ClipRegion, ColorTranslation, Mode); break; default: - //DPRINT1("DIB_32BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + //DPRINT1("DIB_32BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -631,7 +614,6 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { @@ -649,7 +631,7 @@ DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, SourceX = SourcePoint->x; for(X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) { - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX, SourceY); if(Source != iTransColor) { *DestBits = XLATEOBJ_iXlate(ColorTranslation, Source); diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 37730023f61..a1cb1e208e8 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib4bpp.c,v 1.35 2004/05/14 22:56:17 gvg Exp $ */ +/* $Id: dib4bpp.c,v 1.36 2004/07/03 13:55:35 navaraf Exp $ */ #include VOID @@ -62,7 +62,6 @@ DIB_4BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) BOOLEAN STATIC DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, XLATEOBJ* ColorTranslation) { @@ -73,9 +72,9 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = DestSurf->pvScan0 + (DestRect->left>>1) + DestRect->top * DestSurf->lDelta; - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: sx = SourcePoint->x; sy = SourcePoint->y; @@ -96,7 +95,7 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 4: + case BMF_4BPP: sy = SourcePoint->y; for (j=DestRect->top; jbottom; j++) @@ -119,7 +118,7 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 8: + case BMF_8BPP: SourceBits_8BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; for (j=DestRect->top; jbottom; j++) @@ -141,7 +140,7 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 16: + case BMF_16BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; DestLine = DestBits; @@ -165,7 +164,7 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 24: + case BMF_24BPP: SourceBits_24BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x * 3; for (j=DestRect->top; jbottom; j++) @@ -190,7 +189,7 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 32: + case BMF_32BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; DestLine = DestBits; @@ -215,7 +214,7 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } return(TRUE); @@ -223,7 +222,6 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) @@ -264,8 +262,6 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return DIB_4BPP_BitBltSrcCopy( DestSurf, SourceSurf, - DestGDI, - SourceGDI, DestRect, SourcePoint, ColorTranslation); @@ -285,11 +281,10 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, NULL); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -320,7 +315,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); + Source = DIB_GetSource(SourceSurf, sx, sy, ColorTranslation); } if (UsesPattern) @@ -341,14 +336,14 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { Source = - (DIB_GetSource(SourceSurf, SourceGDI, sx + 1, sy, ColorTranslation)) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 0, sy, ColorTranslation) << 4) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 3, sy, ColorTranslation) << 8) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 2, sy, ColorTranslation) << 12) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 5, sy, ColorTranslation) << 16) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 4, sy, ColorTranslation) << 20) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 7, sy, ColorTranslation) << 24) | - (DIB_GetSource(SourceSurf, SourceGDI, sx + 6, sy, ColorTranslation) << 28); + (DIB_GetSource(SourceSurf, sx + 1, sy, ColorTranslation)) | + (DIB_GetSource(SourceSurf, sx + 0, sy, ColorTranslation) << 4) | + (DIB_GetSource(SourceSurf, sx + 3, sy, ColorTranslation) << 8) | + (DIB_GetSource(SourceSurf, sx + 2, sy, ColorTranslation) << 12) | + (DIB_GetSource(SourceSurf, sx + 5, sy, ColorTranslation) << 16) | + (DIB_GetSource(SourceSurf, sx + 4, sy, ColorTranslation) << 20) | + (DIB_GetSource(SourceSurf, sx + 7, sy, ColorTranslation) << 24) | + (DIB_GetSource(SourceSurf, sx + 6, sy, ColorTranslation) << 28); } if (UsesPattern) { @@ -370,7 +365,7 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, Dest = DIB_4BPP_GetPixel(DestSurf, i, j); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); + Source = DIB_GetSource(SourceSurf, sx, sy, ColorTranslation); } if (UsesPattern) { @@ -381,25 +376,23 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - DbgPrint("DIB_4BPP_StretchBlt: Source BPP: %u\n", SourceGDI->BitsPerPixel); + DbgPrint("DIB_4BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 6b7a6e5e76b..f565135c168 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib8bpp.c,v 1.26 2004/05/14 22:56:17 gvg Exp $ */ +/* $Id: dib8bpp.c,v 1.27 2004/07/03 13:55:35 navaraf Exp $ */ #include VOID @@ -66,7 +66,6 @@ DIB_8BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) BOOLEAN DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation) { @@ -76,9 +75,9 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + DestRect->left; - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: sx = SourcePoint->x; sy = SourcePoint->y; @@ -99,7 +98,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 4: + case BMF_4BPP: SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); for (j=DestRect->top; jbottom; j++) @@ -121,7 +120,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 8: + case BMF_8BPP: if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) { if (DestRect->top < SourcePoint->y) @@ -183,7 +182,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 16: + case BMF_16BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; DestLine = DestBits; @@ -205,7 +204,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 24: + case BMF_24BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; DestLine = DestBits; @@ -229,7 +228,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } break; - case 32: + case BMF_32BPP: SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; DestLine = DestBits; @@ -252,7 +251,7 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - DPRINT1("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -261,7 +260,6 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, PRECTL DestRect, POINTL *SourcePoint, BRUSHOBJ *Brush, POINTL BrushOrigin, XLATEOBJ *ColorTranslation, ULONG Rop4) @@ -283,8 +281,6 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, return DIB_8BPP_BitBltSrcCopy( DestSurf, SourceSurf, - DestGDI, - SourceGDI, DestRect, SourcePoint, ColorTranslation); @@ -304,11 +300,10 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, NULL); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; @@ -343,7 +338,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { Source = 0; for (k = 0; k < 4; k++) - Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); + Source |= (DIB_GetSource(SourceSurf, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); } if (UsesPattern) @@ -364,7 +359,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left), sy, ColorTranslation); + Source = DIB_GetSource(SourceSurf, sx + (i - DestRect->left), sy, ColorTranslation); } if (UsesPattern) @@ -380,7 +375,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } @@ -470,14 +465,14 @@ FinalCopy8(PIXEL *Target, PIXEL *Source, PSPAN ClipSpans, UINT ClipSpansCount, U } //NOTE: If you change something here, please do the same in other dibXXbpp.c files! -BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, +BOOLEAN ScaleRectAvg8(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { int NumPixels = DestRect->bottom - DestRect->top; - int IntPart = (((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * SourceGDI->SurfObj.lDelta); //((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * (SourceRect->right - SourceRect->left); + int IntPart = (((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * SourceSurf->lDelta); //((SourceRect->bottom - SourceRect->top) / (DestRect->bottom - DestRect->top)) * (SourceRect->right - SourceRect->left); int FractPart = (SourceRect->bottom - SourceRect->top) % (DestRect->bottom - DestRect->top); int Mid = (DestRect->bottom - DestRect->top) >> 1; int E = 0; @@ -485,8 +480,8 @@ BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, PIXEL *ScanLine, *ScanLineAhead; PIXEL *PrevSource = NULL; PIXEL *PrevSourceAhead = NULL; - PIXEL *Target = (PIXEL *) (DestGDI->SurfObj.pvScan0 + (DestRect->top * DestGDI->SurfObj.lDelta) + DestRect->left); - PIXEL *Source = (PIXEL *) (SourceGDI->SurfObj.pvScan0 + (SourceRect->top * SourceGDI->SurfObj.lDelta) + SourceRect->left); + PIXEL *Target = (PIXEL *) (DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + DestRect->left); + PIXEL *Source = (PIXEL *) (SourceSurf->pvScan0 + (SourceRect->top * SourceSurf->lDelta) + SourceRect->left); PSPAN ClipSpans; UINT ClipSpansCount; UINT SpanIndex; @@ -526,12 +521,12 @@ BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, PrevSource = Source; } /* if */ - if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta)) { + if (E >= Mid && PrevSourceAhead != (PIXEL *)((BYTE *)Source + SourceSurf->lDelta)) { int x; - ScaleLineAvg8(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta), SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); + ScaleLineAvg8(ScanLineAhead, (PIXEL *)((BYTE *)Source + SourceSurf->lDelta), SourceRect->right - SourceRect->left, DestRect->right - DestRect->left); for (x = 0; x < DestRect->right - DestRect->left; x++) ScanLine[x] = average8(ScanLine[x], ScanLineAhead[x]); - PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); + PrevSourceAhead = (PIXEL *)((BYTE *)Source + SourceSurf->lDelta); } /* if */ if (! FinalCopy8(Target, ScanLine, ClipSpans, ClipSpansCount, &SpanIndex, DestY, DestRect)) @@ -543,12 +538,12 @@ BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, return TRUE; } DestY++; - Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); + Target = (PIXEL *)((BYTE *)Target + DestSurf->lDelta); Source += IntPart; E += FractPart; if (E >= DestRect->bottom - DestRect->top) { E -= DestRect->bottom - DestRect->top; - Source = (PIXEL *)((BYTE *)Source + SourceGDI->SurfObj.lDelta); + Source = (PIXEL *)((BYTE *)Source + SourceSurf->lDelta); } /* if */ } /* while */ @@ -564,7 +559,7 @@ BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, return TRUE; } DestY++; - Target = (PIXEL *)((BYTE *)Target + DestGDI->SurfObj.lDelta); + Target = (PIXEL *)((BYTE *)Target + DestSurf->lDelta); } /* while */ ExFreePool(ClipSpans); @@ -575,45 +570,33 @@ BOOLEAN ScaleRectAvg8(SURFGDI *DestGDI, SURFGDI *SourceGDI, } BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, RECTL* DestRect, RECTL *SourceRect, POINTL* MaskOrigin, POINTL BrushOrigin, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { DPRINT("DIB_8BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", - SourceGDI->BitsPerPixel, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, + BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); - switch(SourceGDI->BitsPerPixel) + switch(SourceSurf->iBitmapFormat) { - case 1: + case BMF_1BPP: + case BMF_4BPP: + case BMF_16BPP: + case BMF_24BPP: + case BMF_32BPP: + /* Not implemented yet. */ return FALSE; break; - case 4: - return FALSE; - break; - - case 8: - return ScaleRectAvg8(DestGDI, SourceGDI, DestRect, SourceRect, MaskOrigin, BrushOrigin, + case BMF_8BPP: + return ScaleRectAvg8(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin, ClipRegion, ColorTranslation, Mode); break; - - case 16: - return FALSE; - break; - - case 24: - return FALSE; - break; - - case 32: - return FALSE; - break; default: - DPRINT1("DIB_8BPP_StretchBlt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel); + DPRINT1("DIB_8BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } @@ -622,7 +605,6 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, RECTL* DestRect, POINTL *SourcePoint, XLATEOBJ *ColorTranslation, ULONG iTransColor) { @@ -644,28 +626,28 @@ DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { Dest = *DestBits; - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX++, SourceY); if(Source != iTransColor) { Dest &= 0xFFFFFF00; Dest |= (XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFF); } - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX++, SourceY); if(Source != iTransColor) { Dest &= 0xFFFF00FF; Dest |= ((XLATEOBJ_iXlate(ColorTranslation, Source) << 8) & 0xFF00); } - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX++, SourceY); if(Source != iTransColor) { Dest &= 0xFF00FFFF; Dest |= ((XLATEOBJ_iXlate(ColorTranslation, Source) << 16) & 0xFF0000); } - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX++, SourceY); if(Source != iTransColor) { Dest &= 0x00FFFFFF; @@ -679,7 +661,7 @@ DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { for (; X < DestRect->right; X++) { - Source = DIB_GetSourceIndex(SourceSurf, SourceGDI, SourceX++, SourceY); + Source = DIB_GetSourceIndex(SourceSurf, SourceX++, SourceY); if(Source != iTransColor) { *((BYTE*)DestBits) = (BYTE)(XLATEOBJ_iXlate(ColorTranslation, Source) & 0xFF); diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 9bd1592cfb5..64f769cc76a 100644 --- a/reactos/subsys/win32k/eng/bitblt.c +++ b/reactos/subsys/win32k/eng/bitblt.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitblt.c,v 1.55 2004/05/14 22:56:18 gvg Exp $ +/* $Id: bitblt.c,v 1.56 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,9 +29,7 @@ #include typedef BOOLEAN STDCALL (*PBLTRECTFUNC)(SURFOBJ* OutputObj, - SURFGDI* OutputGDI, SURFOBJ* InputObj, - SURFGDI* InputGDI, SURFOBJ* Mask, XLATEOBJ* ColorTranslation, RECTL* OutputRect, @@ -41,9 +39,7 @@ typedef BOOLEAN STDCALL (*PBLTRECTFUNC)(SURFOBJ* OutputObj, POINTL* BrushOrigin, ROP4 Rop4); typedef BOOLEAN STDCALL (*PSTRETCHRECTFUNC)(SURFOBJ* OutputObj, - SURFGDI* OutputGDI, SURFOBJ* InputObj, - SURFGDI* InputGDI, SURFOBJ* Mask, CLIPOBJ* ClipRegion, XLATEOBJ* ColorTranslation, @@ -78,9 +74,7 @@ BOOL STDCALL EngIntersectRect(RECTL* prcDst, RECTL* prcSrc1, RECTL* prcSrc2) static BOOLEAN STDCALL BltMask(SURFOBJ* Dest, - SURFGDI* DestGDI, SURFOBJ* Source, - SURFGDI* SourceGDI, SURFOBJ* Mask, XLATEOBJ* ColorTranslation, RECTL* DestRect, @@ -116,11 +110,10 @@ BltMask(SURFOBJ* Dest, GDIBRUSHOBJ, BrushObject); + PatternSurface = GdiBrush->hbmPattern; PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - PatternSurface = BitmapToSurf(PatternBitmap, Dest->hdev); - BITMAPOBJ_UnlockBitmap(GdiBrush->hbmPattern); - PatternObj = (SURFOBJ*)AccessUserObject((ULONG)PatternSurface); + PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; PatternHeight = PatternObj->sizlBitmap.cy; } @@ -140,11 +133,13 @@ BltMask(SURFOBJ* Dest, { if (PatternSurface == NULL) { - DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, Brush->iSolidColor); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_PutPixel( + Dest, DestRect->left + i, DestRect->top + j, Brush->iSolidColor); } else { - DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_PutPixel( + Dest, DestRect->left + i, DestRect->top + j, DIB_1BPP_GetPixel(PatternObj, (DestRect->left + i) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); } } @@ -159,16 +154,14 @@ BltMask(SURFOBJ* Dest, } if (PatternSurface != NULL) - EngDeleteSurface((HSURF)PatternSurface); + BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } static BOOLEAN STDCALL BltPatCopy(SURFOBJ* Dest, - SURFGDI* DestGDI, SURFOBJ* Source, - SURFGDI* SourceGDI, SURFOBJ* Mask, XLATEOBJ* ColorTranslation, RECTL* DestRect, @@ -186,7 +179,8 @@ BltPatCopy(SURFOBJ* Dest, LineWidth = DestRect->right - DestRect->left; for (y = DestRect->top; y < DestRect->bottom; y++) { - DestGDI->DIB_HLine(Dest, DestRect->left, DestRect->right, y, Brush->iSolidColor); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_HLine( + Dest, DestRect->left, DestRect->right, y, Brush->iSolidColor); } return TRUE; @@ -194,9 +188,7 @@ BltPatCopy(SURFOBJ* Dest, static BOOLEAN STDCALL CallDibBitBlt(SURFOBJ* OutputObj, - SURFGDI* OutputGDI, SURFOBJ* InputObj, - SURFGDI* InputGDI, SURFOBJ* Mask, XLATEOBJ* ColorTranslation, RECTL* OutputRect, @@ -215,7 +207,9 @@ CallDibBitBlt(SURFOBJ* OutputObj, { RealBrushOrigin = *BrushOrigin; } - return OutputGDI->DIB_BitBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputPoint, Brush, RealBrushOrigin, ColorTranslation, Rop4); + + return DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_BitBlt( + OutputObj, InputObj, OutputRect, InputPoint, Brush, RealBrushOrigin, ColorTranslation, Rop4); } INT abs(INT nm); @@ -240,8 +234,6 @@ EngBitBlt(SURFOBJ *DestObj, RECTL CombinedRect; RECT_ENUM RectEnum; BOOL EnumMore; - SURFGDI* OutputGDI; - SURFGDI* InputGDI; POINTL InputPoint; RECTL InputRect; RECTL OutputRect; @@ -299,15 +291,6 @@ EngBitBlt(SURFOBJ *DestObj, InputPoint.y = 0; } - if (NULL != InputObj) - { - InputGDI = (SURFGDI*) AccessInternalObjectFromUserObject(InputObj); - } - else - { - InputGDI = NULL; - } - OutputRect = *DestRect; if (NULL != ClipRegion) { @@ -362,11 +345,6 @@ EngBitBlt(SURFOBJ *DestObj, else AdjustedBrushOrigin = Translate; - if (NULL != OutputObj) - { - OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); - } - // Determine clipping type if (ClipRegion == (CLIPOBJ *) NULL) { @@ -399,7 +377,7 @@ EngBitBlt(SURFOBJ *DestObj, switch(clippingType) { case DC_TRIVIAL: - Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, + Ret = (*BltRectFunc)(OutputObj, InputObj, Mask, ColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4); break; case DC_RECT: @@ -411,7 +389,7 @@ EngBitBlt(SURFOBJ *DestObj, EngIntersectRect(&CombinedRect, &OutputRect, &ClipRect); Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; - Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, + Ret = (*BltRectFunc)(OutputObj, InputObj, Mask, ColorTranslation, &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4); break; case DC_COMPLEX: @@ -445,7 +423,7 @@ EngBitBlt(SURFOBJ *DestObj, EngIntersectRect(&CombinedRect, &OutputRect, &ClipRect); Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; - Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ColorTranslation, + Ret = (*BltRectFunc)(OutputObj, InputObj, Mask, ColorTranslation, &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, Rop4) && Ret; } @@ -462,9 +440,9 @@ EngBitBlt(SURFOBJ *DestObj, } BOOL STDCALL -IntEngBitBlt(SURFOBJ *DestObj, - SURFOBJ *SourceObj, - SURFOBJ *Mask, +IntEngBitBlt(BITMAPOBJ *DestObj, + BITMAPOBJ *SourceObj, + BITMAPOBJ *MaskObj, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, RECTL *DestRect, @@ -475,12 +453,13 @@ IntEngBitBlt(SURFOBJ *DestObj, ROP4 Rop4) { BOOLEAN ret; - SURFGDI *DestGDI; - SURFGDI *SourceGDI; RECTL InputClippedRect; RECTL OutputRect; POINTL InputPoint; BOOLEAN UsesSource; + SURFOBJ *DestSurf = &DestObj->SurfObj; + SURFOBJ *SourceSurf = SourceObj ? &SourceObj->SurfObj : NULL; + SURFOBJ *MaskSurf = MaskObj ? &MaskObj->SurfObj : NULL; InputClippedRect = *DestRect; if (InputClippedRect.right < InputClippedRect.left) @@ -501,7 +480,6 @@ IntEngBitBlt(SURFOBJ *DestObj, return FALSE; } InputPoint = *SourcePoint; - SourceGDI = (SURFGDI*) AccessInternalObjectFromUserObject(SourceObj); /* Make sure we don't try to copy anything outside the valid source region */ if (InputPoint.x < 0) @@ -514,13 +492,13 @@ IntEngBitBlt(SURFOBJ *DestObj, InputClippedRect.top -= InputPoint.y; InputPoint.y = 0; } - if (SourceObj->sizlBitmap.cx < InputPoint.x + InputClippedRect.right - InputClippedRect.left) + if (SourceSurf->sizlBitmap.cx < InputPoint.x + InputClippedRect.right - InputClippedRect.left) { - InputClippedRect.right = InputClippedRect.left + SourceObj->sizlBitmap.cx - InputPoint.x; + InputClippedRect.right = InputClippedRect.left + SourceSurf->sizlBitmap.cx - InputPoint.x; } - if (SourceObj->sizlBitmap.cy < InputPoint.y + InputClippedRect.bottom - InputClippedRect.top) + if (SourceSurf->sizlBitmap.cy < InputPoint.y + InputClippedRect.bottom - InputClippedRect.top) { - InputClippedRect.bottom = InputClippedRect.top + SourceObj->sizlBitmap.cy - InputPoint.y; + InputClippedRect.bottom = InputClippedRect.top + SourceSurf->sizlBitmap.cy - InputPoint.y; } if (InputClippedRect.right < InputClippedRect.left || @@ -549,40 +527,36 @@ IntEngBitBlt(SURFOBJ *DestObj, if (UsesSource) { - MouseSafetyOnDrawStart(SourceObj, SourceGDI, InputPoint.x, InputPoint.y, + MouseSafetyOnDrawStart(SourceSurf, InputPoint.x, InputPoint.y, (InputPoint.x + abs(DestRect->right - DestRect->left)), (InputPoint.y + abs(DestRect->bottom - DestRect->top))); } /* No success yet */ ret = FALSE; - DestGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestObj); - MouseSafetyOnDrawStart(DestObj, DestGDI, OutputRect.left, OutputRect.top, + MouseSafetyOnDrawStart(DestSurf, OutputRect.left, OutputRect.top, OutputRect.right, OutputRect.bottom); /* Call the driver's DrvBitBlt if available */ - if (NULL != DestGDI->BitBlt) + if (DestObj->flHooks & HOOK_BITBLT) { - IntLockGDIDriver(DestGDI); - ret = DestGDI->BitBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, + ret = GDIDEVFUNCS(DestSurf).BitBlt( + DestSurf, SourceSurf, MaskSurf, ClipRegion, ColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin, Rop4); - IntUnLockGDIDriver(DestGDI); } if (! ret) { - IntLockGDIDriver(DestGDI); - ret = EngBitBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, + ret = EngBitBlt(DestSurf, SourceSurf, MaskSurf, ClipRegion, ColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin, Rop4); - IntUnLockGDIDriver(DestGDI); } - MouseSafetyOnDrawEnd(DestObj, DestGDI); + MouseSafetyOnDrawEnd(DestSurf); if (UsesSource) { - MouseSafetyOnDrawEnd(SourceObj, SourceGDI); + MouseSafetyOnDrawEnd(SourceSurf); } return ret; @@ -590,9 +564,7 @@ IntEngBitBlt(SURFOBJ *DestObj, static BOOLEAN STDCALL CallDibStretchBlt(SURFOBJ* OutputObj, - SURFGDI* OutputGDI, SURFOBJ* InputObj, - SURFGDI* InputGDI, SURFOBJ* Mask, CLIPOBJ* ClipRegion, XLATEOBJ* ColorTranslation, @@ -611,7 +583,8 @@ CallDibStretchBlt(SURFOBJ* OutputObj, { RealBrushOrigin = *BrushOrigin; } - return OutputGDI->DIB_StretchBlt(OutputObj, InputObj, OutputGDI, InputGDI, OutputRect, InputRect, MaskOrigin, RealBrushOrigin, ClipRegion, ColorTranslation, Mode); + return DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_StretchBlt( + OutputObj, InputObj, OutputRect, InputRect, MaskOrigin, RealBrushOrigin, ClipRegion, ColorTranslation, Mode); } @@ -633,8 +606,6 @@ EngStretchBlt( { // www.osr.com/ddk/graphics/gdifncs_0bs7.htm - SURFGDI* OutputGDI; - SURFGDI* InputGDI; POINTL InputPoint; RECTL InputRect; RECTL OutputRect; @@ -660,15 +631,6 @@ EngStretchBlt( InputPoint.x = InputRect.left + Translate.x; InputPoint.y = InputRect.top + Translate.y; - if (NULL != InputObj) - { - InputGDI = (SURFGDI*) AccessInternalObjectFromUserObject(InputObj); - } - else - { - InputGDI = NULL; - } - OutputRect = *prclDest; /* Check for degenerate case: if height or width of OutputRect is 0 pixels there's @@ -700,11 +662,6 @@ EngStretchBlt( AdjustedBrushOrigin = Translate; } - if (NULL != OutputObj) - { - OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); - } - if (Mask != NULL) { //BltRectFunc = BltMask; @@ -720,7 +677,7 @@ EngStretchBlt( } - Ret = (*BltRectFunc)(OutputObj, OutputGDI, InputObj, InputGDI, Mask, ClipRegion, + Ret = (*BltRectFunc)(OutputObj, InputObj, Mask, ClipRegion, ColorTranslation, &OutputRect, &InputRect, MaskOrigin, &AdjustedBrushOrigin, Mode); @@ -731,23 +688,24 @@ EngStretchBlt( } BOOL STDCALL -IntEngStretchBlt(SURFOBJ *DestObj, - SURFOBJ *SourceObj, - SURFOBJ *Mask, - CLIPOBJ *ClipRegion, - XLATEOBJ *ColorTranslation, - RECTL *DestRect, - RECTL *SourceRect, - POINTL *pMaskOrigin, - BRUSHOBJ *Brush, - POINTL *BrushOrigin, - ULONG Mode) +IntEngStretchBlt(BITMAPOBJ *DestObj, + BITMAPOBJ *SourceObj, + BITMAPOBJ *MaskObj, + CLIPOBJ *ClipRegion, + XLATEOBJ *ColorTranslation, + RECTL *DestRect, + RECTL *SourceRect, + POINTL *pMaskOrigin, + BRUSHOBJ *Brush, + POINTL *BrushOrigin, + ULONG Mode) { BOOLEAN ret; - SURFGDI *DestGDI; - SURFGDI *SourceGDI; COLORADJUSTMENT ca; POINT MaskOrigin; + SURFOBJ *DestSurf = &DestObj->SurfObj; + SURFOBJ *SourceSurf = SourceObj ? &SourceObj->SurfObj : NULL; + SURFOBJ *MaskSurf = MaskObj ? &MaskObj->SurfObj : NULL; if (pMaskOrigin != NULL) { @@ -756,43 +714,40 @@ IntEngStretchBlt(SURFOBJ *DestObj, if (NULL != SourceObj) { - SourceGDI = (SURFGDI*) AccessInternalObjectFromUserObject(SourceObj); - MouseSafetyOnDrawStart(SourceObj, SourceGDI, SourceRect->left, SourceRect->top, + MouseSafetyOnDrawStart(SourceSurf, SourceRect->left, SourceRect->top, (SourceRect->left + abs(SourceRect->right - SourceRect->left)), (SourceRect->top + abs(SourceRect->bottom - SourceRect->top))); } /* No success yet */ ret = FALSE; - DestGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestObj); - MouseSafetyOnDrawStart(DestObj, DestGDI, DestRect->left, DestRect->top, + MouseSafetyOnDrawStart(DestSurf, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); /* Prepare color adjustment */ /* Call the driver's DrvStretchBlt if available */ - if (NULL != DestGDI->StretchBlt) + if (DestObj->flHooks & HOOK_STRETCHBLT) { /* Drv->StretchBlt (look at http://www.osr.com/ddk/graphics/ddifncs_3ew7.htm ) SURFOBJ *psoMask // optional, if it exists, then rop4=0xCCAA, otherwise rop4=0xCCCC */ // FIXME: MaskOrigin is always NULL ! - IntLockGDIDriver(DestGDI); - ret = DestGDI->StretchBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, + ret = GDIDEVFUNCS(DestSurf).StretchBlt( + DestSurf, SourceSurf, MaskSurf, ClipRegion, ColorTranslation, &ca, BrushOrigin, DestRect, SourceRect, NULL, Mode); - IntUnLockGDIDriver(DestGDI); } if (! ret) { // FIXME: see previous fixme - ret = EngStretchBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, + ret = EngStretchBlt(DestSurf, SourceSurf, MaskSurf, ClipRegion, ColorTranslation, &ca, BrushOrigin, DestRect, SourceRect, NULL, Mode); } - MouseSafetyOnDrawEnd(DestObj, DestGDI); - if (NULL != SourceObj) + MouseSafetyOnDrawEnd(DestSurf); + if (NULL != SourceSurf) { - MouseSafetyOnDrawEnd(SourceObj, SourceGDI); + MouseSafetyOnDrawEnd(SourceSurf); } return ret; @@ -803,9 +758,7 @@ IntEngStretchBlt(SURFOBJ *DestObj, /* renders the alpha mask bitmap */ static BOOLEAN STDCALL AlphaBltMask(SURFOBJ* Dest, - SURFGDI* DestGDI, SURFOBJ* Source, - SURFGDI* SourceGDI, SURFOBJ* Mask, XLATEOBJ* ColorTranslation, XLATEOBJ* SrcColorTranslation, @@ -840,11 +793,12 @@ AlphaBltMask(SURFOBJ* Dest, { if(*lMask == 0xff) { - DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, Brush->iSolidColor); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_PutPixel( + Dest, DestRect->left + i, DestRect->top + j, Brush->iSolidColor); } else { - Background = DIB_GetSource(Dest, DestGDI, DestRect->left + i, DestRect->top + j, SrcColorTranslation); + Background = DIB_GetSource(Dest, DestRect->left + i, DestRect->top + j, SrcColorTranslation); NewColor = RGB((*lMask * (r - GetRValue(Background)) >> 8) + GetRValue(Background), @@ -852,7 +806,8 @@ AlphaBltMask(SURFOBJ* Dest, (*lMask * (b - GetBValue(Background)) >> 8) + GetBValue(Background)); Background = XLATEOBJ_iXlate(ColorTranslation, NewColor); - DestGDI->DIB_PutPixel(Dest, DestRect->left + i, DestRect->top + j, Background); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_PutPixel( + Dest, DestRect->left + i, DestRect->top + j, Background); } } lMask++; @@ -883,8 +838,6 @@ EngMaskBitBlt(SURFOBJ *DestObj, RECTL CombinedRect; RECT_ENUM RectEnum; BOOL EnumMore; - SURFGDI* OutputGDI; - SURFGDI* InputGDI; POINTL InputPoint; RECTL InputRect; RECTL OutputRect; @@ -898,7 +851,6 @@ EngMaskBitBlt(SURFOBJ *DestObj, unsigned i; POINTL Pt; ULONG Direction; - SURFGDI* DestGDI; POINTL AdjustedBrushOrigin; if (NULL != SourcePoint) @@ -916,11 +868,8 @@ EngMaskBitBlt(SURFOBJ *DestObj, InputRect.bottom = DestRect->bottom - DestRect->top; } - DestGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestObj); - IntLockGDIDriver(DestGDI); if (! IntEngEnter(&EnterLeaveSource, NULL, &InputRect, TRUE, &Translate, &InputObj)) { - IntUnLockGDIDriver(DestGDI); return FALSE; } @@ -935,15 +884,6 @@ EngMaskBitBlt(SURFOBJ *DestObj, InputPoint.y = 0; } - if (NULL != InputObj) - { - InputGDI = (SURFGDI*) AccessInternalObjectFromUserObject(InputObj); - } - else - { - InputGDI = NULL; - } - OutputRect = *DestRect; if (NULL != ClipRegion) { @@ -976,14 +916,12 @@ EngMaskBitBlt(SURFOBJ *DestObj, if (OutputRect.right <= OutputRect.left || OutputRect.bottom <= OutputRect.top) { IntEngLeave(&EnterLeaveSource); - IntUnLockGDIDriver(DestGDI); return TRUE; } if (! IntEngEnter(&EnterLeaveDest, DestObj, &OutputRect, FALSE, &Translate, &OutputObj)) { IntEngLeave(&EnterLeaveSource); - IntUnLockGDIDriver(DestGDI); return FALSE; } @@ -1000,11 +938,6 @@ EngMaskBitBlt(SURFOBJ *DestObj, else AdjustedBrushOrigin = Translate; - if (NULL != OutputObj) - { - OutputGDI = (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj); - } - // Determine clipping type if (ClipRegion == (CLIPOBJ *) NULL) { @@ -1017,10 +950,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, { case DC_TRIVIAL: if(Mask->iBitmapFormat == BMF_8BPP) - Ret = AlphaBltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, SourceColorTranslation, + Ret = AlphaBltMask(OutputObj, InputObj, Mask, DestColorTranslation, SourceColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, &AdjustedBrushOrigin); else - Ret = BltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, + Ret = BltMask(OutputObj, InputObj, Mask, DestColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, &AdjustedBrushOrigin, 0xAACC); break; case DC_RECT: @@ -1033,10 +966,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; if(Mask->iBitmapFormat == BMF_8BPP) - Ret = AlphaBltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, SourceColorTranslation, + Ret = AlphaBltMask(OutputObj, InputObj, Mask, DestColorTranslation, SourceColorTranslation, &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin); else - Ret = BltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, + Ret = BltMask(OutputObj, InputObj, Mask, DestColorTranslation, &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, 0xAACC); break; case DC_COMPLEX: @@ -1071,10 +1004,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; if(Mask->iBitmapFormat == BMF_8BPP) - Ret = AlphaBltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, SourceColorTranslation, + Ret = AlphaBltMask(OutputObj, InputObj, Mask, DestColorTranslation, SourceColorTranslation, &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin) && Ret; else - Ret = BltMask(OutputObj, OutputGDI, InputObj, InputGDI, Mask, DestColorTranslation, + Ret = BltMask(OutputObj, InputObj, Mask, DestColorTranslation, &CombinedRect, &Pt, MaskOrigin, Brush, &AdjustedBrushOrigin, 0xAACC) && Ret; } } @@ -1086,11 +1019,10 @@ EngMaskBitBlt(SURFOBJ *DestObj, IntEngLeave(&EnterLeaveDest); IntEngLeave(&EnterLeaveSource); - IntUnLockGDIDriver(DestGDI); - /* Dummy BitBlt to let driver know that something has changed. 0x00AA0029 is the Rop for D (no-op) */ - IntEngBitBlt(DestObj, NULL, Mask, ClipRegion, DestColorTranslation, + /* FIXME: Remove the typecast! */ + IntEngBitBlt((BITMAPOBJ*)DestObj, NULL, (BITMAPOBJ*)Mask, ClipRegion, DestColorTranslation, DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, ROP_NOOP); return Ret; @@ -1109,7 +1041,6 @@ IntEngMaskBlt(SURFOBJ *DestObj, POINTL *BrushOrigin) { BOOLEAN ret; - SURFGDI *DestGDI; RECTL OutputRect; POINTL InputPoint; @@ -1136,14 +1067,13 @@ IntEngMaskBlt(SURFOBJ *DestObj, /* No success yet */ ret = FALSE; - DestGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestObj); - MouseSafetyOnDrawStart(DestObj, DestGDI, OutputRect.left, OutputRect.top, + MouseSafetyOnDrawStart(DestObj, OutputRect.left, OutputRect.top, OutputRect.right, OutputRect.bottom); ret = EngMaskBitBlt(DestObj, Mask, ClipRegion, DestColorTranslation, SourceColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin); - MouseSafetyOnDrawEnd(DestObj, DestGDI); + MouseSafetyOnDrawEnd(DestObj); return ret; } diff --git a/reactos/subsys/win32k/eng/brush.h b/reactos/subsys/win32k/eng/brush.h deleted file mode 100644 index a919275db17..00000000000 --- a/reactos/subsys/win32k/eng/brush.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ReactOS kernel - * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team - * - * 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. - */ -/* $Id: brush.h,v 1.3 2003/05/18 17:16:17 ea Exp $ */ -typedef struct _BRUSHINST -{ - // We need to removed ajC0-3 when color pattern code is complete!!! - // - BYTE ajC0[8]; // Color bits for plane 0 - BYTE ajC1[8]; // Color bits for plane 1 - BYTE ajC2[8]; // Color bits for plane 2 - BYTE ajC3[8]; // Color bits for plane 3 - - BYTE ajPattern[32]; // Color bits for the mask - USHORT usStyle; // Brush style - BYTE fjAccel; // Accelerator flags - BYTE jFgColor; // Current foreground color - BYTE jBkColor; // Current background color - BYTE RealWidth;// - BYTE YShiftValue; // - BYTE jOldBrushRealized; // - DWORD Width; // Width of brush - DWORD Height; - BYTE *pPattern; //Pointer to realized mono pattern -} BRUSHINST; - -#define BRI_SOLID 0 -#define BRI_HOLLOW 1 -#define BRI_HATCHED 2 -#define BRI_PATTERN 3 -#define BRI_MONO_PATTERN 4 -#define BRI_COLOR_PATTERN 5 - -// Definitions for the pcol_C3 byte of the physical color -// -// Some of these definitions have limitations as to when they -// are valid. They are as follows: -// -// C0_BIT color device, phys color, solid brushes if SOLID_COLOR -// C1_BIT color device, phys color, solid brushes if SOLID_COLOR -// C2_BIT color device, phys color, solid brushes if SOLID_COLOR -// C3_BIT color device, phys color, solid brushes if SOLID_COLOR -// MONO_BIT mono device, phys color -// ONES_OR_ZEROS color device, phys color, solid brushes if SOLID_COLOR -// GREY_SCALE color device, dithered solid and hatched brushes -// SOLID_BRUSH color device, solid brush qualifier -// -// There may be brushes where the accelerators could have been set, -// but wasn't. That's life. - -#define C0_BIT 0x01 // C0 color -#define C1_BIT 0x02 // C1 color -#define C2_BIT 0x04 // C2 color -#define C3_BIT 0x08 // C3 color -#define COLOR_BITS 0x0f // All the color bits -#define MONO_BIT 0x10 // Monochrome bit -#define ONES_OR_ZEROS 0x20 // Color is really all 1's or all 0's -#define GREY_SCALE 0x40 // Indicates a real grey scale brush -#define SOLID_BRUSH 0x80 // Indicates a solid color brush - -#define PTRI_INVERT 0x0001 -#define PTRI_ANIMATE 0x0002 diff --git a/reactos/subsys/win32k/eng/copybits.c b/reactos/subsys/win32k/eng/copybits.c index 445ce052dc1..94b45914de0 100644 --- a/reactos/subsys/win32k/eng/copybits.c +++ b/reactos/subsys/win32k/eng/copybits.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: copybits.c,v 1.24 2004/05/10 17:07:17 weiden Exp $ +/* $Id: copybits.c,v 1.25 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -40,8 +40,6 @@ EngCopyBits(SURFOBJ *Dest, POINTL *SourcePoint) { BOOLEAN ret; - PSURFGDI DestGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Dest), - SourceGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Source); BYTE clippingType; RECTL rclTmp; POINTL ptlTmp; @@ -49,10 +47,10 @@ EngCopyBits(SURFOBJ *Dest, BOOL EnumMore; POINTL BrushOrigin; - MouseSafetyOnDrawStart(Source, SourceGDI, SourcePoint->x, SourcePoint->y, + MouseSafetyOnDrawStart(Source, SourcePoint->x, SourcePoint->y, (SourcePoint->x + abs(DestRect->right - DestRect->left)), (SourcePoint->y + abs(DestRect->bottom - DestRect->top))); - MouseSafetyOnDrawStart(Dest, DestGDI, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); + MouseSafetyOnDrawStart(Dest, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); // FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead, // mark the copy block function to be DrvCopyBits instead of the @@ -65,16 +63,15 @@ EngCopyBits(SURFOBJ *Dest, // Destination surface is device managed if(Dest->iType!=STYPE_BITMAP) { - DestGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Dest); - - if (DestGDI->CopyBits!=NULL) + /* FIXME: Eng* functions shouldn't call Drv* functions. ? */ + /* FIXME: Remove typecast. */ + if (((BITMAPOBJ*)Dest)->flHooks & HOOK_COPYBITS) { - IntLockGDIDriver(DestGDI); - ret = DestGDI->CopyBits(Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); - IntUnLockGDIDriver(DestGDI); + ret = GDIDEVFUNCS(Dest).CopyBits( + Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return ret; } @@ -83,28 +80,28 @@ EngCopyBits(SURFOBJ *Dest, // Source surface is device managed if(Source->iType!=STYPE_BITMAP) { - SourceGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Source); - - if (SourceGDI->CopyBits!=NULL) + /* FIXME: Eng* functions shouldn't call Drv* functions. ? */ + /* FIXME: Remove typecast. */ + if (((BITMAPOBJ*)Source)->flHooks & HOOK_COPYBITS) { - IntLockGDIDriver(DestGDI); - ret = SourceGDI->CopyBits(Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); - IntUnLockGDIDriver(DestGDI); + ret = GDIDEVFUNCS(Source).CopyBits( + Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return ret; } } // If CopyBits wasn't hooked, BitBlt must be - ret = EngBitBlt(Dest, Source, - NULL, Clip, ColorTranslation, DestRect, SourcePoint, - NULL, NULL, NULL, 0); + /* FIXME: Remove the typecast! */ + ret = IntEngBitBlt((BITMAPOBJ*)Dest, (BITMAPOBJ*)Source, + NULL, Clip, ColorTranslation, DestRect, SourcePoint, + NULL, NULL, NULL, 0); - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return ret; } @@ -117,18 +114,16 @@ EngCopyBits(SURFOBJ *Dest, clippingType = Clip->iDComplexity; } - SourceGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Source); - DestGDI = (PSURFGDI)AccessInternalObjectFromUserObject(Dest); - BrushOrigin.x = BrushOrigin.y = 0; switch(clippingType) { case DC_TRIVIAL: - DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, DestRect, SourcePoint, NULL, BrushOrigin, ColorTranslation, SRCCOPY); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBlt( + Dest, Source, DestRect, SourcePoint, NULL, BrushOrigin, ColorTranslation, SRCCOPY); - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return(TRUE); @@ -139,10 +134,11 @@ EngCopyBits(SURFOBJ *Dest, ptlTmp.x = SourcePoint->x + rclTmp.left - DestRect->left; ptlTmp.y = SourcePoint->y + rclTmp.top - DestRect->top; - DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, &rclTmp, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBlt( + Dest, Source, &rclTmp, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY); - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return(TRUE); @@ -164,8 +160,8 @@ EngCopyBits(SURFOBJ *Dest, ptlTmp.x = SourcePoint->x + prcl->left - DestRect->left; ptlTmp.y = SourcePoint->y + prcl->top - DestRect->top; - if(!DestGDI->DIB_BitBlt(Dest, Source, DestGDI, SourceGDI, - prcl, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY)) return FALSE; + if(!DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBlt( + Dest, Source, prcl, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY)) return FALSE; prcl++; @@ -174,14 +170,14 @@ EngCopyBits(SURFOBJ *Dest, } while(EnumMore); - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return(TRUE); } - MouseSafetyOnDrawEnd(Dest, DestGDI); - MouseSafetyOnDrawEnd(Source, SourceGDI); + MouseSafetyOnDrawEnd(Dest); + MouseSafetyOnDrawEnd(Source); return FALSE; } diff --git a/reactos/subsys/win32k/eng/gradient.c b/reactos/subsys/win32k/eng/gradient.c index 99f9c150d0f..8a5ab8de25a 100644 --- a/reactos/subsys/win32k/eng/gradient.c +++ b/reactos/subsys/win32k/eng/gradient.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: gradient.c,v 1.9 2004/05/10 17:07:17 weiden Exp $ +/* $Id: gradient.c,v 1.10 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -73,7 +73,6 @@ IntEngGradientFillRect( IN BOOL Horizontal) { SURFOBJ *OutputObj; - SURFGDI *OutputGDI; TRIVERTEX *v1, *v2; RECTL rcGradient, rcSG; RECT_ENUM RectEnum; @@ -106,7 +105,6 @@ IntEngGradientFillRect( { return FALSE; } - OutputGDI = AccessInternalObjectFromUserObject(OutputObj); if((v1->Red != v2->Red || v1->Green != v2->Green || v1->Blue != v2->Blue) && dy > 1) { @@ -132,7 +130,8 @@ IntEngGradientFillRect( if(y >= FillRect.left) { Color = XLATEOBJ_iXlate(pxlo, RGB(c[0], c[1], c[2])); - OutputGDI->DIB_VLine(OutputObj, y, FillRect.top, FillRect.bottom, Color); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_VLine( + OutputObj, y, FillRect.top, FillRect.bottom, Color); } HVSTEPCOL(0); HVSTEPCOL(1); @@ -159,7 +158,8 @@ IntEngGradientFillRect( if(y >= FillRect.top) { Color = XLATEOBJ_iXlate(pxlo, RGB(c[0], c[1], c[2])); - OutputGDI->DIB_HLine(OutputObj, FillRect.left, FillRect.right, y, Color); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_HLine( + OutputObj, FillRect.left, FillRect.right, y, Color); } HVSTEPCOL(0); HVSTEPCOL(1); @@ -187,7 +187,8 @@ IntEngGradientFillRect( { for(; FillRect.top < FillRect.bottom; FillRect.top++) { - OutputGDI->DIB_HLine(OutputObj, FillRect.left, FillRect.right, FillRect.top, Color); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_HLine( + OutputObj, FillRect.left, FillRect.right, FillRect.top, Color); } } } @@ -199,9 +200,9 @@ IntEngGradientFillRect( /* Fill triangle with solid color */ #define S_FILLLINE(linefrom,lineto) \ if(sx[lineto] < sx[linefrom]) \ - OutputGDI->DIB_HLine(OutputObj, max(sx[lineto], FillRect.left), min(sx[linefrom], FillRect.right), sy, Color); \ + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_HLine(OutputObj, max(sx[lineto], FillRect.left), min(sx[linefrom], FillRect.right), sy, Color); \ else \ - OutputGDI->DIB_HLine(OutputObj, max(sx[linefrom], FillRect.left), min(sx[lineto], FillRect.right), sy, Color); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_HLine(OutputObj, max(sx[linefrom], FillRect.left), min(sx[lineto], FillRect.right), sy, Color); #define S_DOLINE(a,b,line) \ ex[line] += dx[line]; \ while(ex[line] > 0 && x[line] != destx[line]) \ @@ -260,7 +261,7 @@ IntEngGradientFillRect( if(InY && g >= FillRect.left && g < FillRect.right) \ { \ Color = XLATEOBJ_iXlate(pxlo, RGB(gc[0], gc[1], gc[2])); \ - OutputGDI->DIB_PutPixel(OutputObj, g, sy, Color); \ + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_PutPixel(OutputObj, g, sy, Color); \ } \ FDOCOL(linefrom, lineto, 0); \ FDOCOL(linefrom, lineto, 1); \ @@ -312,7 +313,6 @@ IntEngGradientFillTriangle( IN POINTL *pptlDitherOrg) { SURFOBJ *OutputObj; - SURFGDI *OutputGDI; PTRIVERTEX v1, v2, v3; RECT_ENUM RectEnum; BOOL EnumMore; @@ -354,7 +354,6 @@ IntEngGradientFillTriangle( { return FALSE; } - OutputGDI = AccessInternalObjectFromUserObject(OutputObj); if(VCMPCLRS(v1, v2, v3)) { @@ -517,7 +516,7 @@ EngGradientFill( BOOL STDCALL IntEngGradientFill( - IN SURFOBJ *psoDest, + IN BITMAPOBJ *pboDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, @@ -529,18 +528,16 @@ IntEngGradientFill( IN ULONG ulMode) { BOOL Ret; - SURFGDI *SurfGDI; + SURFOBJ *psoDest = &pboDest->SurfObj; - SurfGDI = (SURFGDI*)AccessInternalObjectFromUserObject(psoDest); - MouseSafetyOnDrawStart(psoDest, SurfGDI, pco->rclBounds.left, pco->rclBounds.top, + MouseSafetyOnDrawStart(psoDest, pco->rclBounds.left, pco->rclBounds.top, pco->rclBounds.right, pco->rclBounds.bottom); - if((psoDest->iType != STYPE_BITMAP) && SurfGDI->GradientFill) + if((psoDest->iType != STYPE_BITMAP) && (pboDest->flHooks & HOOK_GRADIENTFILL)) { - IntLockGDIDriver(SurfGDI); - Ret = SurfGDI->GradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, - prclExtents, pptlDitherOrg, ulMode); - IntUnLockGDIDriver(SurfGDI); - MouseSafetyOnDrawEnd(psoDest, SurfGDI); + Ret = GDIDEVFUNCS(psoDest).GradientFill( + psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, + prclExtents, pptlDitherOrg, ulMode); + MouseSafetyOnDrawEnd(psoDest); return Ret; } Ret = EngGradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents, @@ -549,18 +546,15 @@ IntEngGradientFill( { /* Dummy BitBlt to let driver know that something has changed. 0x00AA0029 is the Rop for D (no-op) */ - if(SurfGDI->BitBlt) + if(pboDest->flHooks & HOOK_BITBLT) { - IntLockGDIDriver(SurfGDI); - SurfGDI->BitBlt(psoDest, NULL, NULL, pco, pxlo, + GDIDEVFUNCS(psoDest).BitBlt( + psoDest, NULL, NULL, pco, pxlo, prclExtents, pptlDitherOrg, NULL, NULL, NULL, ROP_NOOP); - IntUnLockGDIDriver(SurfGDI); - MouseSafetyOnDrawEnd(psoDest, SurfGDI); + MouseSafetyOnDrawEnd(psoDest); return TRUE; } - EngBitBlt(psoDest, NULL, NULL, pco, pxlo, - prclExtents, pptlDitherOrg, NULL, NULL, NULL, ROP_NOOP); } - MouseSafetyOnDrawEnd(psoDest, SurfGDI); + MouseSafetyOnDrawEnd(psoDest); return Ret; } diff --git a/reactos/subsys/win32k/eng/lineto.c b/reactos/subsys/win32k/eng/lineto.c index 20752865cc1..94bd8fee0dd 100644 --- a/reactos/subsys/win32k/eng/lineto.c +++ b/reactos/subsys/win32k/eng/lineto.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: lineto.c,v 1.33 2004/05/10 17:07:17 weiden Exp $ + * $Id: lineto.c,v 1.34 2004/07/03 13:55:35 navaraf Exp $ */ #include @@ -41,7 +41,7 @@ TranslateRects(RECT_ENUM *RectEnum, POINTL* Translate) * Draw a line from top-left to bottom-right */ static void FASTCALL -NWtoSE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, +NWtoSE(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) { @@ -83,7 +83,8 @@ NWtoSE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, { if (ClipRect->left <= x && ClipRect->top <= y) { - OutputGDI->DIB_PutPixel(OutputObj, x, y, Pixel); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_PutPixel( + OutputObj, x, y, Pixel); } if (deltax < deltay) { @@ -111,7 +112,7 @@ NWtoSE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, } static void FASTCALL -SWtoNE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, +SWtoNE(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) { @@ -152,7 +153,8 @@ SWtoNE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, { if (ClipRect->left <= x && y < ClipRect->bottom) { - OutputGDI->DIB_PutPixel(OutputObj, x, y, Pixel); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_PutPixel( + OutputObj, x, y, Pixel); } if (deltax < deltay) { @@ -180,7 +182,7 @@ SWtoNE(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, } static void FASTCALL -NEtoSW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, +NEtoSW(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) { @@ -221,7 +223,8 @@ NEtoSW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, { if (x < ClipRect->right && ClipRect->top <= y) { - OutputGDI->DIB_PutPixel(OutputObj, x, y, Pixel); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_PutPixel( + OutputObj, x, y, Pixel); } if (deltax < deltay) { @@ -249,7 +252,7 @@ NEtoSW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, } static void FASTCALL -SEtoNW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, +SEtoNW(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) { @@ -290,7 +293,8 @@ SEtoNW(SURFOBJ* OutputObj, SURFGDI* OutputGDI, CLIPOBJ* Clip, { if (x < ClipRect->right && y < ClipRect->bottom) { - OutputGDI->DIB_PutPixel(OutputObj, x, y, Pixel); + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_PutPixel( + OutputObj, x, y, Pixel); } if (deltax < deltay) { @@ -335,7 +339,6 @@ EngLineTo(SURFOBJ *DestObj, ULONG i; ULONG Pixel = Brush->iSolidColor; SURFOBJ *OutputObj; - SURFGDI *OutputGDI; RECTL DestRect; POINTL Translate; INTENG_ENTER_LEAVE EnterLeave; @@ -373,8 +376,6 @@ EngLineTo(SURFOBJ *DestObj, y1 += Translate.y; y2 += Translate.y; - OutputGDI = AccessInternalObjectFromUserObject(OutputObj); - x = x1; y = y1; deltax = x2 - x1; @@ -416,7 +417,8 @@ EngLineTo(SURFOBJ *DestObj, RectEnum.arcl[i].left + Translate.x <= hx + deltax && hx < RectEnum.arcl[i].right + Translate.x) { - OutputGDI->DIB_HLine(OutputObj, + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_HLine( + OutputObj, max(hx, RectEnum.arcl[i].left + Translate.x), min(hx + deltax, RectEnum.arcl[i].right + Translate.x), y1, Pixel); @@ -438,7 +440,8 @@ EngLineTo(SURFOBJ *DestObj, RectEnum.arcl[i].top + Translate.y <= vy + deltay && vy < RectEnum.arcl[i].bottom + Translate.y) { - OutputGDI->DIB_VLine(OutputObj, x1, + DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_VLine( + OutputObj, x1, max(vy, RectEnum.arcl[i].top + Translate.y), min(vy + deltay, RectEnum.arcl[i].bottom + Translate.y), Pixel); @@ -453,22 +456,22 @@ EngLineTo(SURFOBJ *DestObj, { if (0 < ychange) { - NWtoSE(OutputObj, OutputGDI, Clip, Brush, x, y, deltax, deltay, &Translate); + NWtoSE(OutputObj, Clip, Brush, x, y, deltax, deltay, &Translate); } else { - SWtoNE(OutputObj, OutputGDI, Clip, Brush, x, y, deltax, deltay, &Translate); + SWtoNE(OutputObj, Clip, Brush, x, y, deltax, deltay, &Translate); } } else { if (0 < ychange) { - NEtoSW(OutputObj, OutputGDI, Clip, Brush, x, y, deltax, deltay, &Translate); + NEtoSW(OutputObj, Clip, Brush, x, y, deltax, deltay, &Translate); } else { - SEtoNW(OutputObj, OutputGDI, Clip, Brush, x, y, deltax, deltay, &Translate); + SEtoNW(OutputObj, Clip, Brush, x, y, deltax, deltay, &Translate); } } } @@ -477,7 +480,7 @@ EngLineTo(SURFOBJ *DestObj, } BOOL STDCALL -IntEngLineTo(SURFOBJ *DestSurf, +IntEngLineTo(BITMAPOBJ *DestObj, CLIPOBJ *Clip, BRUSHOBJ *Brush, LONG x1, @@ -488,7 +491,7 @@ IntEngLineTo(SURFOBJ *DestSurf, MIX mix) { BOOLEAN ret; - SURFGDI *SurfGDI; + SURFOBJ *DestSurf = &DestObj->SurfObj; PGDIBRUSHOBJ GdiBrush; RECTL b; @@ -502,7 +505,6 @@ IntEngLineTo(SURFOBJ *DestSurf, /* No success yet */ ret = FALSE; - SurfGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestSurf); b.left = min(x1, x2); b.right = max(x1, x2); @@ -510,18 +512,17 @@ IntEngLineTo(SURFOBJ *DestSurf, b.bottom = max(y1, y2); if (b.left == b.right) b.right++; if (b.top == b.bottom) b.bottom++; - MouseSafetyOnDrawStart(DestSurf, SurfGDI, x1, y1, x2, y2); + MouseSafetyOnDrawStart(DestSurf, x1, y1, x2, y2); - if (NULL != SurfGDI->LineTo) + if (DestObj->flHooks & HOOK_LINETO) { /* Call the driver's DrvLineTo */ - IntLockGDIDriver(SurfGDI); - ret = SurfGDI->LineTo(DestSurf, Clip, Brush, x1, y1, x2, y2, /*RectBounds*/&b, mix); - IntUnLockGDIDriver(SurfGDI); + ret = GDIDEVFUNCS(DestSurf).LineTo( + DestSurf, Clip, Brush, x1, y1, x2, y2, /*RectBounds*/&b, mix); } #if 0 - if (! ret && NULL != SurfGDI->StrokePath) + if (! ret && (DestObj->flHooks & HOOK_STROKEPATH)) { /* FIXME: Emulate LineTo using drivers DrvStrokePath and set ret on success */ } @@ -532,13 +533,13 @@ IntEngLineTo(SURFOBJ *DestSurf, ret = EngLineTo(DestSurf, Clip, Brush, x1, y1, x2, y2, RectBounds, mix); } - MouseSafetyOnDrawEnd(DestSurf, SurfGDI); + MouseSafetyOnDrawEnd(DestSurf); return ret; } BOOL STDCALL -IntEngPolyline(SURFOBJ *DestSurf, +IntEngPolyline(BITMAPOBJ *DestObj, CLIPOBJ *Clip, BRUSHOBJ *Brush, CONST LPPOINT pt, @@ -556,7 +557,7 @@ IntEngPolyline(SURFOBJ *DestSurf, rect.top = min(pt[i-1].y, pt[i].y); rect.right = max(pt[i-1].x, pt[i].x); rect.bottom = max(pt[i-1].y, pt[i].y); - ret = IntEngLineTo(DestSurf, + ret = IntEngLineTo(DestObj, Clip, Brush, pt[i-1].x, diff --git a/reactos/subsys/win32k/eng/misc.c b/reactos/subsys/win32k/eng/misc.c index 624d2a3ee69..3288c27bed2 100644 --- a/reactos/subsys/win32k/eng/misc.c +++ b/reactos/subsys/win32k/eng/misc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: misc.c,v 1.7 2004/06/24 19:43:48 gvg Exp $ */ +/* $Id: misc.c,v 1.8 2004/07/03 13:55:35 navaraf Exp $ */ #include BOOL STDCALL @@ -50,9 +50,9 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, if (NULL != DestObj && STYPE_BITMAP != DestObj->iType && (NULL == DestObj->pvScan0 || 0 == DestObj->lDelta)) { - EnterLeave->DestGDI = (SURFGDI*)AccessInternalObjectFromUserObject(DestObj); /* Driver needs to support DrvCopyBits, else we can't do anything */ - if (NULL == EnterLeave->DestGDI->CopyBits) + /* FIXME: Remove typecast! */ + if (!(((BITMAPOBJ*)DestObj)->flHooks & HOOK_COPYBITS)) { return FALSE; } @@ -64,7 +64,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, EnterLeave->OutputBitmap = EngCreateBitmap(BitmapSize, Width, DestObj->iBitmapFormat, BMF_TOPDOWN | BMF_NOZEROINIT, NULL); - *OutputObj = (SURFOBJ *) AccessUserObject((ULONG) EnterLeave->OutputBitmap); + *OutputObj = EngLockSurface((HSURF)EnterLeave->OutputBitmap); EnterLeave->DestRect.left = 0; EnterLeave->DestRect.top = 0; @@ -99,7 +99,8 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, ClippedDestRect.top <= (*OutputObj)->sizlBitmap.cy && 0 <= ClippedDestRect.bottom && SrcPoint.y < DestObj->sizlBitmap.cy && - ! EnterLeave->DestGDI->CopyBits(*OutputObj, DestObj, + ! GDIDEVFUNCS(DestObj).CopyBits( + *OutputObj, DestObj, EnterLeave->TrivialClipObj, NULL, &ClippedDestRect, &SrcPoint)) { @@ -166,7 +167,8 @@ IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave) EnterLeave->DestRect.top <= EnterLeave->DestRect.bottom && EnterLeave->DestRect.top < EnterLeave->DestObj->sizlBitmap.cy) { - Result = EnterLeave->DestGDI->CopyBits(EnterLeave->DestObj, + Result = GDIDEVFUNCS(EnterLeave->DestObj).CopyBits( + EnterLeave->DestObj, EnterLeave->OutputObj, EnterLeave->TrivialClipObj, NULL, &EnterLeave->DestRect, &SrcPoint); @@ -177,6 +179,7 @@ IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave) } } EngFreeMem(EnterLeave->OutputObj->pvBits); + EngUnlockSurface(EnterLeave->OutputObj); EngDeleteSurface((HSURF)EnterLeave->OutputBitmap); EngDeleteClip(EnterLeave->TrivialClipObj); } diff --git a/reactos/subsys/win32k/eng/misc.h b/reactos/subsys/win32k/eng/misc.h index 87230a73edb..6b0aff25aad 100644 --- a/reactos/subsys/win32k/eng/misc.h +++ b/reactos/subsys/win32k/eng/misc.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: misc.h,v 1.2 2003/05/18 17:16:17 ea Exp $ */ +/* $Id: misc.h,v 1.3 2004/07/03 13:55:35 navaraf Exp $ */ #ifndef __ENG_MISC_H #define __ENG_MISC_H @@ -28,7 +28,6 @@ typedef struct INTENG_ENTER_LEAVE_TAG { /* Contents is private to EngEnter/EngLeave */ SURFOBJ *DestObj; - SURFGDI *DestGDI; SURFOBJ *OutputObj; HBITMAP OutputBitmap; CLIPOBJ *TrivialClipObj; diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index f4cb162aa09..3dc43862994 100644 --- a/reactos/subsys/win32k/eng/mouse.c +++ b/reactos/subsys/win32k/eng/mouse.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: mouse.c,v 1.73 2004/06/24 19:43:48 gvg Exp $ +/* $Id: mouse.c,v 1.74 2004/07/03 13:55:35 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -31,14 +31,14 @@ /* FUNCTIONS *****************************************************************/ BOOL FASTCALL -IntIsPrimarySurface(PSURFGDI SurfGDI); +IntIsPrimarySurface(SURFOBJ *SurfObj); VOID FASTCALL EnableMouse(HDC hDisplayDC) { PDC dc; - SURFOBJ *SurfObj; - PSURFGDI SurfGDI; + BITMAPOBJ *BitmapObj; + GDIDEVICE *GdiDev; PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo(InputWindowStation); if( hDisplayDC && InputWindowStation) @@ -50,22 +50,25 @@ EnableMouse(HDC hDisplayDC) } dc = DC_LockDc(hDisplayDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - DC_UnlockDc( hDisplayDC ); - - ASSERT(SurfObj); - SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); + ASSERT(dc); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); /* Move the cursor to the screen center */ DPRINT("Setting Cursor up at 0x%x, 0x%x\n", SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2); ExAcquireFastMutex(&CurInfo->CursorMutex); - CurInfo->x = SurfObj->sizlBitmap.cx / 2; - CurInfo->y = SurfObj->sizlBitmap.cy / 2; + CurInfo->x = BitmapObj->SurfObj.sizlBitmap.cx / 2; + CurInfo->y = BitmapObj->SurfObj.sizlBitmap.cy / 2; ExReleaseFastMutex(&CurInfo->CursorMutex); + + GdiDev = GDIDEV(&BitmapObj->SurfObj); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + DC_UnlockDc( hDisplayDC ); + IntSetCursor(InputWindowStation, NULL, TRUE); - CurInfo->Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus || - SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus); + CurInfo->Enabled = (SPS_ACCEPT_EXCLUDE == GdiDev->PointerStatus || + SPS_ACCEPT_NOEXCLUDE == GdiDev->PointerStatus); IntLoadDefaultCursors(); @@ -85,7 +88,7 @@ EnableMouse(HDC hDisplayDC) } INT FASTCALL -MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, +MouseSafetyOnDrawStart(SURFOBJ *SurfObj, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2) /* * FUNCTION: Notify the mouse driver that drawing is about to begin in @@ -114,13 +117,13 @@ MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, ObDereferenceObject(InputWindowStation); return(FALSE); } - if (!IntIsPrimarySurface(SurfGDI) || MouseEnabled == FALSE) + if (!IntIsPrimarySurface(SurfObj) || MouseEnabled == FALSE) { ObDereferenceObject(InputWindowStation); return(FALSE); } - if (SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus) + if (SPS_ACCEPT_NOEXCLUDE == GDIDEV(SurfObj)->PointerStatus) { /* Hardware cursor, no need to remove it */ ObDereferenceObject(InputWindowStation); @@ -157,9 +160,10 @@ MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1, return FALSE; } CurInfo->SafetySwitch = TRUE; - IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, -1, -1, NULL); - IntUnLockGDIDriver(SurfGDI); + if (GDIDEVFUNCS(SurfObj).MovePointer) + GDIDEVFUNCS(SurfObj).MovePointer(SurfObj, -1, -1, NULL); + else + EngMovePointer(SurfObj, -1, -1, NULL); ExReleaseFastMutex(&CurInfo->CursorMutex); } @@ -177,7 +181,7 @@ SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect) } INT FASTCALL -MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI) +MouseSafetyOnDrawEnd(SURFOBJ *SurfObj) /* * FUNCTION: Notify the mouse driver that drawing has finished on a surface. */ @@ -202,14 +206,14 @@ MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI) } MouseEnabled = CurInfo->Enabled && CurInfo->ShowingCursor; - if (!IntIsPrimarySurface(SurfGDI) || MouseEnabled == FALSE) + if (!IntIsPrimarySurface(SurfObj) || MouseEnabled == FALSE) { ExReleaseFastMutex(&CurInfo->CursorMutex); ObDereferenceObject(InputWindowStation); return(FALSE); } - if (SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus) + if (SPS_ACCEPT_NOEXCLUDE == GDIDEV(SurfObj)->PointerStatus) { /* Hardware cursor, it wasn't removed so need to restore it */ ExReleaseFastMutex(&CurInfo->CursorMutex); @@ -226,9 +230,10 @@ MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI) ObDereferenceObject(InputWindowStation); return FALSE; } - IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - IntUnLockGDIDriver(SurfGDI); + if (GDIDEVFUNCS(SurfObj).MovePointer) + GDIDEVFUNCS(SurfObj).MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); + else + EngMovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); SetPointerRect(CurInfo, &PointerRect); CurInfo->SafetySwitch = FALSE; } @@ -532,8 +537,8 @@ EngSetPointerShape( ppdev->PointerAttributes.Column = x - xHot; ppdev->PointerAttributes.Row = y - yHot; - ppdev->PointerAttributes.Width = psoMask->lDelta << 3; - ppdev->PointerAttributes.Height = (psoMask->cjBits / psoMask->lDelta) >> 1; + ppdev->PointerAttributes.Width = abs(psoMask->lDelta) << 3; + ppdev->PointerAttributes.Height = (psoMask->cjBits / abs(psoMask->lDelta)) >> 1; if (prcl != NULL) { @@ -554,7 +559,8 @@ EngSetPointerShape( memcpy(Bits, psoColor->pvBits, psoColor->cjBits); ppdev->PointerColorSurface = (HSURF)EngCreateBitmap(Size, - psoColor->lDelta, psoColor->iBitmapFormat, BMF_TOPDOWN, Bits); + psoColor->lDelta, psoColor->iBitmapFormat, + psoColor->lDelta < 0 ? 0 : BMF_TOPDOWN, Bits); } else { @@ -571,11 +577,12 @@ EngSetPointerShape( memcpy(Bits, psoMask->pvBits, psoMask->cjBits); ppdev->PointerMaskSurface = (HSURF)EngCreateBitmap(Size, - psoMask->lDelta, psoMask->iBitmapFormat, BMF_TOPDOWN, Bits); + psoMask->lDelta, psoMask->iBitmapFormat, + psoMask->lDelta < 0 ? 0 : BMF_TOPDOWN, Bits); } /* - * Create and XLATEOBJ that will be used for drawing masks. + * Create an XLATEOBJ that will be used for drawing masks. * FIXME: We should get this in pxlo parameter! */ diff --git a/reactos/subsys/win32k/eng/nls.c b/reactos/subsys/win32k/eng/nls.c deleted file mode 100644 index 59b195dce1a..00000000000 --- a/reactos/subsys/win32k/eng/nls.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ReactOS W32 Subsystem - * Copyright (C) 2003 ReactOS Team - * - * 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. - */ -/* $Id: nls.c,v 1.4 2004/05/10 17:07:17 weiden Exp $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: NLS functions - * FILE: subsys/win32k/eng/nls.c - * PROGRAMER: Eric Kohl - * REVISION HISTORY: - * 6/21/2003: Created - */ - -/* INCLUDES *****************************************************************/ -#include - -/* FUNCTIONS ****************************************************************/ - -/* - * @implemented - */ -VOID STDCALL -EngGetCurrentCodePage(OUT PUSHORT OemCodePage, - OUT PUSHORT AnsiCodePage) -{ - RtlGetDefaultCodePage (OemCodePage, - AnsiCodePage); -} - -/* - * @implemented - */ -VOID STDCALL -EngMultiByteToUnicodeN(OUT LPWSTR UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString, - IN PCHAR MultiByteString, - IN ULONG BytesInMultiByteString) -{ - RtlMultiByteToUnicodeN(UnicodeString, - MaxBytesInUnicodeString, - BytesInUnicodeString, - MultiByteString, - BytesInMultiByteString); -} - -/* - * @implemented - */ -VOID STDCALL -EngUnicodeToMultiByteN(OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString, - IN PWSTR UnicodeString, - IN ULONG BytesInUnicodeString) -{ - RtlUnicodeToMultiByteN(MultiByteString, - MaxBytesInMultiByteString, - BytesInMultiByteString, - UnicodeString, - BytesInUnicodeString); -} - -/* EOF */ diff --git a/reactos/subsys/win32k/eng/objects.h b/reactos/subsys/win32k/eng/objects.h index 175d8a4f025..a169f72f8d9 100644 --- a/reactos/subsys/win32k/eng/objects.h +++ b/reactos/subsys/win32k/eng/objects.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: objects.h,v 1.31 2004/05/15 06:54:47 gvg Exp $ +/* $Id: objects.h,v 1.32 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -49,14 +49,7 @@ typedef struct _ENGOBJ { ULONG hObj; ULONG InternalSize; ULONG UserSize; -}ENGOBJ, *PENGOBJ; - - - -typedef struct _BRUSHGDI { - ENGOBJ Header; - BRUSHOBJ BrushObj; -} BRUSHGDI; +} ENGOBJ, *PENGOBJ; typedef struct _CLIPGDI { ENGOBJ Header; @@ -147,67 +140,6 @@ typedef BOOL STDCALL (*PFN_SetPalette)(DHPDEV, PALOBJ*, ULONG, ULONG, ULONG); typedef BOOL STDCALL (*PFN_GradientFill)(SURFOBJ*, CLIPOBJ*, XLATEOBJ*, TRIVERTEX*, ULONG, PVOID, ULONG, RECTL*, POINTL*, ULONG); -/* Forward declare (circular reference) */ -typedef struct _SURFGDI *PSURFGDI; - -typedef VOID (*PFN_DIB_PutPixel) (SURFOBJ *, LONG, LONG, ULONG); -typedef ULONG (*PFN_DIB_GetPixel) (SURFOBJ *, LONG, LONG); -typedef VOID (*PFN_DIB_HLine) (SURFOBJ *, LONG, LONG, LONG, ULONG); -typedef VOID (*PFN_DIB_VLine) (SURFOBJ *, LONG, LONG, LONG, ULONG); -typedef BOOLEAN (*PFN_DIB_BitBlt) (SURFOBJ * DestSurf, SURFOBJ * SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, - RECTL * DestRect, POINTL * SourcePoint, - BRUSHOBJ *BrushObj, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -typedef BOOLEAN (*PFN_DIB_StretchBlt) (SURFOBJ * DestSurf, SURFOBJ * SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, - RECTL * DestRect, RECTL * SourceRect, - POINTL *MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -typedef BOOLEAN (*PFN_DIB_TransparentBlt) (SURFOBJ *, SURFOBJ *, PSURFGDI, PSURFGDI, - RECTL* , POINTL *, XLATEOBJ *,ULONG); - - -typedef struct _SURFGDI { - ENGOBJ Header; - SURFOBJ SurfObj; - - INT BitsPerPixel; - - /* Driver functions */ - PFN_BitBlt BitBlt; - PFN_TransparentBlt TransparentBlt; - PFN_StretchBlt StretchBlt; - PFN_TextOut TextOut; - PFN_Paint Paint; - PFN_StrokePath StrokePath; - PFN_FillPath FillPath; - PFN_StrokeAndFillPath StrokeAndFillPath; - PFN_LineTo LineTo; - PFN_CopyBits CopyBits; - PFN_Synchronize Synchronize; - BOOL SynchronizeAccess; - PFN_CreateDeviceBitmap CreateDeviceBitmap; - PFN_SetPalette SetPalette; - PFN_MovePointer MovePointer; - PFN_SetPointerShape SetPointerShape; - PFN_GradientFill GradientFill; - - /* DIB functions */ - PFN_DIB_PutPixel DIB_PutPixel; - PFN_DIB_GetPixel DIB_GetPixel; - PFN_DIB_HLine DIB_HLine; - PFN_DIB_VLine DIB_VLine; - PFN_DIB_BitBlt DIB_BitBlt; - PFN_DIB_StretchBlt DIB_StretchBlt; - PFN_DIB_TransparentBlt DIB_TransparentBlt; - - /* misc */ - ULONG PointerStatus; - PFAST_MUTEX DriverLock; -} SURFGDI; - typedef struct _XFORMGDI { ENGOBJ Header; /* XFORMOBJ has no public members */ @@ -238,19 +170,4 @@ typedef struct _XLATEGDI { // }; } XLATEGDI; -// List of GDI objects -// FIXME: Make more dynamic - -#define MAX_GDI_BRUSHES 255 -#define MAX_GDI_CLIPS 255 -#define MAX_GDI_DRVFUNCTIONS 16 -#define MAX_GDI_FLOATS 255 -#define MAX_GDI_FONTS 255 -#define MAX_GDI_PALS 255 -#define MAX_GDI_PATHS 255 -#define MAX_GDI_STRS 255 -#define MAX_GDI_SURFS 255 -#define MAX_GDI_XFORMS 255 -#define MAX_GDI_XLATES 255 - #endif //__ENG_OBJECTS_H diff --git a/reactos/subsys/win32k/eng/paint.c b/reactos/subsys/win32k/eng/paint.c index 83bade0c08d..57ee7dd0652 100644 --- a/reactos/subsys/win32k/eng/paint.c +++ b/reactos/subsys/win32k/eng/paint.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: paint.c,v 1.19 2004/05/10 17:07:17 weiden Exp $ +/* $Id: paint.c,v 1.20 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,24 +33,23 @@ BOOL STDCALL FillSolid(SURFOBJ *Surface, PRECTL pRect, ULONG iColor) { LONG y; ULONG LineWidth; - SURFGDI *SurfaceGDI; - SurfaceGDI = (SURFGDI*)AccessInternalObjectFromUserObject(Surface); - MouseSafetyOnDrawStart(Surface, SurfaceGDI, pRect->left, pRect->top, pRect->right, pRect->bottom); + MouseSafetyOnDrawStart(Surface, pRect->left, pRect->top, pRect->right, pRect->bottom); LineWidth = pRect->right - pRect->left; DPRINT(" LineWidth: %d, top: %d, bottom: %d\n", LineWidth, pRect->top, pRect->bottom); for (y = pRect->top; y < pRect->bottom; y++) { - SurfaceGDI->DIB_HLine(Surface, pRect->left, pRect->right, y, iColor); + DibFunctionsForBitmapFormat[Surface->iBitmapFormat].DIB_HLine( + Surface, pRect->left, pRect->right, y, iColor); } - MouseSafetyOnDrawEnd(Surface, SurfaceGDI); + MouseSafetyOnDrawEnd(Surface); return TRUE; } BOOL STDCALL EngPaintRgn(SURFOBJ *Surface, CLIPOBJ *ClipRegion, ULONG iColor, MIX Mix, - BRUSHINST *BrushInst, POINTL *BrushPoint) + BRUSHOBJ *BrushObj, POINTL *BrushPoint) { RECT_ENUM RectEnum; BOOL EnumMore; @@ -101,36 +100,33 @@ EngPaint(IN SURFOBJ *Surface, BOOLEAN ret; // FIXME: We only support a brush's solid color attribute - ret = EngPaintRgn(Surface, ClipRegion, Brush->iSolidColor, Mix, NULL, BrushOrigin); + ret = EngPaintRgn(Surface, ClipRegion, Brush->iSolidColor, Mix, Brush, BrushOrigin); return ret; } BOOL STDCALL -IntEngPaint(IN SURFOBJ *Surface, - IN CLIPOBJ *ClipRegion, - IN BRUSHOBJ *Brush, - IN POINTL *BrushOrigin, - IN MIX Mix) +IntEngPaint(IN BITMAPOBJ *BitmapObj, + IN CLIPOBJ *ClipRegion, + IN BRUSHOBJ *Brush, + IN POINTL *BrushOrigin, + IN MIX Mix) { - SURFGDI *SurfGDI; + SURFOBJ *Surface = &BitmapObj->SurfObj; BOOL ret; - // Is the surface's Paint function hooked? - SurfGDI = (SURFGDI*)AccessInternalObjectFromUserObject(Surface); - - DPRINT("SurfGDI type: %d, sgdi paint: %x\n", Surface->iType, SurfGDI->Paint); - if((Surface->iType!=STYPE_BITMAP) && (SurfGDI->Paint!=NULL)) + DPRINT("SurfGDI type: %d\n", Surface->iType); + /* Is the surface's Paint function hooked? */ + if((Surface->iType!=STYPE_BITMAP) && (BitmapObj->flHooks & HOOK_PAINT)) { // Call the driver's DrvPaint - MouseSafetyOnDrawStart(Surface, SurfGDI, ClipRegion->rclBounds.left, + MouseSafetyOnDrawStart(Surface, ClipRegion->rclBounds.left, ClipRegion->rclBounds.top, ClipRegion->rclBounds.right, ClipRegion->rclBounds.bottom); - IntLockGDIDriver(SurfGDI); - ret = SurfGDI->Paint(Surface, ClipRegion, Brush, BrushOrigin, Mix); - IntUnLockGDIDriver(SurfGDI); - MouseSafetyOnDrawEnd(Surface, SurfGDI); + ret = GDIDEVFUNCS(Surface).Paint( + Surface, ClipRegion, Brush, BrushOrigin, Mix); + MouseSafetyOnDrawEnd(Surface); return ret; } return EngPaint( Surface, ClipRegion, Brush, BrushOrigin, Mix ); diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 658fcc0869d..1f5ce7b4045 100644 --- a/reactos/subsys/win32k/eng/surface.c +++ b/reactos/subsys/win32k/eng/surface.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: surface.c,v 1.42 2004/06/23 07:40:45 gvg Exp $ +/* $Id: surface.c,v 1.43 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -69,6 +69,7 @@ ULONG FASTCALL BitmapFormat(WORD Bits, DWORD Compression) case 24: return BMF_24BPP; case 32: return BMF_32BPP; } + return 0; case BI_RLE4: return BMF_4RLE; case BI_RLE8: return BMF_8RLE; @@ -77,99 +78,6 @@ ULONG FASTCALL BitmapFormat(WORD Bits, DWORD Compression) } } -static VOID Dummy_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c) -{ - return; -} - -static ULONG Dummy_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y) -{ - return 0; -} - -static VOID Dummy_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c) -{ - return; -} - -static VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c) -{ - return; -} - -static BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* BrushObj, POINTL BrushOrign, - XLATEOBJ *ColorTranslation, ULONG Rop4) -{ - return FALSE; -} - -static BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrign, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode) -{ - return FALSE; -} - -static BOOLEAN Dummy_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PSURFGDI DestGDI, PSURFGDI SourceGDI, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor) -{ - return FALSE; -} - - -#define SURF_METHOD(c,n) DIB_##c##_##n -#define SET_SURFGDI(c)\ - SurfGDI->DIB_PutPixel=SURF_METHOD(c,PutPixel);\ - SurfGDI->DIB_GetPixel=SURF_METHOD(c,GetPixel);\ - SurfGDI->DIB_HLine=SURF_METHOD(c,HLine);\ - SurfGDI->DIB_VLine=SURF_METHOD(c,VLine);\ - SurfGDI->DIB_BitBlt=SURF_METHOD(c,BitBlt);\ - SurfGDI->DIB_StretchBlt=SURF_METHOD(c,StretchBlt);\ - SurfGDI->DIB_TransparentBlt=SURF_METHOD(c,TransparentBlt); - -VOID FASTCALL InitializeFuncs(SURFGDI *SurfGDI, ULONG BitmapFormat) -{ - SurfGDI->BitBlt = NULL; - SurfGDI->StretchBlt = NULL; - SurfGDI->CopyBits = NULL; - SurfGDI->CreateDeviceBitmap = NULL; - SurfGDI->SetPalette = NULL; - SurfGDI->TransparentBlt = NULL; - - switch(BitmapFormat) - { - case BMF_1BPP: SET_SURFGDI(1BPP) break; - case BMF_4BPP: SET_SURFGDI(4BPP) break; - case BMF_8BPP: SET_SURFGDI(8BPP) break; - case BMF_16BPP: SET_SURFGDI(16BPP) break; - case BMF_24BPP: SET_SURFGDI(24BPP) break; - case BMF_32BPP: SET_SURFGDI(32BPP) break; - case BMF_4RLE: - case BMF_8RLE: - /* Not supported yet, fall through to unrecognized case */ - default: - DPRINT1("InitializeFuncs: unsupported DIB format %d\n", - BitmapFormat); - - SurfGDI->DIB_PutPixel = Dummy_PutPixel; - SurfGDI->DIB_GetPixel = Dummy_GetPixel; - SurfGDI->DIB_HLine = Dummy_HLine; - SurfGDI->DIB_VLine = Dummy_VLine; - SurfGDI->DIB_BitBlt = Dummy_BitBlt; - SurfGDI->DIB_StretchBlt = Dummy_StretchBlt; - SurfGDI->DIB_TransparentBlt = Dummy_TransparentBlt; - break; - } -} - /* * @implemented */ @@ -182,8 +90,9 @@ EngCreateDeviceBitmap(IN DHSURF dhsurf, SURFOBJ *SurfObj; NewBitmap = EngCreateBitmap(Size, DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(Format)), Format, 0, NULL); - SurfObj = (PVOID)AccessUserObject((ULONG)NewBitmap); + SurfObj = EngLockSurface((HSURF)NewBitmap); SurfObj->dhsurf = dhsurf; + EngUnlockSurface(SurfObj); return NewBitmap; } @@ -301,11 +210,8 @@ VOID Decompress8bpp(SIZEL Size, BYTE *CompressedBits, BYTE *UncompressedBits, LO } } -/* - * @implemented - */ -HBITMAP STDCALL -EngCreateBitmap(IN SIZEL Size, +HBITMAP FASTCALL +IntCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format, IN ULONG Flags, @@ -313,15 +219,17 @@ EngCreateBitmap(IN SIZEL Size, { HBITMAP NewBitmap; SURFOBJ *SurfObj; - SURFGDI *SurfGDI; + BITMAPOBJ *BitmapObj; PVOID UncompressedBits; ULONG UncompressedFormat; - NewBitmap = (HBITMAP) CreateGDIHandle(sizeof(SURFGDI), sizeof(SURFOBJ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); - if (! ValidEngHandle(NewBitmap)) + NewBitmap = BITMAPOBJ_AllocBitmap(); + if (NewBitmap == NULL) return 0; - SurfGDI->BitsPerPixel = BitsPerFormat(Format); + BitmapObj = BITMAPOBJ_LockBitmap(NewBitmap); + SurfObj = &BitmapObj->SurfObj; + if (Format == BMF_4RLE) { SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(BMF_4BPP)); @@ -340,8 +248,8 @@ EngCreateBitmap(IN SIZEL Size, } else { - SurfObj->lDelta = Width; - SurfObj->cjBits = Width * Size.cy; + SurfObj->lDelta = abs(Width); + SurfObj->cjBits = SurfObj->lDelta * Size.cy; UncompressedBits = Bits; UncompressedFormat = Format; } @@ -373,24 +281,49 @@ EngCreateBitmap(IN SIZEL Size, if (0 == (Flags & BMF_TOPDOWN)) { - SurfObj->pvBits = (PVOID) ((PCHAR) UncompressedBits + SurfObj->cjBits - SurfObj->lDelta); + SurfObj->pvScan0 = (PVOID) ((ULONG_PTR) SurfObj->pvBits + SurfObj->cjBits - SurfObj->lDelta); SurfObj->lDelta = - SurfObj->lDelta; } + else + { + SurfObj->pvScan0 = SurfObj->pvBits; + } SurfObj->dhsurf = 0; /* device managed surface */ - SurfObj->hsurf = 0; + SurfObj->hsurf = (HSURF)NewBitmap; SurfObj->dhpdev = NULL; SurfObj->hdev = NULL; SurfObj->sizlBitmap = Size; SurfObj->iBitmapFormat = UncompressedFormat; SurfObj->iType = STYPE_BITMAP; SurfObj->fjBitmap = Flags & (BMF_TOPDOWN | BMF_NOZEROINIT); - SurfObj->pvScan0 = SurfObj->pvBits; SurfObj->iUniq = 0; - InitializeFuncs(SurfGDI, UncompressedFormat); + BitmapObj->flHooks = 0; + BitmapObj->flFlags = 0; + BitmapObj->dimension.cx = 0; + BitmapObj->dimension.cy = 0; + BitmapObj->dib = NULL; - /* Use flags to determine bitmap type -- TOP_DOWN or whatever */ + BITMAPOBJ_UnlockBitmap(NewBitmap); + + return NewBitmap; +} + +/* + * @implemented + */ +HBITMAP STDCALL +EngCreateBitmap(IN SIZEL Size, + IN LONG Width, + IN ULONG Format, + IN ULONG Flags, + IN PVOID Bits) +{ + HBITMAP NewBitmap; + + NewBitmap = IntCreateBitmap(Size, Width, Format, Flags, Bits); + GDIOBJ_SetOwnership(NewBitmap, NULL); return NewBitmap; } @@ -403,24 +336,30 @@ EngCreateDeviceSurface(IN DHSURF dhsurf, IN SIZEL Size, IN ULONG Format) { - HSURF NewSurface; + HSURF NewSurface; SURFOBJ *SurfObj; - SURFGDI *SurfGDI; + BITMAPOBJ *BitmapObj; - NewSurface = (HSURF)CreateGDIHandle(sizeof( SURFGDI ), sizeof( SURFOBJ ), (PVOID*)&SurfGDI, (PVOID*)&SurfObj); - if( !ValidEngHandle( NewSurface ) ) + NewSurface = (HSURF)BITMAPOBJ_AllocBitmap(); + if (NewSurface == NULL) return 0; - SurfGDI->BitsPerPixel = BitsPerFormat(Format); + GDIOBJ_SetOwnership(NewSurface, NULL); + + BitmapObj = BITMAPOBJ_LockBitmap(NewSurface); + SurfObj = &BitmapObj->SurfObj; + SurfObj->dhsurf = dhsurf; - SurfObj->hsurf = (HSURF) dhsurf; // FIXME: Is this correct?? + SurfObj->hsurf = NewSurface; SurfObj->sizlBitmap = Size; SurfObj->iBitmapFormat = Format; SurfObj->lDelta = DIB_GetDIBWidthBytes(Size.cx, BitsPerFormat(Format)); SurfObj->iType = STYPE_DEVICE; SurfObj->iUniq = 0; - InitializeFuncs(SurfGDI, Format); + BitmapObj->flHooks = 0; + + BITMAPOBJ_UnlockBitmap(NewSurface); return NewSurface; } @@ -446,40 +385,23 @@ EngAssociateSurface(IN HSURF Surface, IN ULONG Hooks) { SURFOBJ *SurfObj; - SURFGDI *SurfGDI; + BITMAPOBJ *BitmapObj; GDIDEVICE* Device; Device = (GDIDEVICE*)Dev; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)Surface); - ASSERT(SurfObj); - SurfGDI = (SURFGDI*)AccessInternalObjectFromUserObject(SurfObj); + BitmapObj = BITMAPOBJ_LockBitmap(Surface); + ASSERT(BitmapObj); + SurfObj = &BitmapObj->SurfObj; - // Associate the hdev + /* Associate the hdev */ SurfObj->hdev = Dev; SurfObj->dhpdev = Device->PDev; - // Hook up specified functions - if(Hooks & HOOK_BITBLT) SurfGDI->BitBlt = Device->DriverFunctions.BitBlt; - if(Hooks & HOOK_TRANSPARENTBLT) SurfGDI->TransparentBlt = Device->DriverFunctions.TransparentBlt; - if(Hooks & HOOK_STRETCHBLT) SurfGDI->StretchBlt = (PFN_StretchBlt)Device->DriverFunctions.StretchBlt; - if(Hooks & HOOK_TEXTOUT) SurfGDI->TextOut = Device->DriverFunctions.TextOut; - if(Hooks & HOOK_PAINT) SurfGDI->Paint = Device->DriverFunctions.Paint; - if(Hooks & HOOK_STROKEPATH) SurfGDI->StrokePath = Device->DriverFunctions.StrokePath; - if(Hooks & HOOK_FILLPATH) SurfGDI->FillPath = Device->DriverFunctions.FillPath; - if(Hooks & HOOK_STROKEANDFILLPATH) SurfGDI->StrokeAndFillPath = Device->DriverFunctions.StrokeAndFillPath; - if(Hooks & HOOK_LINETO) SurfGDI->LineTo = Device->DriverFunctions.LineTo; - if(Hooks & HOOK_COPYBITS) SurfGDI->CopyBits = Device->DriverFunctions.CopyBits; - if(Hooks & HOOK_SYNCHRONIZE) SurfGDI->Synchronize = Device->DriverFunctions.Synchronize; - if(Hooks & HOOK_SYNCHRONIZEACCESS) SurfGDI->SynchronizeAccess = TRUE; - if(Hooks & HOOK_GRADIENTFILL) SurfGDI->GradientFill = Device->DriverFunctions.GradientFill; + /* Hook up specified functions */ + BitmapObj->flHooks = Hooks; - SurfGDI->CreateDeviceBitmap = Device->DriverFunctions.CreateDeviceBitmap; - SurfGDI->SetPalette = Device->DriverFunctions.SetPalette; - SurfGDI->MovePointer = Device->DriverFunctions.MovePointer; - SurfGDI->SetPointerShape = (PFN_SetPointerShape)Device->DriverFunctions.SetPointerShape; - - SurfGDI->DriverLock = &Device->DriverLock; + BITMAPOBJ_UnlockBitmap(Surface); return TRUE; } @@ -528,8 +450,9 @@ EngModifySurface( BOOL STDCALL EngDeleteSurface(IN HSURF Surface) { - FreeGDIHandle((ULONG)Surface); - return TRUE; + GDIOBJ_SetOwnership(Surface, PsGetCurrentProcess()); + BITMAPOBJ_FreeBitmap(Surface); + return TRUE; } /* @@ -544,32 +467,20 @@ EngEraseSurface(SURFOBJ *Surface, } /* - * @unimplemented + * @implemented */ SURFOBJ * STDCALL EngLockSurface(IN HSURF Surface) { - /* - * FIXME - don't know if GDIOBJ_LockObj's return value is a SURFOBJ or not... - * also, what is HSURF's correct magic #? - */ -#ifdef TODO - GDIOBJ_LockObj ( Surface, GDI_OBJECT_TYPE_DONTCARE ); -#endif - return (SURFOBJ*)AccessUserObject((ULONG)Surface); + return &((BITMAPOBJ*)BITMAPOBJ_LockBitmap(Surface))->SurfObj; } /* - * @unimplemented + * @implemented */ VOID STDCALL EngUnlockSurface(IN SURFOBJ *Surface) { - /* - * FIXME what is HSURF's correct magic #? - */ -#ifdef TODO - GDIOBJ_UnlockObj ( Surface->hsurf, GDI_OBJECT_TYPE_DONTCARE ); -#endif + BITMAPOBJ_UnlockBitmap ( Surface->hsurf ); } /* EOF */ diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 8135a0c5834..0fdb080359b 100644 --- a/reactos/subsys/win32k/eng/transblt.c +++ b/reactos/subsys/win32k/eng/transblt.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: transblt.c,v 1.19 2004/05/16 09:51:26 weiden Exp $ +/* $Id: transblt.c,v 1.20 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,7 +43,6 @@ EngTransparentBlt(SURFOBJ *Dest, BYTE ClippingType; INTENG_ENTER_LEAVE EnterLeaveSource, EnterLeaveDest; SURFOBJ *InputObj, *OutputObj; - SURFGDI *InputGDI, *OutputGDI; RECTL OutputRect, InputRect; POINTL Translate, InputPoint; @@ -60,9 +59,6 @@ EngTransparentBlt(SURFOBJ *Dest, InputPoint.x = SourceRect->left + Translate.x; InputPoint.y = SourceRect->top + Translate.y; - InputGDI = (InputObj ? (SURFGDI*)AccessInternalObjectFromUserObject(InputObj) : NULL); - ASSERT(InputGDI); - OutputRect = *DestRect; if(Clip) { @@ -109,17 +105,14 @@ EngTransparentBlt(SURFOBJ *Dest, OutputRect.top = DestRect->top + Translate.y; OutputRect.bottom = DestRect->bottom + Translate.y; - OutputGDI = (OutputObj ? (SURFGDI*)AccessInternalObjectFromUserObject(OutputObj) : NULL); - ASSERT(OutputGDI); - ClippingType = (Clip ? Clip->iDComplexity : DC_TRIVIAL); switch(ClippingType) { case DC_TRIVIAL: { - Ret = OutputGDI->DIB_TransparentBlt(OutputObj, InputObj, OutputGDI, InputGDI, &OutputRect, - &InputPoint, ColorTranslation, iTransColor); + Ret = DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_TransparentBlt( + OutputObj, InputObj, &OutputRect, &InputPoint, ColorTranslation, iTransColor); break; } case DC_RECT: @@ -134,8 +127,8 @@ EngTransparentBlt(SURFOBJ *Dest, EngIntersectRect(&CombinedRect, &OutputRect, &ClipRect); Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; - Ret = OutputGDI->DIB_TransparentBlt(OutputObj, InputObj, OutputGDI, InputGDI, &CombinedRect, - &Pt, ColorTranslation, iTransColor); + Ret = DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_TransparentBlt( + OutputObj, InputObj, &CombinedRect, &Pt, ColorTranslation, iTransColor); break; } case DC_COMPLEX: @@ -176,8 +169,8 @@ EngTransparentBlt(SURFOBJ *Dest, EngIntersectRect(&CombinedRect, &OutputRect, &ClipRect); Pt.x = InputPoint.x + CombinedRect.left - OutputRect.left; Pt.y = InputPoint.y + CombinedRect.top - OutputRect.top; - Ret = OutputGDI->DIB_TransparentBlt(OutputObj, InputObj, OutputGDI, InputGDI, &CombinedRect, - &Pt, ColorTranslation, iTransColor); + Ret = DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_TransparentBlt( + OutputObj, InputObj, &CombinedRect, &Pt, ColorTranslation, iTransColor); if(!Ret) { break; @@ -200,8 +193,8 @@ EngTransparentBlt(SURFOBJ *Dest, } BOOL FASTCALL -IntEngTransparentBlt(SURFOBJ *Dest, - SURFOBJ *Source, +IntEngTransparentBlt(BITMAPOBJ *DestObj, + BITMAPOBJ *SourceObj, CLIPOBJ *Clip, XLATEOBJ *ColorTranslation, PRECTL DestRect, @@ -211,7 +204,8 @@ IntEngTransparentBlt(SURFOBJ *Dest, { BOOL Ret; RECTL OutputRect, InputClippedRect; - PSURFGDI SurfGDIDest, SurfGDISrc; + SURFOBJ *DestSurf = &DestObj->SurfObj; + SURFOBJ *SourceSurf = &SourceObj->SurfObj; InputClippedRect = *DestRect; if(InputClippedRect.right < InputClippedRect.left) @@ -243,57 +237,46 @@ IntEngTransparentBlt(SURFOBJ *Dest, OutputRect = *DestRect; } - if(Source != Dest) + if(SourceSurf != DestSurf) { - SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(Source); - ASSERT(SurfGDISrc); - MouseSafetyOnDrawStart(Source, SurfGDISrc, SourceRect->left, SourceRect->top, + MouseSafetyOnDrawStart(SourceSurf, SourceRect->left, SourceRect->top, (SourceRect->left + abs(SourceRect->right - SourceRect->left)), (SourceRect->top + abs(SourceRect->bottom - SourceRect->top))); } - SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(Dest); - ASSERT(SurfGDIDest); - MouseSafetyOnDrawStart(Dest, SurfGDIDest, OutputRect.left, OutputRect.top, + MouseSafetyOnDrawStart(DestSurf, OutputRect.left, OutputRect.top, OutputRect.right, OutputRect.bottom); - if(SurfGDIDest->TransparentBlt) + if(DestObj->flHooks & HOOK_TRANSPARENTBLT) { - IntLockGDIDriver(SurfGDIDest); - Ret = SurfGDIDest->TransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, - SourceRect, iTransColor, Reserved); - IntUnLockGDIDriver(SurfGDIDest); + Ret = GDIDEVFUNCS(DestSurf).TransparentBlt( + DestSurf, SourceSurf, Clip, ColorTranslation, &OutputRect, + SourceRect, iTransColor, Reserved); } else Ret = FALSE; if(!Ret) { - IntLockGDIDriver(SurfGDIDest); - Ret = EngTransparentBlt(Dest, Source, Clip, ColorTranslation, &OutputRect, - SourceRect, iTransColor, Reserved); - IntUnLockGDIDriver(SurfGDIDest); + Ret = EngTransparentBlt(DestSurf, SourceSurf, Clip, ColorTranslation, + &OutputRect, SourceRect, iTransColor, Reserved); } if(Ret) { /* Dummy BitBlt to let driver know that something has changed. 0x00AA0029 is the Rop for D (no-op) */ - if(SurfGDIDest->BitBlt) + if (DestObj->flHooks & HOOK_BITBLT) { - IntLockGDIDriver(SurfGDIDest); - SurfGDIDest->BitBlt(Dest, NULL, NULL, Clip, ColorTranslation, + GDIDEVFUNCS(DestSurf).BitBlt( + DestSurf, NULL, NULL, Clip, ColorTranslation, &OutputRect, NULL, NULL, NULL, NULL, ROP_NOOP); - IntUnLockGDIDriver(SurfGDIDest); } - else - EngBitBlt(Dest, NULL, NULL, Clip, ColorTranslation, - &OutputRect, NULL, NULL, NULL, NULL, ROP_NOOP); } - MouseSafetyOnDrawEnd(Dest, SurfGDIDest); - if(Source != Dest) + MouseSafetyOnDrawEnd(DestSurf); + if(SourceSurf != DestSurf) { - MouseSafetyOnDrawEnd(Source, SurfGDISrc); + MouseSafetyOnDrawEnd(SourceSurf); } return Ret; diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index bcb8d019572..43d4eff8408 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.38 2004/06/29 20:08:07 navaraf Exp $ +/* $Id: xlate.c,v 1.39 2004/07/03 13:55:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -26,123 +26,98 @@ * REVISION HISTORY: * 8/20/1999: Created */ -#include -// TODO: Cache XLATEOBJs that are created by EngCreateXlate by checking if the given palettes match a cached list +#include static ULONG FASTCALL ShiftAndMask(XLATEGDI *XlateGDI, ULONG Color) { - ULONG TranslatedColor; + ULONG TranslatedColor; - TranslatedColor = 0; - if (XlateGDI->RedShift < 0) - { - TranslatedColor = (Color >> -(XlateGDI->RedShift)) & XlateGDI->RedMask; - } else - TranslatedColor = (Color << XlateGDI->RedShift) & XlateGDI->RedMask; - if (XlateGDI->GreenShift < 0) - { - TranslatedColor |= (Color >> -(XlateGDI->GreenShift)) & XlateGDI->GreenMask; - } else - TranslatedColor |= (Color << XlateGDI->GreenShift) & XlateGDI->GreenMask; - if (XlateGDI->BlueShift < 0) - { - TranslatedColor |= (Color >> -(XlateGDI->BlueShift)) & XlateGDI->BlueMask; - } else - TranslatedColor |= (Color << XlateGDI->BlueShift) & XlateGDI->BlueMask; + if (XlateGDI->RedShift < 0) + TranslatedColor = (Color >> -(XlateGDI->RedShift)) & XlateGDI->RedMask; + else + TranslatedColor = (Color << XlateGDI->RedShift) & XlateGDI->RedMask; + if (XlateGDI->GreenShift < 0) + TranslatedColor |= (Color >> -(XlateGDI->GreenShift)) & XlateGDI->GreenMask; + else + TranslatedColor |= (Color << XlateGDI->GreenShift) & XlateGDI->GreenMask; + if (XlateGDI->BlueShift < 0) + TranslatedColor |= (Color >> -(XlateGDI->BlueShift)) & XlateGDI->BlueMask; + else + TranslatedColor |= (Color << XlateGDI->BlueShift) & XlateGDI->BlueMask; - return TranslatedColor; + return TranslatedColor; } -// FIXME: If the caller knows that the destinations are indexed and not RGB -// then we should cache more than one value. Same with the source. - -// Takes indexed palette and a ULONG STDCALL ClosestColorMatch(XLATEGDI *XlateGDI, LPPALETTEENTRY SourceColor, - PALETTEENTRY *DestColors, ULONG NumColors) + PALETTEENTRY *DestColors, ULONG NumColors) { - LONG idx = 0; - ULONG i; - ULONG SourceRed, SourceGreen, SourceBlue; - ULONG cxRed, cxGreen, cxBlue, rt, BestMatch = 16777215; + ULONG SourceRed, SourceGreen, SourceBlue; + ULONG cxRed, cxGreen, cxBlue, Rating, BestMatch = 16777215; + ULONG CurrentIndex, BestIndex = 0; - SourceRed = SourceColor->peRed; - SourceGreen = SourceColor->peGreen; - SourceBlue = SourceColor->peBlue; + SourceRed = SourceColor->peRed; + SourceGreen = SourceColor->peGreen; + SourceBlue = SourceColor->peBlue; - for (i=0; iNumColors; i++) - { - TranslationTable[i] = ClosestColorMatch(XlateGDI, PalSource->IndexedColors + i, PalDest->IndexedColors, PalDest->NumColors); - Trivial = Trivial && (TranslationTable[i] == i); - } - if (Trivial) - { - XlateGDI->XlateObj.flXlate |= XO_TRIVIAL; - } + return BestIndex; } static VOID STDCALL BitMasksFromPal(USHORT PalType, PPALGDI Palette, - PULONG RedMask, PULONG BlueMask, PULONG GreenMask) + PULONG RedMask, PULONG BlueMask, PULONG GreenMask) { - static const union { PALETTEENTRY Color; ULONG Mask; } Red = {{255, 0, 0}}; - static const union { PALETTEENTRY Color; ULONG Mask; } Green = {{0, 255, 0}}; - static const union { PALETTEENTRY Color; ULONG Mask; } Blue = {{0, 0, 255}}; + static const union { PALETTEENTRY Color; ULONG Mask; } Red = {{255, 0, 0}}; + static const union { PALETTEENTRY Color; ULONG Mask; } Green = {{0, 255, 0}}; + static const union { PALETTEENTRY Color; ULONG Mask; } Blue = {{0, 0, 255}}; - switch(PalType) - { - case PAL_RGB: - *RedMask = RGB(255, 0, 0); - *GreenMask = RGB(0, 255, 0); - *BlueMask = RGB(0, 0, 255); - break; - case PAL_BGR: - *RedMask = RGB(0, 0, 255); - *GreenMask = RGB(0, 255, 0); - *BlueMask = RGB(255, 0, 0); - break; - case PAL_BITFIELDS: - *RedMask = Palette->RedMask; - *GreenMask = Palette->GreenMask; - *BlueMask = Palette->BlueMask; - break; - case PAL_INDEXED: - *RedMask = Red.Mask; - *GreenMask = Green.Mask; - *BlueMask = Blue.Mask; - break; - } + switch (PalType) + { + case PAL_RGB: + *RedMask = RGB(255, 0, 0); + *GreenMask = RGB(0, 255, 0); + *BlueMask = RGB(0, 0, 255); + break; + case PAL_BGR: + *RedMask = RGB(0, 0, 255); + *GreenMask = RGB(0, 255, 0); + *BlueMask = RGB(255, 0, 0); + break; + case PAL_BITFIELDS: + *RedMask = Palette->RedMask; + *GreenMask = Palette->GreenMask; + *BlueMask = Palette->BlueMask; + break; + case PAL_INDEXED: + *RedMask = Red.Mask; + *GreenMask = Green.Mask; + *BlueMask = Blue.Mask; + break; + } } /* @@ -155,36 +130,14 @@ static INT FASTCALL CalculateShift(ULONG Mask) ULONG LeftmostBit = 1 << (8 * sizeof(ULONG) - 1); while (0 == (Mask & LeftmostBit) && Shift < 8 * sizeof(ULONG)) - { - Mask = Mask << 1; - Shift++; - } + { + Mask = Mask << 1; + Shift++; + } return Shift; } -VOID FASTCALL EngDeleteXlate(XLATEOBJ *XlateObj) -{ - XLATEGDI *XlateGDI; - HANDLE HXlate; - - if (NULL == XlateObj) - { - DPRINT1("Trying to delete NULL XLATEOBJ\n"); - return; - } - - XlateGDI = (XLATEGDI *) AccessInternalObjectFromUserObject(XlateObj); - HXlate = (HANDLE) AccessHandleFromUserObject(XlateObj); - - if((XlateObj->flXlate & XO_TABLE) && NULL != XlateGDI->translationTable) - { - EngFreeMem(XlateGDI->translationTable); - } - - FreeGDIHandle((ULONG)HXlate); -} - XLATEOBJ* STDCALL IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, HPALETTE PaletteDest, HPALETTE PaletteSource) @@ -270,7 +223,17 @@ IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, { XlateGDI->translationTable = EngAllocMem(0, sizeof(ULONG) * SourcePalGDI->NumColors, 0); - IndexedToIndexedTranslationTable(XlateGDI, XlateGDI->translationTable, DestPalGDI, SourcePalGDI); + + XlateObj->flXlate |= XO_TRIVIAL; + for (i = 0; i < SourcePalGDI->NumColors; i++) + { + XlateGDI->translationTable[i] = ClosestColorMatch( + XlateGDI, SourcePalGDI->IndexedColors + i, + DestPalGDI->IndexedColors, DestPalGDI->NumColors); + if (XlateGDI->translationTable[i] != i) + XlateObj->flXlate &= ~XO_TRIVIAL; + } + XlateObj->flXlate |= XO_TABLE; XlateObj->pulXlate = XlateGDI->translationTable; goto end; @@ -318,12 +281,11 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( XlateObj->iSrcType = SourcePalType; XlateObj->iDstType = PAL_INDEXED; - // Store handles of palettes in internal Xlate GDI object (or NULLs) + /* Store handles of palettes in internal Xlate GDI object (or NULLs) */ XlateGDI->DestPal = PaletteDest; XlateGDI->SourcePal = PaletteSource; XlateObj->flXlate = XO_TO_MONO; - /* FIXME: Map into source palette type */ switch (SourcePalType) { case PAL_INDEXED: @@ -356,6 +318,35 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( return XlateObj; } +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +VOID FASTCALL +EngDeleteXlate(XLATEOBJ *XlateObj) +{ + XLATEGDI *XlateGDI; + HANDLE HXlate; + + if (XlateObj == NULL) + { + DPRINT1("Trying to delete NULL XLATEOBJ\n"); + return; + } + + XlateGDI = (XLATEGDI *)AccessInternalObjectFromUserObject(XlateObj); + HXlate = (HANDLE)AccessHandleFromUserObject(XlateObj); + + if ((XlateObj->flXlate & XO_TABLE) && + XlateGDI->translationTable != NULL) + { + EngFreeMem(XlateGDI->translationTable); + } + + FreeGDIHandle((ULONG)HXlate); +} + /* * @implemented */ @@ -390,7 +381,7 @@ XLATEOBJ_iXlate(XLATEOBJ *XlateObj, ULONG Color) return Color; if (XlateObj->flXlate & XO_TABLE) - return XlateObj->pulXlate[Color]; + return XlateObj->pulXlate[Color]; XlateGDI = (XLATEGDI *)AccessInternalObjectFromUserObject(XlateObj); diff --git a/reactos/subsys/win32k/include/copybits.h b/reactos/subsys/win32k/include/copybits.h deleted file mode 100644 index 75c986ab390..00000000000 --- a/reactos/subsys/win32k/include/copybits.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __WIN32K_COPYBITS_H -#define __WIN32K_COPYBITS_H - -BOOLEAN STDCALL CopyBitsCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - SURFGDI *DestGDI, SURFGDI *SourceGDI, - PRECTL DestRect, POINTL *SourcePoint, - ULONG Delta, XLATEOBJ *ColorTranslation); - -#endif /* __WIN32K_COPYBITS_H */ diff --git a/reactos/subsys/win32k/include/dib.h b/reactos/subsys/win32k/include/dib.h index 403d1e1673b..80a2fc4d7a3 100644 --- a/reactos/subsys/win32k/include/dib.h +++ b/reactos/subsys/win32k/include/dib.h @@ -16,8 +16,6 @@ DIB_GetDIBWidthBytes (INT width, INT depth); RGBQUAD * FASTCALL DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi); -PPALETTEENTRY STDCALL -DIBColorTableToPaletteEntries(PPALETTEENTRY palEntries, const RGBQUAD *DIBColorTable, ULONG ColorCount); HPALETTE FASTCALL BuildDIBPalette (PBITMAPINFO bmi, PINT paletteType); diff --git a/reactos/subsys/win32k/include/eng.h b/reactos/subsys/win32k/include/eng.h index 52d0d98039b..cafed3f9bff 100644 --- a/reactos/subsys/win32k/include/eng.h +++ b/reactos/subsys/win32k/include/eng.h @@ -1,12 +1,6 @@ #ifndef _WIN32K_ENG_H #define _WIN32K_ENG_H -#define IntLockGDIDriver(SurfGDI) \ - ExAcquireFastMutex(SurfGDI->DriverLock) - -#define IntUnLockGDIDriver(SurfGDI) \ - ExReleaseFastMutex(SurfGDI->DriverLock) - BOOL STDCALL EngIntersectRect (PRECTL prcDst, PRECTL prcSrc1, PRECTL prcSrc2); VOID FASTCALL EngDeleteXlate (XLATEOBJ *XlateObj); BOOL STDCALL diff --git a/reactos/subsys/win32k/include/inteng.h b/reactos/subsys/win32k/include/inteng.h index 2f90775eb3a..2f55e696e71 100644 --- a/reactos/subsys/win32k/include/inteng.h +++ b/reactos/subsys/win32k/include/inteng.h @@ -5,30 +5,34 @@ /* Definitions of IntEngXxx functions */ -BOOL STDCALL IntEngLineTo(SURFOBJ *Surface, - CLIPOBJ *Clip, - BRUSHOBJ *Brush, - LONG x1, - LONG y1, - LONG x2, - LONG y2, - RECTL *RectBounds, - MIX mix); -BOOL STDCALL IntEngBitBlt(SURFOBJ *DestObj, - SURFOBJ *SourceObj, - SURFOBJ *Mask, - CLIPOBJ *ClipRegion, - XLATEOBJ *ColorTranslation, - RECTL *DestRect, - POINTL *SourcePoint, - POINTL *MaskOrigin, - BRUSHOBJ *Brush, - POINTL *BrushOrigin, - ROP4 rop4); BOOL STDCALL -IntEngStretchBlt(SURFOBJ *DestObj, - SURFOBJ *SourceObj, - SURFOBJ *Mask, +IntEngLineTo(BITMAPOBJ *Surface, + CLIPOBJ *Clip, + BRUSHOBJ *Brush, + LONG x1, + LONG y1, + LONG x2, + LONG y2, + RECTL *RectBounds, + MIX mix); + +BOOL STDCALL +IntEngBitBlt(BITMAPOBJ *DestObj, + BITMAPOBJ *SourceObj, + BITMAPOBJ *Mask, + CLIPOBJ *ClipRegion, + XLATEOBJ *ColorTranslation, + RECTL *DestRect, + POINTL *SourcePoint, + POINTL *MaskOrigin, + BRUSHOBJ *Brush, + POINTL *BrushOrigin, + ROP4 rop4); + +BOOL STDCALL +IntEngStretchBlt(BITMAPOBJ *DestObj, + BITMAPOBJ *SourceObj, + BITMAPOBJ *Mask, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, RECTL *DestRect, @@ -39,44 +43,57 @@ IntEngStretchBlt(SURFOBJ *DestObj, ULONG Mode); BOOL STDCALL -IntEngGradientFill( - SURFOBJ *psoDest, - CLIPOBJ *pco, - XLATEOBJ *pxlo, - TRIVERTEX *pVertex, - ULONG nVertex, - PVOID pMesh, - ULONG nMesh, - RECTL *prclExtents, - POINTL *pptlDitherOrg, - ULONG ulMode); +IntEngGradientFill(BITMAPOBJ *psoDest, + CLIPOBJ *pco, + XLATEOBJ *pxlo, + TRIVERTEX *pVertex, + ULONG nVertex, + PVOID pMesh, + ULONG nMesh, + RECTL *prclExtents, + POINTL *pptlDitherOrg, + ULONG ulMode); -XLATEOBJ * STDCALL IntEngCreateXlate(USHORT DestPalType, - USHORT SourcePalType, - HPALETTE PaletteDest, - HPALETTE PaletteSource); +XLATEOBJ * STDCALL +IntEngCreateXlate(USHORT DestPalType, + USHORT SourcePalType, + HPALETTE PaletteDest, + HPALETTE PaletteSource); -XLATEOBJ * STDCALL IntEngCreateMonoXlate( - USHORT SourcePalType, HPALETTE PaletteDest, HPALETTE PaletteSource, - ULONG BackgroundColor); +XLATEOBJ * STDCALL +IntEngCreateMonoXlate(USHORT SourcePalType, + HPALETTE PaletteDest, + HPALETTE PaletteSource, + ULONG BackgroundColor); -BOOL STDCALL IntEngPolyline(SURFOBJ *DestSurf, - CLIPOBJ *Clip, - BRUSHOBJ *Brush, - CONST LPPOINT pt, - LONG dCount, - MIX mix); -CLIPOBJ* STDCALL IntEngCreateClipRegion(ULONG count, - PRECTL pRect, - PRECTL rcBounds); +BOOL STDCALL +IntEngPolyline(BITMAPOBJ *DestSurf, + CLIPOBJ *Clip, + BRUSHOBJ *Brush, + CONST LPPOINT pt, + LONG dCount, + MIX mix); + +CLIPOBJ* STDCALL +IntEngCreateClipRegion(ULONG count, + PRECTL pRect, + PRECTL rcBounds); BOOL FASTCALL -IntEngTransparentBlt(SURFOBJ *Dest, - SURFOBJ *Source, +IntEngTransparentBlt(BITMAPOBJ *Dest, + BITMAPOBJ *Source, CLIPOBJ *Clip, XLATEOBJ *ColorTranslation, PRECTL DestRect, PRECTL SourceRect, ULONG iTransColor, ULONG Reserved); + +BOOL STDCALL +IntEngPaint(IN BITMAPOBJ *Surface, + IN CLIPOBJ *ClipRegion, + IN BRUSHOBJ *Brush, + IN POINTL *BrushOrigin, + IN MIX Mix); + #endif /* _WIN32K_INTENG_H */ diff --git a/reactos/subsys/win32k/include/mouse.h b/reactos/subsys/win32k/include/mouse.h index cd8de7d3ed8..d114c682583 100644 --- a/reactos/subsys/win32k/include/mouse.h +++ b/reactos/subsys/win32k/include/mouse.h @@ -7,8 +7,8 @@ BOOL FASTCALL IntCheckClipCursor(LONG *x, LONG *y, PSYSTEM_CURSORINFO CurInfo); BOOL FASTCALL IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap); -INT FASTCALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, SURFGDI *SurfGDI, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2); -INT FASTCALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj, SURFGDI *SurfGDI); +INT FASTCALL MouseSafetyOnDrawStart(SURFOBJ *SurfObj, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2); +INT FASTCALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj); BOOL FASTCALL MouseMoveCursor(LONG X, LONG Y); VOID FASTCALL EnableMouse(HDC hDisplayDC); VOID MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount); diff --git a/reactos/subsys/win32k/include/object.h b/reactos/subsys/win32k/include/object.h index 5bfc3ea1e02..859b4f21ccb 100644 --- a/reactos/subsys/win32k/include/object.h +++ b/reactos/subsys/win32k/include/object.h @@ -132,12 +132,6 @@ BOOL FASTCALL CleanupForProcess (struct _EPROCESS *Process, INT Pid); PPOINT FASTCALL GDI_Bezier (const POINT *Points, INT count, PINT nPtsOut); -/* objects/objconv.c */ - -HBITMAP -FASTCALL -BitmapToSurf ( PBITMAPOBJ BitmapObj, HDEV GDIDevice ); - #endif /* _WIN32K_OBJECT_H */ /* EOF */ diff --git a/reactos/subsys/win32k/include/paint.h b/reactos/subsys/win32k/include/paint.h index 4f10180407c..80c5ea801a0 100644 --- a/reactos/subsys/win32k/include/paint.h +++ b/reactos/subsys/win32k/include/paint.h @@ -2,6 +2,6 @@ #define _WIN32K_PAINT_H BOOL STDCALL FillSolid (SURFOBJ* Surface, RECTL* Dimensions, ULONG iColor); -BOOL STDCALL FillPolygon ( DC* dc, SURFOBJ* SurfObj, BRUSHOBJ* BrushObj, MIX RopMode, CONST PPOINT Points, INT Count, RECTL BoundRect ); +BOOL STDCALL FillPolygon ( DC* dc, BITMAPOBJ* SurfObj, BRUSHOBJ* BrushObj, MIX RopMode, CONST PPOINT Points, INT Count, RECTL BoundRect ); #endif /* _WIN32K_PAINT_H */ diff --git a/reactos/subsys/win32k/include/surface.h b/reactos/subsys/win32k/include/surface.h index ce8a6de27c6..4629f9a2b08 100644 --- a/reactos/subsys/win32k/include/surface.h +++ b/reactos/subsys/win32k/include/surface.h @@ -1,7 +1,11 @@ #ifndef _WIN32K_SURFACE_H #define _WIN32K_SURFACE_H +#define GDIDEV(SurfObj) ((GDIDEVICE *)((SurfObj)->hdev)) +#define GDIDEVFUNCS(SurfObj) ((GDIDEVICE *)((SurfObj)->hdev))->DriverFunctions + INT FASTCALL BitsPerFormat (ULONG Format); ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression); +HBITMAP FASTCALL IntCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format, IN ULONG Flags, IN PVOID Bits); #endif /* _WIN32K_SURFACE_H */ diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 9a50688c475..e5843d6434c 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.100 2004/05/28 21:33:40 gvg Exp $ +# $Id: makefile,v 1.101 2004/07/03 13:55:36 navaraf Exp $ PATH_TO_TOP = ../.. @@ -44,7 +44,7 @@ TARGET_LFLAGS =\ ENG_OBJECTS= eng/debug.o eng/error.o eng/mem.o eng/brush.o eng/bitblt.o \ eng/clip.o eng/copybits.o eng/device.o eng/handle.o eng/lineto.o \ eng/paint.o eng/palette.o eng/perfcnt.o eng/semaphor.o eng/surface.o \ - eng/xlate.o eng/transblt.o eng/mouse.o eng/misc.o eng/nls.o eng/sort.o \ + eng/xlate.o eng/transblt.o eng/mouse.o eng/misc.o eng/sort.o \ eng/gradient.o eng/event.o eng/float.o MAIN_OBJECTS = main/dllmain.o main/svctabm.o @@ -67,9 +67,8 @@ OBJECTS_OBJECTS = objects/bitmaps.o objects/brush.o objects/cliprgn.o \ objects/line.o objects/metafile.o objects/paint.o \ objects/path.o objects/pen.o objects/print.o \ objects/region.o objects/text.o objects/wingl.o \ - objects/bezier.o objects/objconv.o objects/dib.o \ - objects/palette.o objects/rect.o objects/polyfill.o \ - objects/cursoricon.o + objects/bezier.o objects/dib.o objects/palette.o \ + objects/rect.o objects/polyfill.o objects/cursoricon.o DIB_OBJECTS = dib/dib.o dib/dib1bpp.o dib/dib4bpp.o dib/dib8bpp.o dib/dib16bpp.o \ dib/dib24bpp.o dib/dib32bpp.o diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index c368b01ccd3..dcb00662e55 100644 --- a/reactos/subsys/win32k/ntuser/desktop.c +++ b/reactos/subsys/win32k/ntuser/desktop.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: desktop.c,v 1.15 2004/05/28 21:33:41 gvg Exp $ + * $Id: desktop.c,v 1.16 2004/07/03 13:55:36 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -110,13 +110,14 @@ IntGetDesktopWorkArea(PDESKTOP_OBJECT Desktop, PRECT Rect) if((Ret->right == -1) && ScreenDeviceContext) { PDC dc; - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; dc = DC_LockDc(ScreenDeviceContext); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - if(SurfObj) + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + if(BitmapObj) { - Ret->right = SurfObj->sizlBitmap.cx; - Ret->bottom = SurfObj->sizlBitmap.cy; + Ret->right = BitmapObj->SurfObj.sizlBitmap.cx; + Ret->bottom = BitmapObj->SurfObj.sizlBitmap.cy; + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); } DC_UnlockDc(ScreenDeviceContext); } diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index 039b607879e..e86347993d6 100644 --- a/reactos/subsys/win32k/ntuser/input.c +++ b/reactos/subsys/win32k/ntuser/input.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: input.c,v 1.34 2004/05/25 15:52:45 navaraf Exp $ +/* $Id: input.c,v 1.35 2004/07/03 13:55:36 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -530,10 +530,13 @@ IntMouseInput(MOUSEINPUT *mi) PWINSTATION_OBJECT WinSta; BOOL DoMove, SwapButtons; MSG Msg; + HBITMAP hBitmap; + BITMAPOBJ *BitmapObj; SURFOBJ *SurfObj; - PSURFGDI SurfGDI; PDC dc; RECTL PointerRect; + PWINDOW_OBJECT DesktopWindow; + NTSTATUS Status; #if 1 HDC hDC; @@ -558,13 +561,6 @@ IntMouseInput(MOUSEINPUT *mi) CurInfo = IntGetSysCursorInfo(WinSta); - dc = DC_LockDc(hDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface); - DC_UnlockDc(hDC); - ASSERT(SurfObj); - ASSERT(SurfGDI); - if(!mi->time) { LARGE_INTEGER LargeTickCount; @@ -574,6 +570,7 @@ IntMouseInput(MOUSEINPUT *mi) SwapButtons = CurInfo->SwapButtons; DoMove = FALSE; + ExAcquireFastMutex(&CurInfo->CursorMutex); MousePos.x = CurInfo->x; MousePos.y = CurInfo->y; @@ -590,14 +587,21 @@ IntMouseInput(MOUSEINPUT *mi) MousePos.y += mi->dy; } + Status = ObmReferenceObjectByHandle(WinSta->HandleTable, + WinSta->ActiveDesktop->DesktopWindow, otWindow, (PVOID*)&DesktopWindow); + if (NT_SUCCESS(Status)) + { + if(MousePos.x >= DesktopWindow->ClientRect.right) + MousePos.x = DesktopWindow->ClientRect.right - 1; + if(MousePos.y >= DesktopWindow->ClientRect.bottom) + MousePos.y = DesktopWindow->ClientRect.bottom - 1; + } + ObmDereferenceObject(DesktopWindow); + if(MousePos.x < 0) MousePos.x = 0; if(MousePos.y < 0) MousePos.y = 0; - if(MousePos.x >= SurfObj->sizlBitmap.cx) - MousePos.x = SurfObj->sizlBitmap.cx - 1; - if(MousePos.y >= SurfObj->sizlBitmap.cy) - MousePos.y = SurfObj->sizlBitmap.cy - 1; if(CurInfo->CursorClipInfo.IsClipped) { @@ -613,28 +617,48 @@ IntMouseInput(MOUSEINPUT *mi) MousePos.y = (LONG)CurInfo->CursorClipInfo.Top; } - if((DoMove = (MousePos.x != CurInfo->x || MousePos.y != CurInfo->y))) + DoMove = (MousePos.x != CurInfo->x || MousePos.y != CurInfo->y); + if(DoMove) { CurInfo->x = MousePos.x; CurInfo->y = MousePos.y; - if(SurfGDI->MovePointer) - { - IntLockGDIDriver(SurfGDI); - SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - IntUnLockGDIDriver(SurfGDI); - } - else - { - IntLockGDIDriver(SurfGDI); - EngMovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect); - IntUnLockGDIDriver(SurfGDI); - } - SetPointerRect(CurInfo, &PointerRect); } } ExReleaseFastMutex(&CurInfo->CursorMutex); + if (DoMove) + { + dc = DC_LockDc(hDC); + if (dc) + { + hBitmap = dc->w.hBitmap; + DC_UnlockDc(hDC); + + BitmapObj = BITMAPOBJ_LockBitmap(hBitmap); + if (BitmapObj) + { + SurfObj = &BitmapObj->SurfObj; + + if(GDIDEVFUNCS(SurfObj).MovePointer) + { + GDIDEVFUNCS(SurfObj).MovePointer( + SurfObj, MousePos.x, MousePos.y, &PointerRect); + } + else + { + EngMovePointer(SurfObj, MousePos.x, MousePos.y, &PointerRect); + } + + BITMAPOBJ_UnlockBitmap(hBitmap); + + ExAcquireFastMutex(&CurInfo->CursorMutex); + SetPointerRect(CurInfo, &PointerRect); + ExReleaseFastMutex(&CurInfo->CursorMutex); + } + } + } + /* * Insert the messages into the system queue */ diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index a0b1f75dea9..edab9193f2c 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.80 2004/06/24 09:44:06 weiden Exp $ +/* $Id: misc.c,v 1.81 2004/07/03 13:55:36 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -735,18 +735,12 @@ IntSystemParametersInfo( case SPI_GETGRADIENTCAPTIONS: { HDC hDC; - PDC dc; - SURFOBJ *SurfObj; BOOL Ret = GradientCaptions; hDC = IntGetScreenDC(); if(hDC) { - dc = DC_LockDc(hDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - if(SurfObj) - Ret = (SurfObj->iBitmapFormat > BMF_8BPP) && Ret; - DC_UnlockDc(hDC); + Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret; ASSERT(pvParam); *((PBOOL)pvParam) = Ret; diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 003815b6471..92aa42b2f36 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmaps.c,v 1.75 2004/06/28 17:03:35 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.76 2004/07/03 13:55:36 navaraf Exp $ */ #include #define IN_RECT(r,x,y) \ @@ -41,8 +41,7 @@ NtGdiBitBlt( { PDC DCDest = NULL; PDC DCSrc = NULL; - SURFOBJ *SurfDest, *SurfSrc; - PSURFGDI SurfGDIDest, SurfGDISrc; + BITMAPOBJ *BitmapDest, *BitmapSrc; RECTL DestRect; POINTL SourcePoint, BrushOrigin; BOOL Status; @@ -107,17 +106,17 @@ NtGdiBitBlt( BrushOrigin.y = 0; /* Determine surfaces to be used in the bitblt */ - SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); - SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); + BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); if (UsesSource) { - SurfSrc = (SURFOBJ*)AccessUserObject((ULONG)DCSrc->Surface); - SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); + if (DCSrc->w.hBitmap == DCDest->w.hBitmap) + BitmapSrc = BitmapDest; + else + BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); } else { - SurfSrc = NULL; - SurfGDISrc = NULL; + BitmapSrc = NULL; } if (UsesPattern) @@ -223,10 +222,15 @@ NtGdiBitBlt( } /* Perform the bitblt operation */ - Status = IntEngBitBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, XlateObj, + Status = IntEngBitBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, XlateObj, &DestRect, &SourcePoint, NULL, &BrushObj->BrushObject, &BrushOrigin, ROP); EngDeleteXlate(XlateObj); + BITMAPOBJ_UnlockBitmap(DCDest->w.hBitmap); + if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) + { + BITMAPOBJ_UnlockBitmap(DCSrc->w.hBitmap); + } if (NULL != Mono) { EngDeletePalette(Mono); @@ -260,7 +264,7 @@ NtGdiTransparentBlt( { PDC DCDest, DCSrc; RECTL rcDest, rcSrc; - SURFOBJ *SurfDest, *SurfSrc; + BITMAPOBJ *BitmapDest, *BitmapSrc; XLATEOBJ *XlateObj; HPALETTE SourcePalette, DestPalette; PPALGDI PalDestGDI, PalSourceGDI; @@ -336,10 +340,10 @@ NtGdiTransparentBlt( /* Create the XLATE object to convert colors between source and destination */ XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); - SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); - ASSERT(SurfDest); - SurfSrc = (SURFOBJ*)AccessUserObject((ULONG)DCSrc->Surface); - ASSERT(SurfSrc); + BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + ASSERT(BitmapDest); + BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + ASSERT(BitmapSrc); rcDest.left = xDst; rcDest.top = yDst; @@ -356,10 +360,12 @@ NtGdiTransparentBlt( goto done; } - Ret = IntEngTransparentBlt(SurfDest, SurfSrc, DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, + Ret = IntEngTransparentBlt(BitmapDest, BitmapSrc, DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, TransparentColor, 0); done: + BITMAPOBJ_UnlockBitmap(DCDest->w.hBitmap); + BITMAPOBJ_UnlockBitmap(DCSrc->w.hBitmap); DC_UnlockDc(hdcSrc); if(hdcDst != hdcSrc) { @@ -380,73 +386,54 @@ NtGdiCreateBitmap( UINT BitsPerPel, CONST VOID *Bits) { - PBITMAPOBJ bmp; - HBITMAP hBitmap; + PBITMAPOBJ bmp; + HBITMAP hBitmap; + SIZEL Size; - Planes = (BYTE) Planes; - BitsPerPel = (BYTE) BitsPerPel; + /* NOTE: Windows also doesn't store nr. of planes separately! */ + BitsPerPel = (BYTE)BitsPerPel * (BYTE)Planes; - /* Check parameters */ - if (!Height || !Width) - { - Width = 1; - Height = 1; - } - if (Planes != 1) - { - DPRINT("NtGdiCreateBitmap - UNIMPLEMENTED\n"); - return 0; - } - if (Height < 0) - { - Height = -Height; - } - if (Width < 0) - { - Width = -Width; - } + /* Check parameters */ + if (!Height || !Width) + { + Size.cx = Size.cy = 1; + } + else + { + Size.cx = Width; + Size.cy = abs(Height); + } - /* Create the BITMAPOBJ */ - hBitmap = BITMAPOBJ_AllocBitmap (); - if (!hBitmap) - { - DPRINT("NtGdiCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n"); - return 0; - } + /* Create the bitmap object. */ + hBitmap = IntCreateBitmap(Size, BITMAPOBJ_GetWidthBytes(Width, BitsPerPel), + BitmapFormat(BitsPerPel, BI_RGB), + (Height > 0 ? 0 : BMF_TOPDOWN) | + (Bits == NULL ? 0 : BMF_NOZEROINIT), NULL); + if (!hBitmap) + { + DPRINT("NtGdiCreateBitmap: IntCreateBitmap returned 0\n"); + return 0; + } - bmp = BITMAPOBJ_LockBitmap( hBitmap ); + DPRINT("NtGdiCreateBitmap:%dx%d, %d BPP colors returning %08x\n", + Size.cx, Size.cy, BitsPerPel, hBitmap); - DPRINT("NtGdiCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height, - 1 << (Planes * BitsPerPel), BitsPerPel, bmp); + bmp = BITMAPOBJ_LockBitmap( hBitmap ); + bmp->flFlags = BITMAPOBJ_IS_APIBITMAP; + BITMAPOBJ_UnlockBitmap( hBitmap ); - bmp->dimension.cx = 0; - bmp->dimension.cy = 0; - bmp->bitmap.bmType = 0; - bmp->bitmap.bmWidth = Width; - bmp->bitmap.bmHeight = Height; - bmp->bitmap.bmPlanes = Planes; - bmp->bitmap.bmBitsPixel = BitsPerPel; - bmp->bitmap.bmWidthBytes = BITMAPOBJ_GetWidthBytes (Width, BitsPerPel); - bmp->bitmap.bmBits = NULL; - bmp->DDBitmap = NULL; - bmp->dib = NULL; + /* + * NOTE: It's ugly practice, but we are using the object even + * after unlocking. Since the handle is currently known only + * to us it should be safe. + */ - // Allocate memory for bitmap bits - bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight, TAG_BITMAP); + if (Bits != NULL) + { + NtGdiSetBitmapBits(hBitmap, bmp->SurfObj.cjBits, Bits); + } - BITMAPOBJ_UnlockBitmap( hBitmap ); - - if (Bits) /* Set bitmap bits */ - { - NtGdiSetBitmapBits(hBitmap, Height * bmp->bitmap.bmWidthBytes, Bits); - } - else - { - // Initialize the bitmap (fixes bug 244?) - RtlZeroMemory(bmp->bitmap.bmBits, Height * bmp->bitmap.bmWidthBytes); - } - - return hBitmap; + return hBitmap; } BOOL FASTCALL @@ -454,23 +441,16 @@ Bitmap_InternalDelete( PBITMAPOBJ pBmp ) { ASSERT( pBmp ); - if (NULL != pBmp->bitmap.bmBits) + if (pBmp->SurfObj.pvBits != NULL && + (pBmp->flFlags & BITMAPOBJ_IS_APIBITMAP)) { - if (NULL != pBmp->dib) + if (pBmp->dib == NULL) { - if (NULL == pBmp->dib->dshSection) - { - EngFreeUserMem(pBmp->bitmap.bmBits); - } - else - { - /* This is a file-mapped section */ - UNIMPLEMENTED; - } + ExFreePool(pBmp->SurfObj.pvBits); } else { - ExFreePool(pBmp->bitmap.bmBits); + EngFreeUserMem(pBmp->SurfObj.pvBits); } } @@ -600,7 +580,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) PDC dc = NULL; COLORREF Result = (COLORREF)CLR_INVALID; // default to failure BOOL bInRect = FALSE; - PSURFGDI Surface; + BITMAPOBJ *BitmapObject; SURFOBJ *SurfaceObject; HPALETTE Pal; PPALGDI PalGDI; @@ -617,10 +597,9 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) { bInRect = TRUE; - SurfaceObject = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); - ASSERT(SurfaceObject); - Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject); - if ( Surface ) + BitmapObject = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + SurfaceObject = &BitmapObject->SurfObj; + if ( BitmapObject ) { if ( dc->w.hPalette != 0 ) Pal = dc->w.hPalette; @@ -637,13 +616,15 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) // check if this DC has a DIB behind it... if ( SurfaceObject->pvScan0 ) // STYPE_BITMAP == SurfaceObject->iType { - ASSERT ( SurfaceObject->lDelta && Surface->DIB_GetPixel ); - Result = XLATEOBJ_iXlate(XlateObj, Surface->DIB_GetPixel ( SurfaceObject, XPos, YPos ) ); + ASSERT ( SurfaceObject->lDelta ); + Result = XLATEOBJ_iXlate(XlateObj, + DibFunctionsForBitmapFormat[SurfaceObject->iBitmapFormat].DIB_GetPixel ( SurfaceObject, XPos, YPos ) ); } EngDeleteXlate(XlateObj); } } } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); } DC_UnlockDc(hDC); @@ -673,7 +654,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) bmpobj = BITMAPOBJ_LockBitmap ( hBmpTmp ); if ( bmpobj ) { - Result = *(COLORREF*)bmpobj->bitmap.bmBits; + Result = *(COLORREF*)bmpobj->SurfObj.pvScan0; BITMAPOBJ_UnlockBitmap ( hBmpTmp ); } } @@ -935,19 +916,19 @@ NtGdiSetBitmapBits( } /* Only get entire lines */ - height = Bytes / bmp->bitmap.bmWidthBytes; - if (height > bmp->bitmap.bmHeight) + height = Bytes / abs(bmp->SurfObj.lDelta); + if (height > bmp->SurfObj.sizlBitmap.cx) { - height = bmp->bitmap.bmHeight; + height = bmp->SurfObj.sizlBitmap.cx; } - Bytes = height * bmp->bitmap.bmWidthBytes; + Bytes = height * abs(bmp->SurfObj.lDelta); DPRINT ("(%08x, bytes:%ld, bits:%p) %dx%d %d colors fetched height: %ld\n", hBitmap, Bytes, Bits, - bmp->bitmap.bmWidth, - bmp->bitmap.bmHeight, - 1 << bmp->bitmap.bmBitsPixel, + bmp->SurfObj.sizlBitmap.cx, + bmp->SurfObj.sizlBitmap.cy, + 1 << BitsPerFormat(bmp->SurfObj.iBitmapFormat), height); #if 0 @@ -968,21 +949,8 @@ NtGdiSetBitmapBits( else #endif { - /* FIXME: Alloc enough for entire bitmap */ - if (bmp->bitmap.bmBits == NULL) - { - bmp->bitmap.bmBits = ExAllocatePoolWithTag(PagedPool, Bytes, TAG_BITMAP); - } - if(!bmp->bitmap.bmBits) - { - DPRINT ("Unable to allocate bit buffer\n"); - ret = 0; - } - else - { - memcpy(bmp->bitmap.bmBits, Bits, Bytes); - ret = Bytes; - } + memcpy(bmp->SurfObj.pvBits, Bits, Bytes); + ret = Bytes; } BITMAPOBJ_UnlockBitmap(hBitmap); @@ -1072,8 +1040,7 @@ NtGdiStretchBlt( { PDC DCDest = NULL; PDC DCSrc = NULL; - SURFOBJ *SurfDest, *SurfSrc; - PSURFGDI SurfGDIDest, SurfGDISrc; + BITMAPOBJ *BitmapDest, *BitmapSrc; RECTL DestRect; RECTL SourceRect; BOOL Status; @@ -1141,17 +1108,17 @@ NtGdiStretchBlt( SourceRect.bottom = YOriginSrc+HeightSrc; /* Determine surfaces to be used in the bitblt */ - SurfDest = (SURFOBJ*)AccessUserObject((ULONG)DCDest->Surface); - SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest); + BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); if (UsesSource) { - SurfSrc = (SURFOBJ*)AccessUserObject((ULONG)DCSrc->Surface); - SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc); + if (DCSrc->w.hBitmap == DCDest->w.hBitmap) + BitmapSrc = BitmapDest; + else + BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); } else { - SurfSrc = NULL; - SurfGDISrc = NULL; + BitmapSrc = NULL; } if (UsesPattern) @@ -1227,10 +1194,15 @@ NtGdiStretchBlt( } /* Perform the bitblt operation */ - Status = IntEngStretchBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, + Status = IntEngStretchBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, XlateObj, &DestRect, &SourceRect, NULL, NULL, NULL, COLORONCOLOR); EngDeleteXlate(XlateObj); + BITMAPOBJ_UnlockBitmap(DCDest->w.hBitmap); + if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) + { + BITMAPOBJ_UnlockBitmap(DCSrc->w.hBitmap); + } if (UsesPattern) { BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); @@ -1283,20 +1255,14 @@ BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp) HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) { - PBITMAPOBJ bmp; HBITMAP res; BITMAP bm; - bmp = BITMAPOBJ_LockBitmap(hBitmap); - if (bmp == NULL) + if (IntGdiGetObject(hBitmap, sizeof(BITMAP), &bm) == 0) { return 0; } - res = 0; - - bm = bmp->bitmap; bm.bmBits = NULL; - BITMAPOBJ_UnlockBitmap(hBitmap); res = NtGdiCreateBitmapIndirect(&bm); if(res) { @@ -1329,8 +1295,16 @@ BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer) } else { + BITMAP Bitmap; if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP); - memcpy(buffer, &bmp->bitmap, count); + Bitmap.bmType = 0; + Bitmap.bmWidth = bmp->SurfObj.sizlBitmap.cx; + Bitmap.bmHeight = bmp->SurfObj.sizlBitmap.cy; + Bitmap.bmWidthBytes = abs(bmp->SurfObj.lDelta); + Bitmap.bmPlanes = 1; + Bitmap.bmBitsPixel = BitsPerFormat(bmp->SurfObj.iBitmapFormat); + Bitmap.bmBits = bmp->SurfObj.pvBits; + memcpy(buffer, &Bitmap, count); return count; } } diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 4e0e911592b..ac0937ba0f1 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: brush.c,v 1.37 2004/05/10 17:07:20 weiden Exp $ + * $Id: brush.c,v 1.38 2004/07/03 13:55:36 navaraf Exp $ */ #include @@ -127,12 +127,12 @@ IntPatBlt( PGDIBRUSHOBJ BrushObj) { RECTL DestRect; - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; POINTL BrushOrigin; BOOL ret; - SurfObj = (SURFOBJ *)AccessUserObject((ULONG)dc->Surface); - if (SurfObj == NULL) + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + if (BitmapObj == NULL) { SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; @@ -167,7 +167,7 @@ IntPatBlt( BrushOrigin.y = BrushObj->ptOrigin.y + dc->w.DCOrgY; ret = IntEngBitBlt( - SurfObj, + BitmapObj, NULL, NULL, dc->CombinedClip, @@ -180,6 +180,8 @@ IntPatBlt( ROP); } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + return ret; } diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index a86dbdfd55b..709c11afc85 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.46 2004/07/02 20:04:48 gvg Exp $ */ +/* $Id: color.c,v 1.47 2004/07/03 13:55:36 navaraf Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -320,7 +320,7 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) int realized = 0; PDC dc; HPALETTE systemPalette; - PSURFGDI SurfGDI; + SURFOBJ *SurfObj; BOOLEAN success; USHORT sysMode, palMode; @@ -328,7 +328,7 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) if (!dc) return 0; - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG)dc->Surface); + SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); systemPalette = NtGdiGetStockObject((INT)DEFAULT_PALETTE); palGDI = PALETTE_LockPalette(dc->w.hPalette); palPtr = (PALOBJ*) palGDI; @@ -354,12 +354,11 @@ UINT STDCALL NtGdiRealizePalette(HDC hDC) // Memory managed DC DbgPrint("win32k: realizepalette unimplemented step 2 for DC_MEMORY"); } else { - if(SurfGDI->SetPalette) + if(GDIDEVFUNCS(SurfObj).SetPalette) { - IntLockGDIDriver(SurfGDI); ASSERT(sysGDI->NumColors <= 256); - success = SurfGDI->SetPalette(dc->PDev, sysPtr, 0, 0, sysGDI->NumColors); - IntUnLockGDIDriver(SurfGDI); + success = GDIDEVFUNCS(SurfObj).SetPalette( + dc->PDev, sysPtr, 0, 0, sysGDI->NumColors); } } diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 0c25fee46d6..995f10e0237 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.57 2004/05/30 14:01:13 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.58 2004/07/03 13:55:36 navaraf Exp $ */ #include PCURICON_OBJECT FASTCALL @@ -34,40 +34,19 @@ IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle) return Object; } -HBITMAP FASTCALL -IntCopyBitmap(HBITMAP bmp) -{ - PBITMAPOBJ src; - HBITMAP ret = (HBITMAP)0; - - if(!bmp) - return (HBITMAP)0; - - src = BITMAPOBJ_LockBitmap(bmp); - if(src) - { - ret = NtGdiCreateBitmap(src->bitmap.bmWidth, src->bitmap.bmHeight, src->bitmap.bmPlanes, - src->bitmap.bmBitsPixel, src->bitmap.bmBits); - BITMAPOBJ_UnlockBitmap(bmp); - } - - return ret; -} - #define COLORCURSORS_ALLOWED FALSE HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange) { + BITMAPOBJ *BitmapObj; SURFOBJ *SurfObj; - PSURFGDI SurfGDI; - SIZEL MouseSize; PDEVINFO DevInfo; - PBITMAPOBJ MaskBmpObj; + PBITMAPOBJ MaskBmpObj = NULL; PSYSTEM_CURSORINFO CurInfo; PCURICON_OBJECT OldCursor; HCURSOR Ret = (HCURSOR)0; - HBITMAP hMask = (HBITMAP)0, hColor = (HBITMAP)0; + HBITMAP hColor = (HBITMAP)0; SURFOBJ *soMask = NULL, *soColor = NULL; XLATEOBJ *XlateObj = NULL; RECTL PointerRect; @@ -98,8 +77,8 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, return Ret; } - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + SurfObj = &BitmapObj->SurfObj; DevInfo = dc->DevInfo; DC_UnlockDc(Screen); } @@ -109,22 +88,24 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, if (NULL != CurInfo->CurrentCursorObject && CurInfo->ShowingCursor) { /* Remove the cursor if it was displayed */ - IntLockGDIDriver(SurfGDI); - if (SurfGDI->MovePointer != NULL) - SurfGDI->MovePointer(SurfObj, -1, -1, &PointerRect); - IntUnLockGDIDriver(SurfGDI); + if (GDIDEVFUNCS(SurfObj).MovePointer) + GDIDEVFUNCS(SurfObj).MovePointer(SurfObj, -1, -1, &PointerRect); + else + EngMovePointer(SurfObj, -1, -1, &PointerRect); SetPointerRect(CurInfo, &PointerRect); } - SurfGDI->PointerStatus = SPS_ACCEPT_NOEXCLUDE; + GDIDEV(SurfObj)->PointerStatus = SPS_ACCEPT_NOEXCLUDE; CurInfo->CurrentCursorObject = NewCursor; /* i.e. CurrentCursorObject = NULL */ CurInfo->ShowingCursor = 0; + BITMAPOBJ_UnlockBitmap(SurfObj->hsurf); return Ret; } if (!NewCursor) { + BITMAPOBJ_UnlockBitmap(SurfObj->hsurf); return Ret; } @@ -134,17 +115,19 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, MaskBmpObj = BITMAPOBJ_LockBitmap(NewCursor->IconInfo.hbmMask); if (MaskBmpObj) { - const int maskBpp = MaskBmpObj->bitmap.bmBitsPixel; + const int maskBpp = BitsPerFormat(MaskBmpObj->SurfObj.iBitmapFormat); BITMAPOBJ_UnlockBitmap(NewCursor->IconInfo.hbmMask); if (maskBpp != 1) { DbgPrint("SetCursor: The Mask bitmap must have 1BPP!\n"); + BITMAPOBJ_UnlockBitmap(SurfObj->hsurf); return Ret; } if ((DevInfo->flGraphicsCaps2 & GCAPS2_ALPHACURSOR) && - (SurfGDI->BitsPerPixel >= 16) && NewCursor->Shadow - && COLORCURSORS_ALLOWED) + SurfObj->iBitmapFormat >= BMF_16BPP && + SurfObj->iBitmapFormat <= BMF_32BPP && + NewCursor->Shadow && COLORCURSORS_ALLOWED) { /* FIXME - Create a color pointer, only 32bit bitmap, set alpha bits! Do not pass a mask bitmap to DrvSetPointerShape()! @@ -167,11 +150,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, MaskBmpObj = BITMAPOBJ_LockBitmap(NewCursor->IconInfo.hbmMask); if(MaskBmpObj) { - MouseSize.cx = MaskBmpObj->bitmap.bmWidth; - MouseSize.cy = MaskBmpObj->bitmap.bmHeight; - hMask = EngCreateBitmap(MouseSize, 4, BMF_1BPP, BMF_TOPDOWN, MaskBmpObj->bitmap.bmBits); - soMask = (SURFOBJ*)AccessUserObject((ULONG)hMask); - BITMAPOBJ_UnlockBitmap(NewCursor->IconInfo.hbmMask); + soMask = &MaskBmpObj->SurfObj; } } } @@ -184,28 +163,26 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->CurrentCursorObject = NULL; } - if (SurfGDI->SetPointerShape != NULL) + if (GDIDEVFUNCS(SurfObj).SetPointerShape) { - IntLockGDIDriver(SurfGDI); - SurfGDI->PointerStatus = SurfGDI->SetPointerShape(SurfObj, soMask, soColor, XlateObj, + GDIDEV(SurfObj)->PointerStatus = + GDIDEVFUNCS(SurfObj).SetPointerShape( + SurfObj, soMask, soColor, XlateObj, NewCursor->IconInfo.xHotspot, NewCursor->IconInfo.yHotspot, CurInfo->x, CurInfo->y, &PointerRect, SPS_CHANGE); - IntUnLockGDIDriver(SurfGDI); } else { - SurfGDI->PointerStatus = SPS_DECLINE; + GDIDEV(SurfObj)->PointerStatus = SPS_DECLINE; } - if(SurfGDI->PointerStatus == SPS_DECLINE) + if(((GDIDEVICE *)SurfObj->hdev)->PointerStatus == SPS_DECLINE) { - SurfGDI->SetPointerShape = EngSetPointerShape; - SurfGDI->MovePointer = EngMovePointer; - SurfGDI->PointerStatus = EngSetPointerShape( + GDIDEV(SurfObj)->PointerStatus = EngSetPointerShape( SurfObj, soMask, soColor, XlateObj, NewCursor->IconInfo.xHotspot, NewCursor->IconInfo.yHotspot, @@ -218,9 +195,10 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, SetPointerRect(CurInfo, &PointerRect); - if(hMask) + BITMAPOBJ_UnlockBitmap(SurfObj->hsurf); + if(MaskBmpObj) { - EngDeleteSurface((HSURF)hMask); + BITMAPOBJ_UnlockBitmap(soMask->hsurf); } if(hColor) { @@ -231,7 +209,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, EngDeleteXlate(XlateObj); } - if(SurfGDI->PointerStatus == SPS_ERROR) + if(GDIDEV(SurfObj)->PointerStatus == SPS_ERROR) DbgPrint("SetCursor: DrvSetPointerShape() returned SPS_ERROR\n"); return Ret; @@ -423,14 +401,14 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect) { if(Indirect) { - CurIconObject->IconInfo.hbmMask = IntCopyBitmap(CurIconObject->IconInfo.hbmMask); - CurIconObject->IconInfo.hbmColor = IntCopyBitmap(CurIconObject->IconInfo.hbmColor); + CurIconObject->IconInfo.hbmMask = BITMAPOBJ_CopyBitmap(CurIconObject->IconInfo.hbmMask); + CurIconObject->IconInfo.hbmColor = BITMAPOBJ_CopyBitmap(CurIconObject->IconInfo.hbmColor); } if(CurIconObject->IconInfo.hbmColor && (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor))) { - CurIconObject->Size.cx = bmp->bitmap.bmWidth; - CurIconObject->Size.cy = bmp->bitmap.bmHeight; + CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx; + CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy; BITMAPOBJ_UnlockBitmap(CurIconObject->IconInfo.hbmColor); } else @@ -438,8 +416,8 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect) if(CurIconObject->IconInfo.hbmMask && (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask))) { - CurIconObject->Size.cx = bmp->bitmap.bmWidth; - CurIconObject->Size.cy = bmp->bitmap.bmHeight / 2; + CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx; + CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy / 2; BITMAPOBJ_UnlockBitmap(CurIconObject->IconInfo.hbmMask); } } @@ -494,8 +472,8 @@ NtUserGetCursorIconInfo( RtlCopyMemory(&ii, &CurIconObject->IconInfo, sizeof(ICONINFO)); /* Copy bitmaps */ - ii.hbmMask = IntCopyBitmap(ii.hbmMask); - ii.hbmColor = IntCopyBitmap(ii.hbmColor); + ii.hbmMask = BITMAPOBJ_CopyBitmap(ii.hbmMask); + ii.hbmColor = BITMAPOBJ_CopyBitmap(ii.hbmColor); /* Copy fields */ Status = MmCopyToCaller(IconInfo, &ii, sizeof(ICONINFO)); @@ -563,8 +541,8 @@ NtUserGetCursorIconSize( if(!bmp) goto done; - SafeSize.cx = bmp->bitmap.bmWidth; - SafeSize.cy = bmp->bitmap.bmHeight; + SafeSize.cx = bmp->SurfObj.sizlBitmap.cx; + SafeSize.cy = bmp->SurfObj.sizlBitmap.cy; Status = MmCopyToCaller(Size, &SafeSize, sizeof(SIZE)); if(NT_SUCCESS(Status)) Ret = TRUE; @@ -943,8 +921,8 @@ NtUserSetCursorIconContents( bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor); if(bmp) { - CurIconObject->Size.cx = bmp->bitmap.bmWidth; - CurIconObject->Size.cy = bmp->bitmap.bmHeight; + CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx; + CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy; BITMAPOBJ_UnlockBitmap(CurIconObject->IconInfo.hbmColor); } else @@ -953,8 +931,8 @@ NtUserSetCursorIconContents( if(!bmp) goto done; - CurIconObject->Size.cx = bmp->bitmap.bmWidth; - CurIconObject->Size.cy = bmp->bitmap.bmHeight / 2; + CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx; + CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy / 2; BITMAPOBJ_UnlockBitmap(CurIconObject->IconInfo.hbmMask); } diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 23f235984df..9b32c7ab2b5 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.141 2004/06/29 21:09:16 gvg Exp $ +/* $Id: dc.c,v 1.142 2004/07/03 13:55:36 navaraf Exp $ * * DC.C - Device context functions * @@ -129,7 +129,6 @@ NtGdiCreateCompatableDC(HDC hDC) HBITMAP hBitmap; HDC hNewDC, DisplayDC; HRGN hVisRgn; - BITMAPOBJ *pb; UNICODE_STRING DriverName; DisplayDC = NULL; @@ -206,9 +205,6 @@ NtGdiCreateCompatableDC(HDC hDC) NewDC->w.hBitmap = hBitmap; NewDC->w.hFirstBitmap = hBitmap; NewDC->GDIDevice = OrigDC->GDIDevice; - pb = BITMAPOBJ_LockBitmap(hBitmap); - NewDC->Surface = (HSURF)BitmapToSurf(pb, NewDC->GDIDevice); - BITMAPOBJ_UnlockBitmap(hBitmap); NewDC->w.hPalette = OrigDC->w.hPalette; NewDC->w.textColor = OrigDC->w.textColor; @@ -462,7 +458,7 @@ IntCreatePrimarySurface() PGD_ENABLEDRIVER GDEnableDriver; DRVENABLEDATA DED; SURFOBJ *SurfObj; - PSURFGDI SurfGDI; + SIZEL SurfSize; UNICODE_STRING DriverFileNames; PWSTR CurrentName; BOOL GotDriver; @@ -474,7 +470,6 @@ IntCreatePrimarySurface() DPRINT("Trying to load display driver no. %d\n", DisplayNumber); RtlZeroMemory(&PrimarySurface, sizeof(PrimarySurface)); - ExInitializeFastMutex(&PrimarySurface.DriverLock); PrimarySurface.VideoFileObject = DRIVER_FindMPDriver(DisplayNumber); @@ -650,13 +645,11 @@ IntCreatePrimarySurface() continue; } - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) PrimarySurface.Handle); + SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); SurfObj->dhpdev = PrimarySurface.PDev; - SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); - IntShowDesktop( - IntGetActiveDesktop(), - SurfGDI->SurfObj.sizlBitmap.cx, - SurfGDI->SurfObj.sizlBitmap.cy); + SurfSize = SurfObj->sizlBitmap; + EngUnlockSurface(SurfObj); + IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy); break; } @@ -666,19 +659,13 @@ IntCreatePrimarySurface() VOID FASTCALL IntDestroyPrimarySurface() { -#if 0 - SURFOBJ *SurfObj; - PSURFGDI SurfGDI; -#endif - DRIVER_UnreferenceDriver(L"DISPLAY"); -#if 0 - DPRINT("Hiding mouse pointer\n" ); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) PrimarySurface.Handle); - SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(SurfObj); - SurfGDI->SetPointerShape(SurfObj, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0); -#endif + /* + * FIXME: Hide a mouse pointer there. Also because we have to prevent + * memory leaks with the Eng* mouse routines. + */ + DPRINT("Reseting display\n" ); PrimarySurface.DriverFunctions.AssertMode(PrimarySurface.PDev, FALSE); PrimarySurface.DriverFunctions.DisableSurface(PrimarySurface.PDev); @@ -698,7 +685,7 @@ IntGdiCreateDC(PUNICODE_STRING Driver, HDC hNewDC; PDC NewDC; HDC hDC = NULL; - PSURFGDI SurfGDI; + SURFOBJ *SurfObj; HRGN hVisRgn; UNICODE_STRING StdDriver; @@ -740,9 +727,9 @@ IntGdiCreateDC(PUNICODE_STRING Driver, memcpy(NewDC->FillPatternSurfaces, PrimarySurface.FillPatterns, sizeof(NewDC->FillPatternSurfaces)); NewDC->PDev = PrimarySurface.PDev; - NewDC->Surface = PrimarySurface.Handle; NewDC->GDIDevice = (HDEV)&PrimarySurface; NewDC->DriverFunctions = PrimarySurface.DriverFunctions; + NewDC->w.hBitmap = PrimarySurface.Handle; NewDC->DMW.dmSize = sizeof(NewDC->DMW); NewDC->DMW.dmFields = 0x000fc000; @@ -750,14 +737,14 @@ IntGdiCreateDC(PUNICODE_STRING Driver, /* FIXME: get mode selection information from somewhere */ NewDC->DMW.dmLogPixels = 96; - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); - NewDC->DMW.dmBitsPerPel = SurfGDI->BitsPerPixel; - NewDC->DMW.dmPelsWidth = SurfGDI->SurfObj.sizlBitmap.cx; - NewDC->DMW.dmPelsHeight = SurfGDI->SurfObj.sizlBitmap.cy; + SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); + NewDC->DMW.dmBitsPerPel = BitsPerFormat(SurfObj->iBitmapFormat); + NewDC->DMW.dmPelsWidth = SurfObj->sizlBitmap.cx; + NewDC->DMW.dmPelsHeight = SurfObj->sizlBitmap.cy; NewDC->DMW.dmDisplayFlags = 0; NewDC->DMW.dmDisplayFrequency = 0; - NewDC->w.bitsPerPixel = SurfGDI->BitsPerPixel; // FIXME: set this here?? + NewDC->w.bitsPerPixel = NewDC->DMW.dmBitsPerPel; // FIXME: set this here?? NewDC->w.hPalette = NewDC->DevInfo->hpalDefault; @@ -765,8 +752,8 @@ IntGdiCreateDC(PUNICODE_STRING Driver, DC_UnlockDc( hNewDC ); - hVisRgn = NtGdiCreateRectRgn(0, 0, SurfGDI->SurfObj.sizlBitmap.cx, - SurfGDI->SurfObj.sizlBitmap.cy); + hVisRgn = NtGdiCreateRectRgn(0, 0, SurfObj->sizlBitmap.cx, + SurfObj->sizlBitmap.cy); NtGdiSelectVisRgn(hNewDC, hVisRgn); NtGdiDeleteObject(hVisRgn); @@ -776,6 +763,8 @@ IntGdiCreateDC(PUNICODE_STRING Driver, NtGdiSetTextAlign(hNewDC, TA_TOP); NtGdiSetBkColor(hNewDC, RGB(255, 255, 255)); NtGdiSetBkMode(hNewDC, OPAQUE); + + EngUnlockSurface(SurfObj); return hNewDC; } @@ -878,7 +867,6 @@ NtGdiDeleteDC(HDC DCHandle) DC_LockDC (DCHandle); NtGdiSelectObject does not recognize stock objects yet */ if (DCToDelete->w.flags & DC_MEMORY) { - EngDeleteSurface (DCToDelete->Surface); NtGdiDeleteObject (DCToDelete->w.hFirstBitmap); } } @@ -1644,7 +1632,10 @@ NtGdiRestoreDC(HDC hDC, INT SaveLevel) SaveLevel = dc->saveLevel; if ((SaveLevel < 1) || (SaveLevel > dc->saveLevel)) + { + DC_UnlockDc(hDC); return FALSE; + } success = TRUE; while (dc->saveLevel >= SaveLevel) @@ -1654,6 +1645,7 @@ NtGdiRestoreDC(HDC hDC, INT SaveLevel) dcs = DC_LockDc (hdcs); if (dcs == NULL) { + DC_UnlockDc(hDC); return FALSE; } DC_SetNextDC (dcs, DC_GetNextDC (dcs)); @@ -1888,9 +1880,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) objOrg = (HGDIOBJ)dc->w.hBitmap; /* Release the old bitmap, lock the new one and convert it to a SURF */ - EngDeleteSurface(dc->Surface); dc->w.hBitmap = hGDIObj; - dc->Surface = (HSURF)BitmapToSurf(pb, dc->GDIDevice); // if we're working with a DIB, get the palette [fixme: only create if the selected palette is null] if(pb->dib) @@ -1914,7 +1904,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) } else { - dc->w.bitsPerPixel = pb->bitmap.bmBitsPixel; + dc->w.bitsPerPixel = BitsPerFormat(pb->SurfObj.iBitmapFormat); if (1 == dc->w.bitsPerPixel) { MonoColorMap[0] = RGB(0, 0, 0); @@ -1928,7 +1918,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) } DC_UnlockDc ( hDC ); - hVisRgn = NtGdiCreateRectRgn ( 0, 0, pb->bitmap.bmWidth, pb->bitmap.bmHeight ); + hVisRgn = NtGdiCreateRectRgn ( 0, 0, pb->SurfObj.sizlBitmap.cx, pb->SurfObj.sizlBitmap.cy ); NtGdiSelectVisRgn ( hDC, hVisRgn ); NtGdiDeleteObject ( hVisRgn ); BITMAPOBJ_UnlockBitmap(hGDIObj); @@ -2175,13 +2165,13 @@ DC_SetOwnership(HDC hDC, PEPROCESS Owner) } BOOL FASTCALL -IntIsPrimarySurface(PSURFGDI SurfGDI) +IntIsPrimarySurface(SURFOBJ *SurfObj) { if (PrimarySurface.Handle == NULL) { return FALSE; } - return SurfGDI == (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle) ? TRUE : FALSE; + return SurfObj->hsurf == PrimarySurface.Handle; } /* diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 1abf6123dbf..dc770e87006 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.55 2004/06/29 21:09:16 gvg Exp $ + * $Id: dib.c,v 1.56 2004/07/03 13:55:36 navaraf Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -119,11 +119,10 @@ IntSetDIBits( UINT ColorUse) { BITMAPOBJ *bitmap; - HBITMAP SourceBitmap, DestBitmap; + HBITMAP SourceBitmap; INT result = 0; BOOL copyBitsResult; SURFOBJ *DestSurf, *SourceSurf; - PSURFGDI DestGDI; SIZEL SourceSize; POINTL ZeroPoint; RECTL DestRect; @@ -146,11 +145,7 @@ IntSetDIBits( //else // lpRGB = &bmi->bmiColors[0]; - // Create a temporary surface for the destination bitmap - DestBitmap = BitmapToSurf(bitmap, DC->GDIDevice); - - DestSurf = (SURFOBJ*) AccessUserObject( (ULONG)DestBitmap ); - DestGDI = (PSURFGDI) AccessInternalObjectFromUserObject( DestSurf ); + DestSurf = &bitmap->SurfObj; // Create source surface SourceSize.cx = bmi->bmiHeader.biWidth; @@ -164,14 +159,14 @@ IntSetDIBits( BitmapFormat(bmi->bmiHeader.biBitCount, bmi->bmiHeader.biCompression), 0 < bmi->bmiHeader.biHeight ? 0 : BMF_TOPDOWN, (PVOID) Bits); - SourceSurf = (SURFOBJ*)AccessUserObject((ULONG)SourceBitmap); + SourceSurf = EngLockSurface((HSURF)SourceBitmap); // Destination palette obtained from the hDC hDCPalette = PALETTE_LockPalette(DC->DevInfo->hpalDefault); if (NULL == hDCPalette) { + EngUnlockSurface(SourceSurf); EngDeleteSurface((HSURF)SourceBitmap); - EngDeleteSurface((HSURF)DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; @@ -184,8 +179,8 @@ IntSetDIBits( DIB_Palette = BuildDIBPalette ( (PBITMAPINFO)bmi, (PINT)&DIB_Palette_Type ); if (NULL == DIB_Palette) { + EngUnlockSurface(SourceSurf); EngDeleteSurface((HSURF)SourceBitmap); - EngDeleteSurface((HSURF)DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return 0; @@ -196,8 +191,8 @@ IntSetDIBits( if (NULL == XlateObj) { PALETTE_FreePalette(DIB_Palette); + EngUnlockSurface(SourceSurf); EngDeleteSurface((HSURF)SourceBitmap); - EngDeleteSurface((HSURF)DestBitmap); BITMAPOBJ_UnlockBitmap(hBitmap); SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return 0; @@ -224,8 +219,8 @@ IntSetDIBits( // Clean up EngDeleteXlate(XlateObj); PALETTE_FreePalette(DIB_Palette); + EngUnlockSurface(SourceSurf); EngDeleteSurface((HSURF)SourceBitmap); - EngDeleteSurface((HSURF)DestBitmap); // if (ColorUse == DIB_PAL_COLORS) // WinFree((LPSTR)lpRGB); @@ -282,491 +277,175 @@ NtGdiSetDIBitsToDevice( return 0; } -// Converts a device-dependent bitmap to a DIB -#if 0 -INT STDCALL NtGdiGetDIBits(HDC hDC, - HBITMAP hBitmap, - UINT StartScan, - UINT ScanLines, - LPVOID Bits, - LPBITMAPINFO UnsafeInfo, - UINT Usage) -#else -INT STDCALL NtGdiGetDIBits( - HDC hdc, /* [in] Handle to device context */ - HBITMAP hbitmap, /* [in] Handle to bitmap */ - UINT startscan, /* [in] First scan line to set in dest bitmap */ - UINT lines, /* [in] Number of scan lines to copy */ - LPVOID bits, /* [out] Address of array for bitmap bits */ - BITMAPINFO * info, /* [out] Address of structure with bitmap data */ - UINT coloruse) /* [in] RGB or palette index */ -#endif +/* Converts a device-dependent bitmap to a DIB */ +INT STDCALL +NtGdiGetDIBits(HDC hDC, + HBITMAP hBitmap, + UINT StartScan, + UINT ScanLines, + LPVOID Bits, + LPBITMAPINFO Info, + UINT Usage) { -#if 0 - BITMAPINFO Info; - BITMAPCOREHEADER *Core; - PBITMAPOBJ BitmapObj; - INT Result; - NTSTATUS Status; - PDC DCObj; - PPALGDI PalGdi; - struct - { - BITMAPINFO Info; - DWORD BitFields[3]; - } InfoWithBitFields; - DWORD *BitField; - DWORD InfoSize; + BITMAPOBJ *BitmapObj; + SURFOBJ *DestSurfObj; + XLATEOBJ *XlateObj; + HBITMAP DestBitmap; + SIZEL DestSize; + HPALETTE hSourcePalette; + HPALETTE hDestPalette; + PPALGDI SourcePalette; + PPALGDI DestPalette; + ULONG SourcePaletteType; + ULONG DestPaletteType; + PDC Dc; + POINTL SourcePoint; + RECTL DestRect; + ULONG Result = 0; + ULONG Index; - BitmapObj = BITMAPOBJ_LockBitmap(hBitmap); - if (NULL == BitmapObj) - { + /* Get handle for the palette in DC. */ + Dc = DC_LockDc(hDC); + if (Dc == NULL) + { SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; - } + } + hSourcePalette = Dc->w.hPalette; + /* FIXME: This is incorrect. hDestPalette should be something other. */ + hDestPalette = Dc->DevInfo->hpalDefault; + DC_UnlockDc(hDC); - RtlZeroMemory(&Info, sizeof(BITMAPINFO)); - Status = MmCopyFromCaller(&(Info.bmiHeader.biSize), - &(UnsafeInfo->bmiHeader.biSize), - sizeof(DWORD)); - if (! NT_SUCCESS(Status)) - { - SetLastNtError(Status); - BITMAPOBJ_UnlockBitmap(hBitmap); - return 0; - } - - /* If the bits are not requested, UnsafeInfo can point to either a - BITMAPINFOHEADER or a BITMAPCOREHEADER */ - if (sizeof(BITMAPINFOHEADER) != Info.bmiHeader.biSize && - (sizeof(BITMAPCOREHEADER) != Info.bmiHeader.biSize || - NULL != Bits)) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - BITMAPOBJ_UnlockBitmap(hBitmap); + /* Get pointer to the source bitmap object. */ + BitmapObj = BITMAPOBJ_LockBitmap(hBitmap); + if (BitmapObj == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; - } + } - Status = MmCopyFromCaller(&(Info.bmiHeader), - &(UnsafeInfo->bmiHeader), - Info.bmiHeader.biSize); - if (! NT_SUCCESS(Status)) - { - SetLastNtError(Status); - BITMAPOBJ_UnlockBitmap(hBitmap); - return 0; - } - - if (NULL == Bits) - { - if (sizeof(BITMAPINFOHEADER) == Info.bmiHeader.biSize) - { - if (0 != Info.bmiHeader.biBitCount) - { - DPRINT("NtGdiGetDIBits(): This operation isn't fully implemented yet."); - /*UNIMPLEMENTED;*/ - } - - Info.bmiHeader.biWidth = BitmapObj->bitmap.bmWidth; - Info.bmiHeader.biHeight = BitmapObj->bitmap.bmHeight; - Info.bmiHeader.biPlanes = BitmapObj->bitmap.bmPlanes; - Info.bmiHeader.biBitCount = BitmapObj->bitmap.bmBitsPixel; - Info.bmiHeader.biCompression = BI_RGB; - Info.bmiHeader.biSizeImage = BitmapObj->bitmap.bmHeight * BitmapObj->bitmap.bmWidthBytes; - } - else - { - Core = (BITMAPCOREHEADER *)(&Info.bmiHeader); - if (0 != Core->bcBitCount) - { - UNIMPLEMENTED; - } - - Core->bcWidth = BitmapObj->bitmap.bmWidth; - Core->bcHeight = BitmapObj->bitmap.bmHeight; - Core->bcPlanes = BitmapObj->bitmap.bmPlanes; - Core->bcBitCount = BitmapObj->bitmap.bmBitsPixel; - } - - Status = MmCopyToCaller(UnsafeInfo, &Info, Info.bmiHeader.biSize); - if (! NT_SUCCESS(Status)) - { - SetLastNtError(Status); - BITMAPOBJ_UnlockBitmap(hBitmap); - return 0; - } - Result = 1; - } - else if (0 == StartScan && Info.bmiHeader.biHeight == (LONG) (StartScan + ScanLines) && - Info.bmiHeader.biWidth == BitmapObj->bitmap.bmWidth && - Info.bmiHeader.biHeight == BitmapObj->bitmap.bmHeight && - Info.bmiHeader.biPlanes == BitmapObj->bitmap.bmPlanes && - Info.bmiHeader.biBitCount == BitmapObj->bitmap.bmBitsPixel && - 8 < Info.bmiHeader.biBitCount) - { - Info.bmiHeader.biSizeImage = BitmapObj->bitmap.bmHeight * BitmapObj->bitmap.bmWidthBytes; - Status = MmCopyToCaller(Bits, BitmapObj->bitmap.bmBits, Info.bmiHeader.biSizeImage); - if (! NT_SUCCESS(Status)) - { - SetLastNtError(Status); - BITMAPOBJ_UnlockBitmap(hBitmap); - return 0; - } - RtlZeroMemory(&InfoWithBitFields, sizeof(InfoWithBitFields)); - RtlCopyMemory(&(InfoWithBitFields.Info), &Info, sizeof(BITMAPINFO)); - if (BI_BITFIELDS == Info.bmiHeader.biCompression) - { - DCObj = DC_LockDc(hDC); - if (NULL == DCObj) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - BITMAPOBJ_UnlockBitmap(hBitmap); - return 0; - } - PalGdi = PALETTE_LockPalette(DCObj->w.hPalette); - BitField = (DWORD *) ((char *) &InfoWithBitFields + InfoWithBitFields.Info.bmiHeader.biSize); - BitField[0] = PalGdi->RedMask; - BitField[1] = PalGdi->GreenMask; - BitField[2] = PalGdi->BlueMask; - PALETTE_UnlockPalette(DCObj->w.hPalette); - InfoSize = InfoWithBitFields.Info.bmiHeader.biSize + 3 * sizeof(DWORD); - DC_UnlockDc(hDC); - } - else - { - InfoSize = Info.bmiHeader.biSize; - } - Status = MmCopyToCaller(UnsafeInfo, &InfoWithBitFields, InfoSize); - if (! NT_SUCCESS(Status)) - { - SetLastNtError(Status); - BITMAPOBJ_UnlockBitmap(hBitmap); - return 0; - } - } - else - { - UNIMPLEMENTED; - } - - BITMAPOBJ_UnlockBitmap(hBitmap); - - return Result; -#else - PDC dc; - PBITMAPOBJ bmp; - int i; - - if (!info) return 0; - if (!(dc = DC_LockDc( hdc ))) return 0; - if (!(bmp = BITMAPOBJ_LockBitmap(hbitmap))) - { - DC_UnlockDc( hdc ); - return 0; - } - - /* Transfer color info */ - - if (info->bmiHeader.biBitCount <= 8 && info->bmiHeader.biBitCount > 0 ) { - - info->bmiHeader.biClrUsed = 0; - - /* If the bitmap object already has a dib section at the - same color depth then get the color map from it */ - if (bmp->dib && bmp->dib->dsBm.bmBitsPixel == info->bmiHeader.biBitCount) { - NtGdiGetDIBColorTable(hdc, 0, 1 << info->bmiHeader.biBitCount, info->bmiColors); - } - else { - if(info->bmiHeader.biBitCount >= bmp->bitmap.bmBitsPixel) { - /* Generate the color map from the selected palette */ - PALETTEENTRY * palEntry; - PPALGDI palette; - if (!(palette = PALETTE_LockPalette(dc->w.hPalette))) { - DC_UnlockDc( hdc ); - BITMAPOBJ_UnlockBitmap( hbitmap ); - return 0; - } - palEntry = palette->IndexedColors; - for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++, palEntry++) { - if (coloruse == DIB_RGB_COLORS) { - info->bmiColors[i].rgbRed = palEntry->peRed; - info->bmiColors[i].rgbGreen = palEntry->peGreen; - info->bmiColors[i].rgbBlue = palEntry->peBlue; - info->bmiColors[i].rgbReserved = 0; - } - else ((WORD *)info->bmiColors)[i] = (WORD)i; - } - PALETTE_UnlockPalette( dc->w.hPalette ); - } else { - switch (info->bmiHeader.biBitCount) { - case 1: - info->bmiColors[0].rgbRed = info->bmiColors[0].rgbGreen = - info->bmiColors[0].rgbBlue = 0; - info->bmiColors[0].rgbReserved = 0; - info->bmiColors[1].rgbRed = info->bmiColors[1].rgbGreen = - info->bmiColors[1].rgbBlue = 0xff; - info->bmiColors[1].rgbReserved = 0; - break; - - case 4: - memcpy(info->bmiColors, COLOR_GetSystemPaletteTemplate(), NB_RESERVED_COLORS * sizeof(PALETTEENTRY)); - break; - - case 8: - { - INT r, g, b; - RGBQUAD *color; - - memcpy(info->bmiColors, COLOR_GetSystemPaletteTemplate(), - 10 * sizeof(RGBQUAD)); - memcpy(info->bmiColors + 246, COLOR_GetSystemPaletteTemplate() + 10, - 10 * sizeof(RGBQUAD)); - color = info->bmiColors + 10; - for(r = 0; r <= 5; r++) /* FIXME */ - for(g = 0; g <= 5; g++) - for(b = 0; b <= 5; b++) { - color->rgbRed = (r * 0xff) / 5; - color->rgbGreen = (g * 0xff) / 5; - color->rgbBlue = (b * 0xff) / 5; - color->rgbReserved = 0; - color++; - } - } - } - } - } - } - - if (bits && lines) - { - /* If the bitmap object already have a dib section that contains image data, get the bits from it */ - if(bmp->dib && bmp->dib->dsBm.bmBitsPixel >= 15 && info->bmiHeader.biBitCount >= 15) - { - /*FIXME: Only RGB dibs supported for now */ - unsigned int srcwidth = bmp->dib->dsBm.bmWidth, srcwidthb = bmp->dib->dsBm.bmWidthBytes; - int dstwidthb = DIB_GetDIBWidthBytes( info->bmiHeader.biWidth, info->bmiHeader.biBitCount ); - LPBYTE dbits = bits, sbits = (LPBYTE) bmp->dib->dsBm.bmBits + (startscan * srcwidthb); - unsigned int x, y; - - if ((info->bmiHeader.biHeight < 0) ^ (bmp->dib->dsBmih.biHeight < 0)) + if (Bits == NULL) + { + if (Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER) || + Info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) + { + Info->bmiHeader.biWidth = BitmapObj->SurfObj.sizlBitmap.cx; + Info->bmiHeader.biHeight = BitmapObj->SurfObj.sizlBitmap.cy; + /* Report negtive height for top-down bitmaps. */ + if (BitmapObj->SurfObj.lDelta > 0) + Info->bmiHeader.biHeight = -Info->bmiHeader.biHeight; + Info->bmiHeader.biPlanes = 1; + Info->bmiHeader.biBitCount = BitsPerFormat(BitmapObj->SurfObj.iBitmapFormat); + if (Info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) + { + switch (BitmapObj->SurfObj.iBitmapFormat) { - dbits = (LPBYTE)bits + (dstwidthb * (lines-1)); - dstwidthb = -dstwidthb; + case BMF_1BPP: case BMF_4BPP: case BMF_8BPP: + case BMF_16BPP: case BMF_24BPP: case BMF_32BPP: + Info->bmiHeader.biCompression = BI_RGB; + break; + case BMF_4RLE: + Info->bmiHeader.biCompression = BI_RLE4; + break; + case BMF_8RLE: + Info->bmiHeader.biCompression = BI_RLE8; + break; + case BMF_JPEG: + Info->bmiHeader.biCompression = BI_JPEG; + break; + case BMF_PNG: + Info->bmiHeader.biCompression = BI_PNG; + break; } + Info->bmiHeader.biSizeImage = BitmapObj->SurfObj.cjBits; + Info->bmiHeader.biXPelsPerMeter = 0; /* FIXME */ + Info->bmiHeader.biYPelsPerMeter = 0; /* FIXME */ + Info->bmiHeader.biClrUsed = + Info->bmiHeader.biClrImportant = 1 << Info->bmiHeader.biBitCount; /* FIXME */ + Result = BitmapObj->SurfObj.sizlBitmap.cy; + } + } + } + else + { + if (StartScan > BitmapObj->SurfObj.sizlBitmap.cy) + { + Result = 0; + } + else + { + ScanLines = min(ScanLines, BitmapObj->SurfObj.sizlBitmap.cy - StartScan); + DestSize.cx = BitmapObj->SurfObj.sizlBitmap.cx; + DestSize.cy = ScanLines; + DestBitmap = EngCreateBitmap( + DestSize, BitmapObj->SurfObj.lDelta, + BitmapFormat(Info->bmiHeader.biBitCount, Info->bmiHeader.biCompression), + 0 < Info->bmiHeader.biHeight ? 0 : BMF_TOPDOWN, + Bits); + DestSurfObj = EngLockSurface((HSURF)DestBitmap); - switch( info->bmiHeader.biBitCount ) { + SourcePalette = PALETTE_LockPalette(hSourcePalette); + ASSERT(SourcePalette); + SourcePaletteType = SourcePalette->Mode; + PALETTE_UnlockPalette(hSourcePalette); - case 15: - case 16: /* 16 bpp dstDIB */ - { - LPWORD dstbits = (LPWORD)dbits; - WORD rmask = 0x7c00, gmask= 0x03e0, bmask = 0x001f; - - /* FIXME: BI_BITFIELDS not supported yet */ - - switch(bmp->dib->dsBm.bmBitsPixel) { - - case 16: /* 16 bpp srcDIB -> 16 bpp dstDIB */ - { - /* FIXME: BI_BITFIELDS not supported yet */ - for (y = 0; y < lines; y++, dbits+=dstwidthb, sbits+=srcwidthb) - memcpy(dbits, sbits, srcwidthb); - } - break; - - case 24: /* 24 bpp srcDIB -> 16 bpp dstDIB */ - { - LPBYTE srcbits = sbits; - - for( y = 0; y < lines; y++) { - for( x = 0; x < srcwidth; x++, srcbits += 3) - *dstbits++ = ((srcbits[0] >> 3) & bmask) | - (((WORD)srcbits[1] << 2) & gmask) | - (((WORD)srcbits[2] << 7) & rmask); - - dstbits = (LPWORD)(dbits+=dstwidthb); - srcbits = (sbits += srcwidthb); - } - } - break; - - case 32: /* 32 bpp srcDIB -> 16 bpp dstDIB */ - { - LPDWORD srcbits = (LPDWORD)sbits; - DWORD val; - - for( y = 0; y < lines; y++) { - for( x = 0; x < srcwidth; x++ ) { - val = *srcbits++; - *dstbits++ = (WORD)(((val >> 3) & bmask) | ((val >> 6) & gmask) | - ((val >> 9) & rmask)); - } - dstbits = (LPWORD)(dbits+=dstwidthb); - srcbits = (LPDWORD)(sbits+=srcwidthb); - } - } - break; - - default: /* ? bit bmp -> 16 bit DIB */ - DPRINT1("FIXME: 15/16 bit DIB %d bit bitmap\n", - bmp->bitmap.bmBitsPixel); - break; - } - } - break; - - case 24: /* 24 bpp dstDIB */ - { - LPBYTE dstbits = dbits; - - switch(bmp->dib->dsBm.bmBitsPixel) { - - case 16: /* 16 bpp srcDIB -> 24 bpp dstDIB */ - { - LPWORD srcbits = (LPWORD)sbits; - WORD val; - - /* FIXME: BI_BITFIELDS not supported yet */ - for( y = 0; y < lines; y++) { - for( x = 0; x < srcwidth; x++ ) { - val = *srcbits++; - *dstbits++ = (BYTE)(((val << 3) & 0xf8) | ((val >> 2) & 0x07)); - *dstbits++ = (BYTE)(((val >> 2) & 0xf8) | ((val >> 7) & 0x07)); - *dstbits++ = (BYTE)(((val >> 7) & 0xf8) | ((val >> 12) & 0x07)); - } - dstbits = (LPBYTE)(dbits+=dstwidthb); - srcbits = (LPWORD)(sbits+=srcwidthb); - } - } - break; - - case 24: /* 24 bpp srcDIB -> 24 bpp dstDIB */ - { - for (y = 0; y < lines; y++, dbits+=dstwidthb, sbits+=srcwidthb) - memcpy(dbits, sbits, srcwidthb); - } - break; - - case 32: /* 32 bpp srcDIB -> 24 bpp dstDIB */ - { - LPBYTE srcbits = (LPBYTE)sbits; - - for( y = 0; y < lines; y++) { - for( x = 0; x < srcwidth; x++, srcbits++ ) { - *dstbits++ = *srcbits++; - *dstbits++ = *srcbits++; - *dstbits++ = *srcbits++; - } - dstbits=(LPBYTE)(dbits+=dstwidthb); - srcbits = (LPBYTE)(sbits+=srcwidthb); - } - } - break; - - default: /* ? bit bmp -> 24 bit DIB */ - DPRINT1("FIXME: 24 bit DIB %d bit bitmap\n", - bmp->bitmap.bmBitsPixel); - break; - } - } - break; - - case 32: /* 32 bpp dstDIB */ - { - LPDWORD dstbits = (LPDWORD)dbits; - - /* FIXME: BI_BITFIELDS not supported yet */ - - switch(bmp->dib->dsBm.bmBitsPixel) { - case 16: /* 16 bpp srcDIB -> 32 bpp dstDIB */ - { - LPWORD srcbits = (LPWORD)sbits; - DWORD val; - - /* FIXME: BI_BITFIELDS not supported yet */ - for( y = 0; y < lines; y++) { - for( x = 0; x < srcwidth; x++ ) { - val = (DWORD)*srcbits++; - *dstbits++ = ((val << 3) & 0xf8) | ((val >> 2) & 0x07) | - ((val << 6) & 0xf800) | ((val << 1) & 0x0700) | - ((val << 9) & 0xf80000) | ((val << 4) & 0x070000); - } - dstbits=(LPDWORD)(dbits+=dstwidthb); - srcbits=(LPWORD)(sbits+=srcwidthb); - } - } - break; - - case 24: /* 24 bpp srcDIB -> 32 bpp dstDIB */ - { - LPBYTE srcbits = sbits; - - for( y = 0; y < lines; y++) { - for( x = 0; x < srcwidth; x++, srcbits+=3 ) - *dstbits++ = ((DWORD)*srcbits) & 0x00ffffff; - dstbits=(LPDWORD)(dbits+=dstwidthb); - srcbits=(sbits+=srcwidthb); - } - } - break; - - case 32: /* 32 bpp srcDIB -> 16 bpp dstDIB */ - { - /* FIXME: BI_BITFIELDS not supported yet */ - for (y = 0; y < lines; y++, dbits+=dstwidthb, sbits+=srcwidthb) - memcpy(dbits, sbits, srcwidthb); - } - break; - - default: /* ? bit bmp -> 32 bit DIB */ - DPRINT1("FIXME: 32 bit DIB %d bit bitmap\n", - bmp->bitmap.bmBitsPixel); - break; - } - } - break; - - default: /* ? bit DIB */ - DPRINT1("FIXME: Unsupported DIB depth %d\n", info->bmiHeader.biBitCount); - break; + DestPalette = PALETTE_LockPalette(hDestPalette); + ASSERT(DestPalette); + DestPaletteType = DestPalette->Mode; + + /* Copy palette. */ + /* FIXME: This is largely incomplete. */ + if (Info->bmiHeader.biBitCount <= 8) + { + if (Usage == DIB_RGB_COLORS) + { + for (Index = 0; + Index < (1 << Info->bmiHeader.biBitCount) && + Index < DestPalette->NumColors; + Index++) + { + Info->bmiColors[Index].rgbRed = + DestPalette->IndexedColors[Index].peRed; + Info->bmiColors[Index].rgbGreen = + DestPalette->IndexedColors[Index].peGreen; + Info->bmiColors[Index].rgbBlue = + DestPalette->IndexedColors[Index].peBlue; + } } - } - /* Otherwise, get bits from the XImage */ - else - { - UNIMPLEMENTED; - } - } - else if( info->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) - { - /* fill in struct members */ + if (Usage == DIB_PAL_COLORS) + { + DbgPrint("GetDIBits with DIB_PAL_COLORS isn't implemented yet."); + } + } - if( info->bmiHeader.biBitCount == 0) - { - info->bmiHeader.biWidth = bmp->bitmap.bmWidth; - info->bmiHeader.biHeight = bmp->bitmap.bmHeight; - info->bmiHeader.biPlanes = 1; - info->bmiHeader.biBitCount = bmp->bitmap.bmBitsPixel; - info->bmiHeader.biSizeImage = - DIB_GetDIBImageBytes( bmp->bitmap.bmWidth, - bmp->bitmap.bmHeight, - bmp->bitmap.bmBitsPixel ); - info->bmiHeader.biCompression = 0; - } - else - { - info->bmiHeader.biSizeImage = DIB_GetDIBImageBytes( - info->bmiHeader.biWidth, - info->bmiHeader.biHeight, - info->bmiHeader.biBitCount ); - } - } + PALETTE_UnlockPalette(hDestPalette); - DC_UnlockDc( hdc ); - BITMAPOBJ_UnlockBitmap( hbitmap ); + XlateObj = IntEngCreateXlate( + DestPaletteType, SourcePaletteType, hDestPalette, hSourcePalette); + + SourcePoint.x = 0; + SourcePoint.y = StartScan; - return lines; -#endif + /* Determine destination rectangle */ + DestRect.top = 0; + DestRect.left = 0; + DestRect.right = DestSize.cx; + DestRect.bottom = DestSize.cy; + + if (EngCopyBits(DestSurfObj, &BitmapObj->SurfObj, + NULL, XlateObj, &DestRect, &SourcePoint)) + { + Result = ScanLines; + } + + EngDeleteXlate(XlateObj); + EngUnlockSurface(DestSurfObj); + } + } + + BITMAPOBJ_UnlockBitmap(hBitmap); + + return Result; } INT STDCALL NtGdiStretchDIBits(HDC hDC, @@ -847,7 +526,9 @@ LONG STDCALL NtGdiGetBitmapBits(HBITMAP hBitmap, /* If the bits vector is null, the function should return the read size */ if (Bits == NULL) { - return bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight; + ret = bmp->SurfObj.cjBits; + BITMAPOBJ_UnlockBitmap (hBitmap); + return ret; } if (Count < 0) @@ -857,21 +538,23 @@ LONG STDCALL NtGdiGetBitmapBits(HBITMAP hBitmap, } /* Only get entire lines */ - height = Count / bmp->bitmap.bmWidthBytes; - if (height > bmp->bitmap.bmHeight) + height = Count / abs(bmp->SurfObj.lDelta); + if (height > bmp->SurfObj.sizlBitmap.cy) { - height = bmp->bitmap.bmHeight; + height = bmp->SurfObj.sizlBitmap.cy; } - Count = height * bmp->bitmap.bmWidthBytes; + Count = height * abs(bmp->SurfObj.lDelta); if (Count == 0) { DPRINT("Less then one entire line requested\n"); + BITMAPOBJ_UnlockBitmap (hBitmap); return 0; } DPRINT("(%08x, %ld, %p) %dx%d %d colors fetched height: %ld\n", - hBitmap, Count, Bits, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, - 1 << bmp->bitmap.bmBitsPixel, height ); + hBitmap, Count, Bits, bmp->SurfObj.sizlBitmap.cx, + bmp->SurfObj.sizlBitmap.cy, + 1 << BitsPerFormat(bmp->SurfObj.iBitmapFormat), height ); #if 0 /* FIXME: Call DDI CopyBits here if available */ if(bmp->DDBitmap) @@ -891,18 +574,12 @@ LONG STDCALL NtGdiGetBitmapBits(HBITMAP hBitmap, else #endif { - if(!bmp->bitmap.bmBits) - { - DPRINT ("Bitmap is empty\n"); - ret = 0; - } - else - { - memcpy(Bits, bmp->bitmap.bmBits, Count); - ret = Count; - } + memcpy(Bits, bmp->SurfObj.pvBits, Count); + ret = Count; } + BITMAPOBJ_UnlockBitmap (hBitmap); + return ret; } @@ -919,7 +596,6 @@ IntCreateDIBitmap(PDC Dc, const BITMAPINFOHEADER *header, WORD compr; if (DIB_GetBitmapInfo( header, &width, &height, &bpp, &compr ) == -1) return 0; - if (height < 0) height = -height; // Check if we should create a monochrome or color bitmap. We create a monochrome bitmap only if it has exactly 2 // colors, which are black followed by white, nothing else. In all other cases, we create a color bitmap. @@ -975,6 +651,9 @@ IntCreateDIBitmap(PDC Dc, const BITMAPINFOHEADER *header, handle = NtGdiCreateBitmap( width, height, 1, 1, NULL); } + if (height < 0) + height = -height; + if (NULL != handle && CBM_INIT == init) { IntSetDIBits(Dc, handle, 0, height, bits, data, coloruse); @@ -1053,6 +732,7 @@ DIB_CreateDIBSection( ULONG totalSize; UINT Entries = 0; BITMAP bm; + SIZEL Size; DPRINT("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, @@ -1074,9 +754,12 @@ DIB_CreateDIBSection( ? bi->biSizeImage : (ULONG) (bm.bmWidthBytes * effHeight); if (section) + { /* bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS, 0L, offset, totalSize); */ DbgPrint("DIB_CreateDIBSection: Cannot yet handle section DIBs\n"); + return 0; + } else if (ovr_pitch && offset) bm.bmBits = (LPVOID) offset; else { @@ -1084,8 +767,6 @@ DIB_CreateDIBSection( bm.bmBits = EngAllocUserMem(totalSize, 0); } -/* bm.bmBits = ExAllocatePool(PagedPool, totalSize); */ - if(usage == DIB_PAL_COLORS) memcpy(bmi->bmiColors, (UINT *)DIB_MapPaletteColors(dc, bmi), sizeof(UINT *)); @@ -1133,7 +814,13 @@ DIB_CreateDIBSection( // Create Device Dependent Bitmap and add DIB pointer if (dib) { - res = IntCreateDIBitmap(dc, bi, 0, NULL, bmi, usage); + Size.cx = bm.bmWidth; + Size.cy = bm.bmHeight; + res = IntCreateBitmap(Size, bm.bmWidthBytes, + BitmapFormat(bi->biBitCount * bi->biPlanes, bi->biCompression), + BMF_DONTCACHE | BMF_USERMEM | BMF_NOZEROINIT | + (bi->biHeight > 0 ? 0 : BMF_TOPDOWN), + bm.bmBits); if (! res) { return NULL; @@ -1145,9 +832,6 @@ DIB_CreateDIBSection( return NULL; } bmp->dib = (DIBSECTION *) dib; - /* Install user-mode bits instead of kernel-mode bits */ - ExFreePool(bmp->bitmap.bmBits); - bmp->bitmap.bmBits = bm.bmBits; /* WINE NOTE: WINE makes use of a colormap, which is a color translation table between the DIB and the X physical device. Obviously, this is left out of the ReactOS implementation. Instead, we call diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index fc64b19f183..e5f530da0a5 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.c @@ -16,26 +16,26 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: fillshap.c,v 1.50 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: fillshap.c,v 1.51 2004/07/03 13:55:36 navaraf Exp $ */ #include /* * a couple macros to fill a single pixel or a line */ -#define PUTPIXEL(x,y,brushObj) \ - ret = ret && IntEngLineTo(SurfObj, \ - dc->CombinedClip, \ - &brushObj->BrushObject, \ - x, y, (x)+1, y, \ - &RectBounds, \ +#define PUTPIXEL(x,y,brushObj) \ + ret = ret && IntEngLineTo(BitmapObj, \ + dc->CombinedClip, \ + &brushObj->BrushObject, \ + x, y, (x)+1, y, \ + &RectBounds, \ dc->w.ROPmode); #define PUTLINE(x1,y1,x2,y2,brushObj) \ - ret = ret && IntEngLineTo(SurfObj, \ - dc->CombinedClip, \ - &brushObj->BrushObject, \ - x1, y1, x2, y2, \ - &RectBounds, \ + ret = ret && IntEngLineTo(BitmapObj, \ + dc->CombinedClip, \ + &brushObj->BrushObject, \ + x1, y1, x2, y2, \ + &RectBounds, \ dc->w.ROPmode); BOOL FASTCALL @@ -43,7 +43,7 @@ IntGdiPolygon(PDC dc, PPOINT UnsafePoints, int Count) { - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; PGDIBRUSHOBJ PenBrushObj, FillBrushObj; BOOL ret = FALSE; // default to failure RECTL DestRect; @@ -57,8 +57,8 @@ IntGdiPolygon(PDC dc, return FALSE; } - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); - ASSERT(SurfObj); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); /* Convert to screen coordinates */ for (CurrentPoint = 0; CurrentPoint < Count; CurrentPoint++) @@ -84,14 +84,12 @@ IntGdiPolygon(PDC dc, DestRect.bottom = max(DestRect.bottom, UnsafePoints[CurrentPoint].y); } -#if 1 /* Now fill the polygon with the current brush. */ FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); ASSERT(FillBrushObj); if (!(FillBrushObj->flAttrs & GDIBRUSH_IS_NULL)) - ret = FillPolygon ( dc, SurfObj, &FillBrushObj->BrushObject, dc->w.ROPmode, UnsafePoints, Count, DestRect ); + ret = FillPolygon ( dc, BitmapObj, &FillBrushObj->BrushObject, dc->w.ROPmode, UnsafePoints, Count, DestRect ); BRUSHOBJ_UnlockBrush(dc->w.hBrush); -#endif /* get BRUSHOBJ from current pen. */ PenBrushObj = PENOBJ_LockPen(dc->w.hPen); @@ -114,7 +112,7 @@ IntGdiPolygon(PDC dc, To = UnsafePoints[CurrentPoint + 1]; //DPRINT("Polygon Making line from (%d,%d) to (%d,%d)\n", From.x, From.y, To.x, To.y ); - ret = IntEngLineTo(SurfObj, + ret = IntEngLineTo(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, From.x, @@ -125,16 +123,9 @@ IntGdiPolygon(PDC dc, dc->w.ROPmode); /* MIX */ } } -#if 0 - /* Now fill the polygon with the current brush. */ - FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); - ASSERT(FillBrushObj); - if ( FillBrushObj->logbrush.lbStyle != BS_NULL ) - ret = FillPolygon ( dc, SurfObj, FillBrushObj, dc->w.ROPmode, UnsafePoints, Count, DestRect ); - BRUSHOBJ_UnlockBrush(dc->w.hBrush); -#endif } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); PENOBJ_UnlockPen( dc->w.hPen ); return ret; @@ -215,7 +206,7 @@ NtGdiEllipse( int RadiusX, RadiusY; int Temp; PGDIBRUSHOBJ FillBrush, PenBrush; - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; RECTL RectBounds; PDC dc; BOOL ret = TRUE, Cond1, Cond2; @@ -258,7 +249,8 @@ NtGdiEllipse( return FALSE; } - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); nLeftRect += dc->w.DCOrgX; nRightRect += dc->w.DCOrgX - 1; @@ -377,6 +369,7 @@ NtGdiEllipse( } } while (B > A); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); BRUSHOBJ_UnlockBrush(dc->w.hBrush); PENOBJ_UnlockPen(dc->w.hPen); DC_UnlockDc(hDC); @@ -927,12 +920,13 @@ IntRectangle(PDC dc, int RightRect, int BottomRect) { - SURFOBJ *SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); + BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); PGDIBRUSHOBJ PenBrushObj, FillBrushObj; BOOL ret = FALSE; // default to failure RECTL DestRect; ASSERT ( dc ); // caller's responsibility to set this up + ASSERT ( BitmapObj ); if ( PATH_IsPathOpen(dc->w.path) ) { @@ -956,7 +950,7 @@ IntRectangle(PDC dc, { if (!(FillBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { - ret = IntEngBitBlt(SurfObj, + ret = IntEngBitBlt(BitmapObj, NULL, NULL, dc->CombinedClip, @@ -977,6 +971,7 @@ IntRectangle(PDC dc, if (PenBrushObj == NULL) { SetLastWin32Error(ERROR_INVALID_HANDLE); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); return FALSE; } @@ -986,28 +981,28 @@ IntRectangle(PDC dc, if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { - ret = ret && IntEngLineTo(SurfObj, + ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, LeftRect, TopRect, RightRect, TopRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX - ret = ret && IntEngLineTo(SurfObj, + ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, RightRect, TopRect, RightRect, BottomRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX - ret = ret && IntEngLineTo(SurfObj, + ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, RightRect, BottomRect, LeftRect, BottomRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX - ret = ret && IntEngLineTo(SurfObj, + ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, LeftRect, BottomRect, LeftRect, TopRect, @@ -1018,6 +1013,8 @@ IntRectangle(PDC dc, PENOBJ_UnlockPen(dc->w.hPen); } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + /* Move current position in DC? MSDN: The current position is neither used nor updated by Rectangle. */ @@ -1060,7 +1057,7 @@ IntRoundRect( int xCurveDiameter, int yCurveDiameter) { - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; PGDIBRUSHOBJ PenBrushObj, FillBrushObj; RECTL RectBounds; int i, col, row, width, height, x1, x1start, x2, x2start, y1, y2; @@ -1092,7 +1089,8 @@ IntRoundRect( RectBounds.top = top; RectBounds.bottom = bottom; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); ASSERT(FillBrushObj); @@ -1287,6 +1285,7 @@ IntRoundRect( PUTLINE ( left, y2, left, y1, PenBrushObj ); } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); PENOBJ_UnlockPen(dc->w.hPen); BRUSHOBJ_UnlockBrush(dc->w.hBrush); @@ -1331,7 +1330,7 @@ IntGdiGradientFill( ULONG uMesh, ULONG ulMode) { - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; PPALGDI PalDestGDI; XLATEOBJ *XlateObj; RECTL Extent; @@ -1392,8 +1391,8 @@ IntGdiGradientFill( Extent.top += DitherOrg.y; Extent.bottom += DitherOrg.y; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); - ASSERT(SurfObj); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); ASSERT(PalDestGDI); @@ -1403,7 +1402,7 @@ IntGdiGradientFill( XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); ASSERT(XlateObj); - Ret = IntEngGradientFill(SurfObj, + Ret = IntEngGradientFill(BitmapObj, dc->CombinedClip, XlateObj, pVertex, @@ -1414,6 +1413,7 @@ IntGdiGradientFill( &DitherOrg, ulMode); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); EngDeleteXlate(XlateObj); return Ret; diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 3d1c2fcf06f..0627c3ecbbb 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -19,7 +19,7 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.68 2004/06/20 00:45:37 navaraf Exp $ + * $Id: gdiobj.c,v 1.69 2004/07/03 13:55:36 navaraf Exp $ * */ #include @@ -710,10 +710,10 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) if (! ExTryToAcquireFastMutex(&ObjHdr->Lock)) { DPRINT1("Caution! GDIOBJ_LockObj trying to lock object 0x%x second time\n", hObj); - DPRINT1(" called from: %s:%i\n", file, line); + DPRINT1(" called from: %s:%i (thread %x)\n", file, line, KeGetCurrentThread()); if (NULL != ObjHdr->lockfile) { - DPRINT1(" previously locked from: %s:%i\n", ObjHdr->lockfile, ObjHdr->lockline); + DPRINT1(" previously locked from: %s:%i (thread %x)\n", ObjHdr->lockfile, ObjHdr->lockline, ObjHdr->Lock.Owner); } ExAcquireFastMutex(&ObjHdr->Lock); DPRINT1(" Disregard previous message about object 0x%x, it's ok\n", hObj); diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 4f2f5bb9dcf..ca7bcc5be27 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: line.c,v 1.33 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: line.c,v 1.34 2004/07/03 13:55:37 navaraf Exp $ */ #include // Some code from the WINE project source (www.winehq.com) @@ -51,18 +51,11 @@ IntGdiLineTo(DC *dc, int XEnd, int YEnd) { - SURFOBJ *SurfObj; - BOOL Ret; + BITMAPOBJ *BitmapObj; + BOOL Ret; PGDIBRUSHOBJ PenBrushObj; - RECTL Bounds; - POINT Points[2]; - - SurfObj = (SURFOBJ*)AccessUserObject ( (ULONG)dc->Surface ); - if (NULL == SurfObj) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } + RECTL Bounds; + POINT Points[2]; if (PATH_IsPathOpen(dc->w.path)) { @@ -77,6 +70,13 @@ IntGdiLineTo(DC *dc, } else { + BitmapObj = BITMAPOBJ_LockBitmap ( dc->w.hBitmap ); + if (NULL == BitmapObj) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + Points[0].x = dc->w.CursPosX; Points[0].y = dc->w.CursPosY; Points[1].x = XEnd; @@ -101,7 +101,7 @@ IntGdiLineTo(DC *dc, if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { - Ret = IntEngLineTo(SurfObj, + Ret = IntEngLineTo(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, Points[0].x, Points[0].y, @@ -110,6 +110,7 @@ IntGdiLineTo(DC *dc, dc->w.ROPmode); } + BITMAPOBJ_UnlockBitmap ( dc->w.hBitmap ); PENOBJ_UnlockPen( dc->w.hPen ); } @@ -187,18 +188,18 @@ IntGdiPolyline(DC *dc, LPPOINT pt, int Count) { - SURFOBJ *SurfObj = NULL; + BITMAPOBJ *BitmapObj; BOOL ret = FALSE; // default to failure LONG i; PGDIBRUSHOBJ PenBrushObj; POINT *pts; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); - ASSERT(SurfObj); - if ( PATH_IsPathOpen ( dc->w.path ) ) return PATH_Polyline ( dc, pt, Count ); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); + //Allocate "Count" bytes of memory to hold a safe copy of pt pts = (POINT*)ExAllocatePoolWithTag ( PagedPool, sizeof(POINT)*Count, TAG_SHAPE ); if ( pts ) @@ -220,7 +221,7 @@ IntGdiPolyline(DC *dc, if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { //get IntEngPolyline to do the drawing. - ret = IntEngPolyline(SurfObj, + ret = IntEngPolyline(BitmapObj, dc->CombinedClip, &PenBrushObj->BrushObject, pts, @@ -234,6 +235,8 @@ IntGdiPolyline(DC *dc, ExFreePool ( pts ); } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + return ret; } diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c deleted file mode 100644 index 442d7bfc1ca..00000000000 --- a/reactos/subsys/win32k/objects/objconv.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ReactOS W32 Subsystem - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team - * - * 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. - */ -/* $Id: objconv.c,v 1.20 2004/06/24 19:43:49 gvg Exp $ */ -#include - -HBITMAP FASTCALL BitmapToSurf(PBITMAPOBJ BitmapObj, HDEV GDIDevice) -{ - HBITMAP BitmapHandle; - SIZE Size; - - ASSERT ( BitmapObj ); - Size.cx = BitmapObj->bitmap.bmWidth; - Size.cy = BitmapObj->bitmap.bmHeight; - if (NULL != BitmapObj->dib) - { - BitmapHandle = EngCreateBitmap(Size, BitmapObj->dib->dsBm.bmWidthBytes, - BitmapFormat(BitmapObj->dib->dsBm.bmBitsPixel, BI_RGB), - BitmapObj->dib->dsBmih.biHeight < 0 ? BMF_TOPDOWN : 0, - BitmapObj->dib->dsBm.bmBits); - } - else - { - BitmapHandle = EngCreateBitmap(Size, BitmapObj->bitmap.bmWidthBytes, - BitmapFormat(BitmapObj->bitmap.bmBitsPixel, BI_RGB), - BMF_TOPDOWN, BitmapObj->bitmap.bmBits); - } - if (NULL != BitmapHandle && NULL != GDIDevice) - { - EngAssociateSurface((HSURF)BitmapHandle, GDIDevice, 0); - } - - return BitmapHandle; -} - -/* EOF */ diff --git a/reactos/subsys/win32k/objects/polyfill.c b/reactos/subsys/win32k/objects/polyfill.c index dffd73f1c5e..d2ee59c5b42 100644 --- a/reactos/subsys/win32k/objects/polyfill.c +++ b/reactos/subsys/win32k/objects/polyfill.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: polyfill.c,v 1.14 2004/05/10 17:07:20 weiden Exp $ +/* $Id: polyfill.c,v 1.15 2004/07/03 13:55:37 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -396,7 +396,7 @@ POLYGONFILL_FillScanLineAlternate( PDC dc, int ScanLine, FILL_EDGE* ActiveHead, - SURFOBJ *SurfObj, + BITMAPOBJ *BitmapObj, BRUSHOBJ *BrushObj, MIX RopMode ) { @@ -422,7 +422,7 @@ POLYGONFILL_FillScanLineAlternate( BoundRect.right = x2; //DPRINT("Fill Line (%d, %d) to (%d, %d)\n",x1, ScanLine, x2, ScanLine); - IntEngLineTo( SurfObj, + IntEngLineTo( BitmapObj, dc->CombinedClip, BrushObj, x1, @@ -444,7 +444,7 @@ POLYGONFILL_FillScanLineWinding( PDC dc, int ScanLine, FILL_EDGE* ActiveHead, - SURFOBJ *SurfObj, + BITMAPOBJ *BitmapObj, BRUSHOBJ *BrushObj, MIX RopMode ) { @@ -495,7 +495,7 @@ POLYGONFILL_FillScanLineWinding( BoundRect.right = x2; //DPRINT("Fill Line (%d, %d) to (%d, %d)\n",x1, ScanLine, x2, ScanLine); - IntEngLineTo( SurfObj, + IntEngLineTo( BitmapObj, dc->CombinedClip, BrushObj, x1, @@ -518,7 +518,7 @@ POLYGONFILL_FillScanLineWinding( BoundRect.right = x2; //DPRINT("Fill Line (%d, %d) to (%d, %d)\n",x1, ScanLine, x2, ScanLine); - IntEngLineTo( SurfObj, + IntEngLineTo( BitmapObj, dc->CombinedClip, BrushObj, x1, @@ -542,7 +542,7 @@ BOOL STDCALL FillPolygon( PDC dc, - SURFOBJ *SurfObj, + BITMAPOBJ *BitmapObj, BRUSHOBJ *BrushObj, MIX RopMode, CONST PPOINT Points, @@ -559,7 +559,7 @@ FillPolygon( PDC dc, int ScanLine, FILL_EDGE* ActiveHead, - SURFOBJ *SurfObj, + BITMAPOBJ *BitmapObj, BRUSHOBJ *BrushObj, MIX RopMode ); @@ -583,7 +583,7 @@ FillPolygon( { POLYGONFILL_BuildActiveList(ScanLine, list, &ActiveHead); //DEBUG_PRINT_ACTIVE_EDGELIST(ActiveHead); - FillScanLine ( dc, ScanLine, ActiveHead, SurfObj, BrushObj, RopMode ); + FillScanLine ( dc, ScanLine, ActiveHead, BitmapObj, BrushObj, RopMode ); } /* Free Edge List. If any are left. */ diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index f5f9521360b..6f13519655a 100644 --- a/reactos/subsys/win32k/objects/print.c +++ b/reactos/subsys/win32k/objects/print.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: print.c,v 1.18 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: print.c,v 1.19 2004/07/03 13:55:37 navaraf Exp $ */ #include INT @@ -75,12 +75,13 @@ IntGdiExtEscape( INT OutSize, LPSTR OutData) { - SURFOBJ *Surface = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); + BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + INT Result; if ( NULL == dc->DriverFunctions.Escape ) { - return IntEngExtEscape( - Surface, + Result = IntEngExtEscape( + &BitmapObj->SurfObj, Escape, InSize, (PVOID)InData, @@ -89,14 +90,17 @@ IntGdiExtEscape( } else { - return dc->DriverFunctions.Escape( - Surface, + Result = dc->DriverFunctions.Escape( + &BitmapObj->SurfObj, Escape, InSize, (PVOID)InData, OutSize, (PVOID)OutData ); } + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + + return Result; } INT diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 6dd6ec4baeb..d19dc086b93 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -113,14 +113,10 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -/* $Id: region.c,v 1.59 2004/06/29 06:08:54 navaraf Exp $ */ +/* $Id: region.c,v 1.60 2004/07/03 13:55:37 navaraf Exp $ */ #include #include -BOOL STDCALL -IntEngPaint(IN SURFOBJ *Surface,IN CLIPOBJ *ClipRegion,IN BRUSHOBJ *Brush,IN POINTL *BrushOrigin, - IN MIX Mix); - // Internal Functions #define EMPTY_REGION(pReg) { \ @@ -2407,7 +2403,7 @@ NtGdiPaintRgn(HDC hDC, BOOL bRet = FALSE; PGDIBRUSHOBJ pBrush; POINTL BrushOrigin; - SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; if( !dc ) return FALSE; @@ -2444,14 +2440,15 @@ NtGdiPaintRgn(HDC hDC, ASSERT(pBrush); BrushOrigin.x = dc->w.brushOrgX; BrushOrigin.y = dc->w.brushOrgY; - SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); - bRet = IntEngPaint(SurfObj, + bRet = IntEngPaint(BitmapObj, ClipRegion, &pBrush->BrushObject, &BrushOrigin, 0xFFFF);//FIXME:don't know what to put here + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); RGNDATA_UnlockRgn( tmpVisRgn ); // Fill the region diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index c0515c2637c..29cd537776d 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.100 2004/06/27 11:23:57 navaraf Exp $ */ +/* $Id: text.c,v 1.101 2004/07/03 13:55:37 navaraf Exp $ */ #include #include @@ -382,8 +382,8 @@ IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) FontGDI->TextMetric.tmDescent = (32 - Face->size->metrics.descender) >> 6; /* units below baseline */ FontGDI->TextMetric.tmHeight = FontGDI->TextMetric.tmAscent + FontGDI->TextMetric.tmDescent; - DPRINT("Font loaded: %s (%s)\n", face->family_name, face->style_name); - DPRINT("Num glyphs: %u\n", face->num_glyphs); + DPRINT("Font loaded: %s (%s)\n", Face->family_name, Face->style_name); + DPRINT("Num glyphs: %u\n", Face->num_glyphs); /* Add this font resource to the font table */ @@ -412,21 +412,14 @@ IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) BOOL FASTCALL IntIsFontRenderingEnabled(VOID) { - BOOL Ret; - HDC hDC; - PDC dc; - SURFOBJ *SurfObj; - Ret = RenderingEnabled; - hDC = IntGetScreenDC(); - if(hDC) - { - dc = DC_LockDc(hDC); - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); - if(SurfObj) - Ret = (SurfObj->iBitmapFormat >= BMF_8BPP); - DC_UnlockDc(hDC); - } - return Ret; + BOOL Ret = RenderingEnabled; + HDC hDC; + + hDC = IntGetScreenDC(); + if (hDC) + Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && RenderingEnabled; + + return Ret; } VOID FASTCALL @@ -1522,6 +1515,7 @@ NtGdiExtTextOut( DC *dc; SURFOBJ *SurfObj; + BITMAPOBJ *BitmapObj; int error, glyph_index, n, i; FT_Face face; FT_GlyphSlot glyph; @@ -1571,7 +1565,9 @@ NtGdiExtTextOut( } } - SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface); + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); + SurfObj = &BitmapObj->SurfObj; Start.x = XStart; Start.y = YStart; IntLPtoDP(dc, &Start, 1); @@ -1621,7 +1617,7 @@ NtGdiExtTextOut( DestRect.right += dc->w.DCOrgX; DestRect.bottom += dc->w.DCOrgY; IntEngBitBlt( - SurfObj, + BitmapObj, NULL, NULL, dc->CombinedClip, @@ -1835,7 +1831,7 @@ NtGdiExtTextOut( DestRect.top = TextTop + yoff - ((face->size->metrics.ascender + 32) >> 6); DestRect.bottom = TextTop + yoff + ((32 - face->size->metrics.descender) >> 6); IntEngBitBlt( - SurfObj, + BitmapObj, NULL, NULL, dc->CombinedClip, @@ -1866,7 +1862,7 @@ NtGdiExtTextOut( */ HSourceGlyph = EngCreateBitmap(bitSize, pitch, (glyph->bitmap.pixel_mode == ft_pixel_mode_grays) ? BMF_8BPP : BMF_1BPP, BMF_TOPDOWN, glyph->bitmap.buffer); - SourceGlyphSurf = (SURFOBJ*)AccessUserObject((ULONG) HSourceGlyph); + SourceGlyphSurf = EngLockSurface((HSURF)HSourceGlyph); /* * Use the font data as a mask to paint onto the DCs surface using a @@ -1885,6 +1881,7 @@ NtGdiExtTextOut( &BrushFg->BrushObject, &BrushOrigin); + EngUnlockSurface(SourceGlyphSurf); EngDeleteSurface((HSURF)HSourceGlyph); if (NULL == Dx) @@ -1902,6 +1899,7 @@ NtGdiExtTextOut( EngDeleteXlate(XlateObj); EngDeleteXlate(XlateObj2); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); TEXTOBJ_UnlockText(dc->w.hFont); if (hBrushBg != NULL) { @@ -1920,6 +1918,7 @@ NtGdiExtTextOut( fail: TEXTOBJ_UnlockText(dc->w.hFont); + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); if (hBrushBg != NULL) { BRUSHOBJ_UnlockBrush(hBrushBg); diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h index 13630062753..3d4caad4497 100644 --- a/reactos/subsys/win32k/w32k.h +++ b/reactos/subsys/win32k/w32k.h @@ -74,7 +74,6 @@ #include #include #include -#include #include diff --git a/reactos/subsys/win32k/win32k.edf b/reactos/subsys/win32k/win32k.edf index 489b4e3cb3c..09615817b47 100644 --- a/reactos/subsys/win32k/win32k.edf +++ b/reactos/subsys/win32k/win32k.edf @@ -1,4 +1,4 @@ -; $Id: win32k.edf,v 1.22 2004/03/07 12:49:27 dwelch Exp $ +; $Id: win32k.edf,v 1.23 2004/07/03 13:55:36 navaraf Exp $ ; ; win32k.def ; @@ -52,7 +52,7 @@ EngFindResource=EngFindResource@16 EngFreeMem=EngFreeMem@4 EngFreeModule=EngFreeModule@4 EngFreeUserMem=EngFreeUserMem@4 -EngGetCurrentCodePage=EngGetCurrentCodePage@8 +EngGetCurrentCodePage=ntoskrnl.RtlGetCurrentCodePage EngGetCurrentProcessId=EngGetCurrentProcessId@0 EngGetCurrentThreadId=EngGetCurrentThreadId@0 EngGetDriverName=EngGetDriverName@4 @@ -79,7 +79,7 @@ EngMarkBandingSurface=EngMarkBandingSurface@4 EngModifySurface=EngModifySurface@32 EngMovePointer=EngMovePointer@16 EngMulDiv=EngMulDiv@12 -EngMultiByteToUnicodeN=EngMultiByteToUnicodeN@20 +EngMultiByteToUnicodeN=ntoskrnl.RtlMultiByteToUnicodeN EngMultiByteToWideChar=EngMultiByteToWideChar@20 EngPaint=EngPaint@20 EngProbeForRead=NTOSKRNL.ProbeForRead @@ -104,7 +104,7 @@ EngStrokeAndFillPath=EngStrokeAndFillPath@40 EngStrokePath=EngStrokePath@32 EngTextOut=EngTextOut@40 EngTransparentBlt=EngTransparentBlt@32 -EngUnicodeToMultiByteN=EngUnicodeToMultiByteN@20 +EngUnicodeToMultiByteN=ntoskrnl.RtlUnicodeToMultiByteN EngUnloadImage=EngUnloadImage@4 EngUnlockDriverObj=EngUnlockDriverObj@4 EngUnlockSurface=EngUnlockSurface@4 From 60d9c7030d9df9cc25ef48a6f4c94fbd87eac7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 3 Jul 2004 14:46:39 +0000 Subject: [PATCH 176/356] Remove debugging statement svn path=/trunk/; revision=9978 --- reactos/lib/advapi32/reg/reg.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index fcd890716f4..6599c2563d1 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.48 2004/07/02 21:20:51 gvg Exp $ +/* $Id: reg.c,v 1.49 2004/07/03 14:46:39 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -1729,7 +1729,6 @@ RegOpenKeyA (HKEY hKey, LONG ErrorCode; NTSTATUS Status; -DPRINT1("RegOpenKeyA hKey 0x%x subkey %s\n", hKey, lpSubKey); Status = MapDefaultKey (&KeyHandle, hKey); if (!NT_SUCCESS(Status)) From 9a64b810797fa50a5c87ea922e982ea46915590b Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 3 Jul 2004 17:13:09 +0000 Subject: [PATCH 177/356] - Allowed multiple calls to CsrClientConnectToServer. - Removed CsrIsCsrss. svn path=/trunk/; revision=9979 --- reactos/include/ntdll/csr.h | 4 +--- reactos/lib/ntdll/csr/lpc.c | 13 +++---------- reactos/lib/ntdll/def/ntdll.def | 3 +-- reactos/lib/ntdll/def/ntdll.edf | 3 +-- 4 files changed, 6 insertions(+), 17 deletions(-) diff --git a/reactos/include/ntdll/csr.h b/reactos/include/ntdll/csr.h index 00603b6dfe0..57d05cebcbf 100644 --- a/reactos/include/ntdll/csr.h +++ b/reactos/include/ntdll/csr.h @@ -1,4 +1,4 @@ -/* $Id: csr.h,v 1.8 2003/12/02 11:38:46 gvg Exp $ +/* $Id: csr.h,v 1.9 2004/07/03 17:13:09 hbirr Exp $ * */ @@ -33,8 +33,6 @@ CsrCaptureParameterBuffer(PVOID ParameterBuffer, NTSTATUS STDCALL CsrReleaseParameterBuffer(PVOID ClientAddress); -VOID STDCALL CsrIsCsrss(VOID); - #endif /* __INCLUDE_NTDLL_CSR_H */ /* EOF */ diff --git a/reactos/lib/ntdll/csr/lpc.c b/reactos/lib/ntdll/csr/lpc.c index 8894aa0774f..dfe442f88cc 100644 --- a/reactos/lib/ntdll/csr/lpc.c +++ b/reactos/lib/ntdll/csr/lpc.c @@ -1,4 +1,4 @@ -/* $Id: lpc.c,v 1.12 2003/12/02 11:38:46 gvg Exp $ +/* $Id: lpc.c,v 1.13 2004/07/03 17:13:09 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,8 +30,6 @@ static PVOID CsrSectionMapBase = NULL; static PVOID CsrSectionMapServerBase = NULL; static HANDLE CsrCommHeap = NULL; -static BOOL IsCsrss = FALSE; - #define CSR_CONTROL_HEAP_SIZE (65536) /* FUNCTIONS *****************************************************************/ @@ -128,7 +126,7 @@ CsrClientConnectToServer(VOID) HANDLE CsrSectionHandle; LARGE_INTEGER CsrSectionViewSize; - if (IsCsrss) + if (WindowsApiPort != INVALID_HANDLE_VALUE) { return STATUS_SUCCESS; } @@ -161,6 +159,7 @@ CsrClientConnectToServer(VOID) &ConnectInfoLength); if (!NT_SUCCESS(Status)) { + WindowsApiPort = INVALID_HANDLE_VALUE; return(Status); } @@ -196,10 +195,4 @@ CsrClientConnectToServer(VOID) return(STATUS_SUCCESS); } -void STDCALL -CsrIsCsrss() -{ - IsCsrss = TRUE; -} - /* EOF */ diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 376a3486cdc..ab3eb203f25 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.122 2004/06/27 12:21:14 ekohl Exp $ +; $Id: ntdll.def,v 1.123 2004/07/03 17:13:09 hbirr Exp $ ; ; ReactOS Operating System ; @@ -17,7 +17,6 @@ CsrClientCallServer@16 CsrClientConnectToServer@0 CsrFreeCaptureBuffer@4 CsrIdentifyAlertableThread@0 -CsrIsCsrss@0 CsrNewThread@0 CsrProbeForRead@12 CsrProbeForWrite@12 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index c21b6a89cf4..a3cb299df88 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.112 2004/06/27 12:21:14 ekohl Exp $ +; $Id: ntdll.edf,v 1.113 2004/07/03 17:13:09 hbirr Exp $ ; ; ReactOS Operating System ; @@ -17,7 +17,6 @@ CsrClientCallServer=CsrClientCallServer@16 CsrClientConnectToServer=CsrClientConnectToServer@0 CsrFreeCaptureBuffer=CsrFreeCaptureBuffer@4 CsrIdentifyAlertableThread=CsrIdentifyAlertableThread@0 -CsrIsCsrss=CsrIsCsrss@0 CsrNewThread=CsrNewThread@0 CsrProbeForRead=CsrProbeForRead@12 CsrProbeForWrite=CsrProbeForWrite@12 From c973b907c8bf9dce1ddd97469f754284159a1ec2 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 3 Jul 2004 17:15:02 +0000 Subject: [PATCH 178/356] - Try to get or to allocate the process data structure in ServerApiPortThread. - Changed the initialization sequence in CsrServerInitialization. svn path=/trunk/; revision=9980 --- reactos/subsys/csrss/api/wapi.c | 56 ++++++++++++++++++++---------- reactos/subsys/csrss/include/api.h | 5 +-- reactos/subsys/csrss/init.c | 24 +++++++------ 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/reactos/subsys/csrss/api/wapi.c b/reactos/subsys/csrss/api/wapi.c index f4ec9c88333..68c65c28c14 100644 --- a/reactos/subsys/csrss/api/wapi.c +++ b/reactos/subsys/csrss/api/wapi.c @@ -1,4 +1,4 @@ -/* $Id: wapi.c,v 1.36 2004/06/27 12:21:32 weiden Exp $ +/* $Id: wapi.c,v 1.37 2004/07/03 17:15:02 hbirr Exp $ * * reactos/subsys/csrss/api/wapi.c * @@ -97,8 +97,8 @@ CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData, } } -static void -Thread_Api2(HANDLE ServerPort) +static void STDCALL +ClientConnectionThread(HANDLE ServerPort) { NTSTATUS Status; LPC_MAX_MESSAGE LpcReply; @@ -118,26 +118,31 @@ Thread_Api2(HANDLE ServerPort) if (! NT_SUCCESS(Status)) { DPRINT1("CSR: NtReplyWaitReceivePort failed\n"); - NtClose(ServerPort); - RtlRosExitUserThread(Status); - continue; + break; } if (LpcRequest.Header.MessageType == LPC_PORT_CLOSED) { CsrFreeProcessData( (ULONG)LpcRequest.Header.ClientId.UniqueProcess ); - NtClose(ServerPort); - RtlRosExitUserThread(STATUS_SUCCESS); - continue; + break; } Request = (PCSRSS_API_REQUEST)&LpcRequest; Reply = (PCSRSS_API_REPLY)&LpcReply; ProcessData = CsrGetProcessData((ULONG)LpcRequest.Header.ClientId.UniqueProcess); + if (ProcessData == NULL) + { + DPRINT1("CSR: Message %d: Unable to find data for process %d\n", + LpcRequest.Header.MessageType, (ULONG)LpcRequest.Header.ClientId.UniqueProcess); + break; + } + CsrApiCallHandler(ProcessData, Request, Reply); } + NtClose(ServerPort); + RtlRosExitUserThread(STATUS_SUCCESS); } /********************************************************************** @@ -148,7 +153,8 @@ Thread_Api2(HANDLE ServerPort) * Handle connection requests from clients to the port * "\Windows\ApiPort". */ -void Thread_Api(PVOID PortHandle) +void STDCALL +ServerApiPortThead(PVOID PortHandle) { NTSTATUS Status; LPC_MAX_MESSAGE Request; @@ -161,14 +167,14 @@ void Thread_Api(PVOID PortHandle) for (;;) { LPC_SECTION_READ LpcRead; + ServerPort = NULL; Status = NtListenPort(PortHandle, &Request.Header); if (!NT_SUCCESS(Status)) { DPRINT1("CSR: NtListenPort() failed\n"); - NtTerminateThread(NtCurrentThread(), Status); + break; } - Status = NtAcceptConnectPort(&ServerPort, PortHandle, NULL, @@ -178,10 +184,19 @@ void Thread_Api(PVOID PortHandle) if (!NT_SUCCESS(Status)) { DPRINT1("CSR: NtAcceptConnectPort() failed\n"); - NtTerminateThread(NtCurrentThread(), Status); + break; } - ProcessData = CsrGetProcessData((ULONG)Request.Header.ClientId.UniqueProcess); + ProcessData = CsrCreateProcessData((ULONG)Request.Header.ClientId.UniqueProcess); + if (ProcessData == NULL) + { + DPRINT1("Unable to allocate or find data for process %d\n", + (ULONG)Request.Header.ClientId.UniqueProcess); + Status = STATUS_UNSUCCESSFUL; + break; + } + + ProcessData->CsrSectionViewBase = LpcRead.ViewBase; ProcessData->CsrSectionViewSize = LpcRead.ViewSize; @@ -189,7 +204,7 @@ void Thread_Api(PVOID PortHandle) if (!NT_SUCCESS(Status)) { DPRINT1("CSR: NtCompleteConnectPort() failed\n"); - NtTerminateThread(NtCurrentThread(), Status); + break; } Status = RtlCreateUserThread(NtCurrentProcess(), @@ -198,18 +213,23 @@ void Thread_Api(PVOID PortHandle) 0, NULL, NULL, - (PTHREAD_START_ROUTINE)Thread_Api2, + (PTHREAD_START_ROUTINE)ClientConnectionThread, ServerPort, &ServerThread, NULL); if (!NT_SUCCESS(Status)) { DPRINT1("CSR: Unable to create server thread\n"); - NtClose(ServerPort); - NtTerminateThread(NtCurrentThread(), Status); + break; } NtClose(ServerThread); } + if (ServerPort) + { + NtClose(ServerPort); + } + NtClose(PortHandle); + NtTerminateThread(NtCurrentThread(), Status); } /* EOF */ diff --git a/reactos/subsys/csrss/include/api.h b/reactos/subsys/csrss/include/api.h index 7358c39dd3b..5aa8f6f3090 100644 --- a/reactos/subsys/csrss/include/api.h +++ b/reactos/subsys/csrss/include/api.h @@ -1,4 +1,4 @@ -/* $Id: api.h,v 1.4 2004/01/11 17:31:15 gvg Exp $ +/* $Id: api.h,v 1.5 2004/07/03 17:15:02 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -96,7 +96,7 @@ NTSTATUS FASTCALL CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions VOID FASTCALL CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply); -VOID Thread_Api(PVOID PortHandle); +VOID STDCALL ServerApiPortThead(PVOID PortHandle); VOID Console_Api( DWORD Ignored ); extern HANDLE CsrssApiHeap; @@ -107,6 +107,7 @@ VOID STDCALL CsrInitConsoleSupport(VOID); /* api/process.c */ VOID STDCALL CsrInitProcessData(VOID); PCSRSS_PROCESS_DATA STDCALL CsrGetProcessData(ULONG ProcessId); +PCSRSS_PROCESS_DATA STDCALL CsrCreateProcessData(ULONG ProcessId); NTSTATUS STDCALL CsrFreeProcessData( ULONG Pid ); /* api/handle.c */ diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index c232a896f77..220e88383b0 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.27 2004/05/28 21:33:41 gvg Exp $ +/* $Id: init.c,v 1.28 2004/07/03 17:15:02 hbirr Exp $ * * reactos/subsys/csrss/init.c * @@ -249,7 +249,6 @@ CsrServerInitialization ( return FALSE; } - CsrIsCsrss( ); CsrInitVideo(); CsrssApiHeap = RtlCreateHeap(HEAP_GROWABLE, @@ -270,13 +269,6 @@ CsrServerInitialization ( return Status; } - Status = InitWin32Csr(); - if (! NT_SUCCESS(Status)) - { - DPRINT1("CSR: Unable to load usermode dll (Status %x)\n", Status); - return FALSE; - } - /* NEW NAMED PORT: \ApiPort */ RtlRosInitUnicodeStringFromLiteral(&PortName, L"\\Windows\\ApiPort"); InitializeObjectAttributes(&ObAttributes, @@ -300,7 +292,7 @@ CsrServerInitialization ( 0, NULL, NULL, - (PTHREAD_START_ROUTINE)Thread_Api, + (PTHREAD_START_ROUTINE)ServerApiPortThead, ApiPortHandle, NULL, NULL); @@ -310,6 +302,18 @@ CsrServerInitialization ( NtClose(ApiPortHandle); return FALSE; } + Status = CsrClientConnectToServer(); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CsrClientConnectToServer() failed (Status %x)\n", Status); + return FALSE; + } + Status = InitWin32Csr(); + if (! NT_SUCCESS(Status)) + { + DPRINT1("CSR: Unable to load usermode dll (Status %x)\n", Status); + return FALSE; + } return CallInitComplete(); } From ba93d9c7b08d6778611872c6eefb88a5496f3afb Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 3 Jul 2004 17:17:05 +0000 Subject: [PATCH 179/356] - Implemented GuiConsoleHandleClose. svn path=/trunk/; revision=9981 --- reactos/subsys/csrss/win32csr/guiconsole.c | 35 ++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/guiconsole.c b/reactos/subsys/csrss/win32csr/guiconsole.c index 8b3af6eed8d..716881289aa 100644 --- a/reactos/subsys/csrss/win32csr/guiconsole.c +++ b/reactos/subsys/csrss/win32csr/guiconsole.c @@ -1,4 +1,4 @@ -/* $Id: guiconsole.c,v 1.14 2004/05/08 09:19:53 gvg Exp $ +/* $Id: guiconsole.c,v 1.15 2004/07/03 17:17:05 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -477,7 +477,38 @@ GuiConsoleHandleTimer(HWND hWnd) static VOID FASTCALL GuiConsoleHandleClose(HWND hWnd) { - /* FIXME for now, just ignore close requests */ + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + PLIST_ENTRY current_entry; + PCSRSS_PROCESS_DATA current; + HANDLE Process; + BOOL Result; + + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + + EnterCriticalSection(&Console->Header.Lock); + + current_entry = Console->ProcessList.Flink; + while (current_entry != &Console->ProcessList) + { + current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); + current_entry = current_entry->Flink; + + Process = OpenProcess(PROCESS_DUP_HANDLE, FALSE, current->ProcessId); + if (NULL == Process) + { + DPRINT1("Failed for handle duplication\n"); + continue; + } + Result = TerminateProcess(Process, 0); + CloseHandle(Process); + if (!Result) + { + DPRINT1("Failed to terminate process %d\n", current->ProcessId); + } + } + + LeaveCriticalSection(&Console->Header.Lock); } static VOID FASTCALL From e251c53983a5110de05ecf7e9910e79bb2d155e6 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 3 Jul 2004 17:31:30 +0000 Subject: [PATCH 180/356] - Fixed a bug, which prevents an opening of files, if the file name contains short path names. svn path=/trunk/; revision=9982 --- reactos/drivers/fs/vfat/create.c | 43 +++++++++++++++++---------- reactos/drivers/fs/vfat/fcb.c | 51 ++++++++++++++++++++++++++++---- 2 files changed, 73 insertions(+), 21 deletions(-) diff --git a/reactos/drivers/fs/vfat/create.c b/reactos/drivers/fs/vfat/create.c index 1f95922f578..00843c284da 100644 --- a/reactos/drivers/fs/vfat/create.c +++ b/reactos/drivers/fs/vfat/create.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: create.c,v 1.68 2004/06/23 20:23:59 hbirr Exp $ +/* $Id: create.c,v 1.69 2004/07/03 17:31:30 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: drivers/fs/vfat/create.c @@ -339,34 +339,35 @@ VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, PVFATFCB ParentFcb; PVFATFCB Fcb; NTSTATUS Status; - UNICODE_STRING NameU; - WCHAR Name[MAX_PATH]; ULONG Size; ULONG MediaChangeCount; // PDEVICE_OBJECT DeviceObject = DeviceExt->StorageDevice->Vpb->DeviceObject; - DPRINT ("VfatOpenFile(%08lx, %08lx, '%wZ')\n", DeviceExt, FileObject, FileNameU); + DPRINT ("VfatOpenFile(%08lx, %08lx, '%wZ')\n", DeviceExt, FileObject, &FileObject->FileName); if (FileObject->RelatedFileObject) { DPRINT ("Converting relative filename to absolute filename\n"); - NameU.Buffer = Name; - NameU.Length = 0; - NameU.MaximumLength = sizeof(Name); - Fcb = FileObject->RelatedFileObject->FsContext; - RtlCopyUnicodeString(&NameU, &Fcb->PathNameU); + RtlCopyUnicodeString(FileNameU, &Fcb->PathNameU); if (!vfatFCBIsRoot(Fcb)) { - NameU.Buffer[NameU.Length / sizeof(WCHAR)] = L'\\'; - NameU.Length += sizeof(WCHAR); + RtlAppendUnicodeToString(FileNameU, L"\\"); } - RtlAppendUnicodeStringToString(&NameU, FileNameU); - NameU.Buffer[NameU.Length / sizeof(WCHAR)] = 0; - FileNameU = &NameU; + RtlAppendUnicodeStringToString(FileNameU, &FileObject->FileName); } + else + { + RtlCopyUnicodeString(FileNameU, &FileObject->FileName); + } + if (FileNameU->Length > sizeof(WCHAR) && + FileNameU->Buffer[FileNameU->Length / sizeof(WCHAR) - 1] == L'\\') + { + FileNameU->Length -= sizeof(WCHAR); + } + FileNameU->Buffer[FileNameU->Length / sizeof(WCHAR)] = 0; DPRINT ("PathName to open: '%wZ'\n", FileNameU); @@ -425,6 +426,10 @@ VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, return Status; } } + else + { + RtlCopyUnicodeString(FileNameU, &Fcb->PathNameU); + } if (Fcb->Flags & FCB_DELETE_PENDING) { vfatReleaseFCB (DeviceExt, Fcb); @@ -492,6 +497,8 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) BOOLEAN PagingFileCreate = FALSE; LARGE_INTEGER AllocationSize; BOOLEAN Dots; + UNICODE_STRING NameU; + WCHAR NameW[MAX_PATH]; /* Unpack the various parameters. */ Stack = IoGetCurrentIrpStackLocation (Irp); @@ -568,8 +575,12 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) } } + NameU.Buffer = NameW; + NameU.Length = 0; + NameU.MaximumLength = sizeof(NameW); + /* Try opening the file. */ - Status = VfatOpenFile (DeviceExt, FileObject, &FileObject->FileName); + Status = VfatOpenFile (DeviceExt, FileObject, &NameU); /* * If the directory containing the file to open doesn't exist then @@ -594,7 +605,7 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) { ULONG Attributes; Attributes = Stack->Parameters.Create.FileAttributes; - Status = VfatAddEntry (DeviceExt, &FileObject->FileName, FileObject, RequestedOptions, + Status = VfatAddEntry (DeviceExt, &NameU, FileObject, RequestedOptions, (UCHAR)(Attributes & FILE_ATTRIBUTE_VALID_FLAGS)); if (NT_SUCCESS (Status)) { diff --git a/reactos/drivers/fs/vfat/fcb.c b/reactos/drivers/fs/vfat/fcb.c index fd8b48dbda6..5bbe452de93 100644 --- a/reactos/drivers/fs/vfat/fcb.c +++ b/reactos/drivers/fs/vfat/fcb.c @@ -1,4 +1,4 @@ -/* $Id: fcb.c,v 1.37 2004/01/28 20:53:46 ekohl Exp $ +/* $Id: fcb.c,v 1.38 2004/07/03 17:31:30 hbirr Exp $ * * * FILE: drivers/fs/vfat/fcb.c @@ -594,6 +594,7 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB, UNICODE_STRING NameU; UNICODE_STRING RootNameU; PWCHAR curr, prev, last; + ULONG Length; DPRINT ("vfatGetFCBForFile (%x,%x,%x,%wZ)\n", pVCB, @@ -626,6 +627,24 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB, NameU.Buffer = pFileNameU->Buffer; NameU.MaximumLength = NameU.Length = (curr - pFileNameU->Buffer) * sizeof(WCHAR); FCB = vfatGrabFCBFromTable(pVCB, &NameU); + if (FCB) + { + Length = (curr - pFileNameU->Buffer) * sizeof(WCHAR); + if (Length != FCB->PathNameU.Length) + { + if (pFileNameU->Length + FCB->PathNameU.Length - Length > pFileNameU->MaximumLength) + { + vfatReleaseFCB (pVCB, FCB); + return STATUS_OBJECT_NAME_INVALID; + } + memmove(pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR), + curr, pFileNameU->Length - Length); + pFileNameU->Length += FCB->PathNameU.Length - Length; + curr = pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR); + last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1; + } + memcpy(pFileNameU->Buffer, FCB->PathNameU.Buffer, FCB->PathNameU.Length); + } } else { @@ -637,8 +656,10 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB, FCB = vfatOpenRootFCB(pVCB); curr = pFileNameU->Buffer; } - curr++; + parentFCB = NULL; + prev = curr; + while (curr <= last) { if (parentFCB) @@ -659,13 +680,34 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB, return STATUS_OBJECT_PATH_NOT_FOUND; } parentFCB = FCB; - NameU.Buffer = pFileNameU->Buffer; + if (prev < curr) + { + Length = (curr - prev) * sizeof(WCHAR); + if (Length != parentFCB->LongNameU.Length) + { + if (pFileNameU->Length + parentFCB->LongNameU.Length - Length > pFileNameU->MaximumLength) + { + vfatReleaseFCB (pVCB, parentFCB); + return STATUS_OBJECT_NAME_INVALID; + } + memmove(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr, + pFileNameU->Length - (curr - pFileNameU->Buffer) * sizeof(WCHAR)); + pFileNameU->Length += parentFCB->LongNameU.Length - Length; + curr = prev + parentFCB->LongNameU.Length / sizeof(WCHAR); + last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1; + } + memcpy(prev, parentFCB->LongNameU.Buffer, parentFCB->LongNameU.Length); + } + curr++; prev = curr; while (*curr != L'\\' && curr <= last) { curr++; } - NameU.MaximumLength = NameU.Length = (curr - NameU.Buffer) * sizeof(WCHAR); + NameU.Buffer = pFileNameU->Buffer; + NameU.Length = (curr - NameU.Buffer) * sizeof(WCHAR); + NameU.MaximumLength = pFileNameU->MaximumLength; + DPRINT("%wZ\n", &NameU); FCB = vfatGrabFCBFromTable(pVCB, &NameU); if (FCB == NULL) { @@ -694,7 +736,6 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB, return status; } } - curr++; } *pParentFCB = parentFCB; From 8fab52126fa72169c738240b9627105231cb549a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 3 Jul 2004 17:40:27 +0000 Subject: [PATCH 181/356] - Fix errors during optimized build. svn path=/trunk/; revision=9983 --- reactos/apps/tests/fiber/fiber.c | 4 ++-- reactos/apps/tests/terminate/terminate.c | 2 +- reactos/apps/utils/partinfo/partinfo.c | 1 - reactos/drivers/bus/isapnp/isapnp.c | 8 ++++---- reactos/drivers/fs/ms/create.c | 3 +-- reactos/drivers/fs/np/create.c | 4 ++-- reactos/drivers/net/afd/afd/dispatch.c | 5 ++--- reactos/drivers/net/afd/afd/rdwr.c | 2 +- reactos/drivers/net/afd/afd/tdi.c | 6 +++--- reactos/drivers/net/ndis/ndis/config.c | 2 +- reactos/drivers/net/npf/dump.c | 2 +- reactos/drivers/net/npf/packet.c | 2 +- reactos/drivers/storage/cdrom/cdrom.c | 4 ++-- reactos/drivers/storage/disk/disk.c | 4 ++-- reactos/drivers/video/displays/framebuf/surface.c | 3 +++ .../drivers/video/displays/vga/objects/bitblt.c | 2 +- reactos/drivers/video/displays/vga/objects/paint.c | 14 +++++--------- reactos/drivers/video/videoprt/videoprt.c | 4 ++-- reactos/lib/advapi32/reg/reg.c | 12 ++++++------ reactos/lib/advapi32/service/scm.c | 6 ++---- reactos/lib/cpl/sysdm/environment.c | 4 ++-- reactos/lib/crtdll/stdio/popen.c | 4 ++-- reactos/lib/fslib/vfatlib/fat12.c | 2 +- reactos/lib/fslib/vfatlib/fat16.c | 2 +- reactos/lib/gdi32/objects/font.c | 4 ++-- reactos/lib/kernel32/k32.h | 1 + reactos/lib/kernel32/mem/global.c | 4 ++-- reactos/lib/kernel32/misc/lzexpand_main.c | 3 ++- reactos/lib/kernel32/process/create.c | 4 ++-- reactos/lib/ntdll/ldr/utils.c | 4 ++-- reactos/lib/ntdll/makefile | 4 ++-- reactos/lib/ntdll/rtl/message.c | 4 ++-- reactos/lib/ntdll/stdio/sprintf.c | 3 ++- reactos/lib/ntdll/stdlib/atoi64.c | 3 ++- reactos/lib/ntdll/stdlib/strtol.c | 1 + reactos/lib/ntdll/stdlib/strtoul.c | 1 + reactos/lib/packet/Packet32.c | 2 +- reactos/lib/rtl/env.c | 4 +--- reactos/lib/rtl/makefile | 2 +- reactos/lib/rtl/unicode.c | 1 + reactos/lib/user32/controls/scrollbar.c | 3 +++ reactos/lib/user32/misc/dllmain.c | 12 ++---------- reactos/lib/user32/windows/class.c | 12 +++++++----- reactos/lib/user32/windows/defwnd.c | 4 ++-- reactos/lib/user32/windows/mdi.c | 2 +- reactos/lib/user32/windows/nonclient.c | 2 +- reactos/lib/ws2_32/misc/ns.c | 1 + reactos/lib/ws2_32/misc/stubs.c | 5 ++--- reactos/ntoskrnl/io/deviface.c | 6 +++--- reactos/ntoskrnl/io/resource.c | 8 ++++---- reactos/subsys/system/cmd/dir.c | 4 ++-- reactos/subsys/system/format/format.c | 6 +----- reactos/subsys/system/services/database.c | 6 +++--- reactos/subsys/system/winlogon/winlogon.c | 4 ++-- reactos/subsys/win32k/dib/dib16bpp.c | 10 +++++----- reactos/subsys/win32k/dib/dib1bpp.c | 12 +++++------- reactos/subsys/win32k/dib/dib24bpp.c | 10 +++++----- reactos/subsys/win32k/dib/dib32bpp.c | 11 +++++------ reactos/subsys/win32k/dib/dib4bpp.c | 10 +++++----- reactos/subsys/win32k/dib/dib8bpp.c | 10 +++++----- reactos/subsys/win32k/eng/bitblt.c | 12 ++++++------ reactos/subsys/win32k/eng/misc.c | 4 ++-- reactos/subsys/win32k/eng/mouse.c | 3 ++- reactos/subsys/win32k/eng/transblt.c | 4 ++-- reactos/subsys/win32k/ntuser/message.c | 6 +++--- reactos/subsys/win32k/ntuser/scrollbar.c | 3 ++- reactos/subsys/win32k/ntuser/window.c | 8 ++++---- reactos/subsys/win32k/objects/bitmaps.c | 14 +++++++------- reactos/subsys/win32k/objects/brush.c | 8 ++++---- reactos/subsys/win32k/objects/color.c | 4 ++-- reactos/subsys/win32k/objects/cursoricon.c | 4 ++-- reactos/subsys/win32k/objects/dc.c | 10 ++++++---- reactos/subsys/win32k/objects/line.c | 4 ++-- reactos/subsys/win32k/objects/path.c | 11 +++++------ reactos/subsys/win32k/objects/region.c | 12 +++--------- reactos/subsys/win32k/objects/text.c | 4 ++-- 76 files changed, 191 insertions(+), 205 deletions(-) diff --git a/reactos/apps/tests/fiber/fiber.c b/reactos/apps/tests/fiber/fiber.c index bc325400b90..3dfb2dc1be8 100644 --- a/reactos/apps/tests/fiber/fiber.c +++ b/reactos/apps/tests/fiber/fiber.c @@ -1,4 +1,4 @@ -/* $Id: fiber.c,v 1.2 2004/03/07 20:07:04 hyperion Exp $ +/* $Id: fiber.c,v 1.3 2004/07/03 17:40:19 navaraf Exp $ */ #include @@ -180,7 +180,7 @@ void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) int k; int b; int bResume; - PLIST_ENTRY ple; + PLIST_ENTRY ple = NULL; bResume = 0; i = 0; diff --git a/reactos/apps/tests/terminate/terminate.c b/reactos/apps/tests/terminate/terminate.c index b82ae6d2f5d..986de455800 100644 --- a/reactos/apps/tests/terminate/terminate.c +++ b/reactos/apps/tests/terminate/terminate.c @@ -41,7 +41,6 @@ main(int argc, char *argv[]) while (z < 50) { - TerminateThread(thread, 0); z++; thread=CreateThread(NULL, 0x1000, @@ -69,6 +68,7 @@ main(int argc, char *argv[]) SuspendThread(thread); printf("R"); ResumeThread(thread); + TerminateThread(thread, 0); } ExitProcess(0); diff --git a/reactos/apps/utils/partinfo/partinfo.c b/reactos/apps/utils/partinfo/partinfo.c index 9dc9a6880f5..844fe8f83d8 100644 --- a/reactos/apps/utils/partinfo/partinfo.c +++ b/reactos/apps/utils/partinfo/partinfo.c @@ -142,7 +142,6 @@ int main (int argc, char *argv[]) CloseHandle(hDisk); printf("DeviceIoControl failed! Error: %lu\n", GetLastError()); - free(Buffer); return 0; } diff --git a/reactos/drivers/bus/isapnp/isapnp.c b/reactos/drivers/bus/isapnp/isapnp.c index e6ba40a0418..e53187f2af0 100644 --- a/reactos/drivers/bus/isapnp/isapnp.c +++ b/reactos/drivers/bus/isapnp/isapnp.c @@ -1,4 +1,4 @@ -/* $Id: isapnp.c,v 1.9 2004/02/10 16:22:54 navaraf Exp $ +/* $Id: isapnp.c,v 1.10 2004/07/03 17:40:20 navaraf Exp $ * * PROJECT: ReactOS ISA PnP Bus driver * FILE: isapnp.c @@ -584,7 +584,7 @@ static NTSTATUS AddIrqResource( { PISAPNP_DESCRIPTOR Descriptor; UCHAR tmp[3]; - ULONG irq, i, last; + ULONG irq, i, last = 0; BOOLEAN found; NTSTATUS Status; @@ -639,7 +639,7 @@ static NTSTATUS AddDmaResource( { PISAPNP_DESCRIPTOR Descriptor; UCHAR tmp[2]; - ULONG dma, flags, i, last; + ULONG dma, flags, i, last = 0; BOOLEAN found; NTSTATUS Status; @@ -1424,7 +1424,7 @@ ISAPNPQueryBusRelations( PISAPNP_LOGICAL_DEVICE LogicalDevice; PDEVICE_RELATIONS Relations; PLIST_ENTRY CurrentEntry; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; ULONG Size; ULONG i; diff --git a/reactos/drivers/fs/ms/create.c b/reactos/drivers/fs/ms/create.c index 740eed7cc46..a7f6fcb6e04 100644 --- a/reactos/drivers/fs/ms/create.c +++ b/reactos/drivers/fs/ms/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.4 2002/09/08 10:22:10 chorns Exp $ +/* $Id: create.c,v 1.5 2004/07/03 17:40:20 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -139,7 +139,6 @@ MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject, if (!RtlCreateUnicodeString(&Mailslot->Name, FileObject->FileName.Buffer)) { ExFreePool(Mailslot); - ExFreePool(Fcb); Irp->IoStatus.Status = STATUS_NO_MEMORY; Irp->IoStatus.Information = 0; diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index 79f8aad2ff1..75d70767c6c 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.21 2004/05/10 19:58:10 navaraf Exp $ +/* $Id: create.c,v 1.22 2004/07/03 17:40:20 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -203,7 +203,7 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PNPFS_PIPE Pipe; PNPFS_FCB Fcb; PLIST_ENTRY current_entry; - PNPFS_PIPE current; + PNPFS_PIPE current = NULL; PIO_PIPE_CREATE_BUFFER Buffer; DPRINT("NpfsCreateNamedPipe(DeviceObject %p Irp %p)\n", DeviceObject, Irp); diff --git a/reactos/drivers/net/afd/afd/dispatch.c b/reactos/drivers/net/afd/afd/dispatch.c index 5f01d97b66d..70bcc086339 100644 --- a/reactos/drivers/net/afd/afd/dispatch.c +++ b/reactos/drivers/net/afd/afd/dispatch.c @@ -772,7 +772,6 @@ NTSTATUS AfdDispRecv( UINT OutputBufferLength; PFILE_REQUEST_RECVFROM Request; PFILE_REPLY_RECVFROM Reply; - DWORD NumberOfBytesRecvd; PAFDFCB FCB; AFD_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -794,7 +793,7 @@ NTSTATUS AfdDispRecv( Request, Reply, TRUE); - Reply->NumberOfBytesRecvd = NumberOfBytesRecvd; + Reply->NumberOfBytesRecvd = 0; /* FIXME */ Reply->Status = NO_ERROR; } else { Status = STATUS_INVALID_PARAMETER; @@ -818,7 +817,7 @@ NTSTATUS AfdDispSend( * Status of operation */ { - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; UINT InputBufferLength; UINT OutputBufferLength; PFILE_REQUEST_SEND Request; diff --git a/reactos/drivers/net/afd/afd/rdwr.c b/reactos/drivers/net/afd/afd/rdwr.c index 1cf2d7db113..9c2ccc999f9 100644 --- a/reactos/drivers/net/afd/afd/rdwr.c +++ b/reactos/drivers/net/afd/afd/rdwr.c @@ -68,7 +68,7 @@ AfdWrite( { PIO_STACK_LOCATION IoSp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT FileObject = IoSp->FileObject; - NTSTATUS Status; + NTSTATUS Status = STATUS_NOT_IMPLEMENTED; ULONG Length; PVOID Buffer; ULONG Offset; diff --git a/reactos/drivers/net/afd/afd/tdi.c b/reactos/drivers/net/afd/afd/tdi.c index a2c6d8258f2..067d1f46d63 100644 --- a/reactos/drivers/net/afd/afd/tdi.c +++ b/reactos/drivers/net/afd/afd/tdi.c @@ -1044,7 +1044,7 @@ NTSTATUS TdiReceiveDatagram( */ { PTDI_CONNECTION_INFORMATION ReceiveInfo; - PTDI_CONNECTION_INFORMATION ReturnInfo; + TDI_CONNECTION_INFORMATION ReturnInfo; PDEVICE_OBJECT DeviceObject; IO_STATUS_BLOCK Iosb; NTSTATUS Status; @@ -1111,12 +1111,12 @@ NTSTATUS TdiReceiveDatagram( Mdl, /* Data buffer */ *BufferSize, /* Size of data buffer */ ReceiveInfo, /* Connection information */ - ReturnInfo, /* Connection information */ + &ReturnInfo, /* Connection information */ TDI_RECEIVE_NORMAL); /* Flags */ Status = TdiCall(Irp, DeviceObject, &Event, &Iosb); if (NT_SUCCESS(Status)) { *BufferSize = Iosb.Information; - TdiBuildName(Address, TdiGetRemoteAddress(ReturnInfo)); + TdiBuildName(Address, TdiGetRemoteAddress(&ReturnInfo)); } MmUnlockPages(Mdl); diff --git a/reactos/drivers/net/ndis/ndis/config.c b/reactos/drivers/net/ndis/ndis/config.c index a48c41f6ca7..bfafbe49e73 100644 --- a/reactos/drivers/net/ndis/ndis/config.c +++ b/reactos/drivers/net/ndis/ndis/config.c @@ -864,7 +864,7 @@ NdisOpenConfigurationKeyByName( NDIS_HANDLE RegKeyHandle; InitializeObjectAttributes(&KeyAttributes, KeyName, OBJ_CASE_INSENSITIVE, ConfigurationHandle, 0); - *Status = ZwOpenKey(RegKeyHandle, KEY_ALL_ACCESS, &KeyAttributes); + *Status = ZwOpenKey(&RegKeyHandle, KEY_ALL_ACCESS, &KeyAttributes); if(*Status != STATUS_SUCCESS) { diff --git a/reactos/drivers/net/npf/dump.c b/reactos/drivers/net/npf/dump.c index afef4f5da3e..a48e447d8d0 100644 --- a/reactos/drivers/net/npf/dump.c +++ b/reactos/drivers/net/npf/dump.c @@ -46,7 +46,7 @@ NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN Append) NTSTATUS ntStatus; IO_STATUS_BLOCK IoStatus; OBJECT_ATTRIBUTES ObjectAttributes; - PWCHAR PathPrefix; + PWCHAR PathPrefix = NULL; USHORT PathLen; UNICODE_STRING FullFileName; ULONG FullFileNameLength; diff --git a/reactos/drivers/net/npf/packet.c b/reactos/drivers/net/npf/packet.c index 7e0882ca61b..fc6ed0ec73e 100644 --- a/reactos/drivers/net/npf/packet.c +++ b/reactos/drivers/net/npf/packet.c @@ -623,12 +623,12 @@ NPF_Unload(IN PDRIVER_OBJECT DriverObject) } IoDeleteDevice(OldDeviceObject); - } NdisDeregisterProtocol( &Status, NdisProtocolHandle ); + } // Free the adapters names ExFreePool( bindP ); diff --git a/reactos/drivers/storage/cdrom/cdrom.c b/reactos/drivers/storage/cdrom/cdrom.c index 2ff4c6a88c1..6d7ad693e16 100644 --- a/reactos/drivers/storage/cdrom/cdrom.c +++ b/reactos/drivers/storage/cdrom/cdrom.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cdrom.c,v 1.28 2004/05/09 14:50:50 hbirr Exp $ +/* $Id: cdrom.c,v 1.29 2004/07/03 17:40:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -233,7 +233,7 @@ CdromClassFindDevices(IN PDRIVER_OBJECT DriverObject, PCHAR Buffer; ULONG Bus; ULONG DeviceCount; - BOOLEAN FoundDevice; + BOOLEAN FoundDevice = FALSE; NTSTATUS Status; DPRINT("CdromClassFindDevices() called.\n"); diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 993f4c39e80..93bfdd5e991 100644 --- a/reactos/drivers/storage/disk/disk.c +++ b/reactos/drivers/storage/disk/disk.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: disk.c,v 1.42 2004/06/21 21:03:12 hbirr Exp $ +/* $Id: disk.c,v 1.43 2004/07/03 17:40:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -218,7 +218,7 @@ DiskClassFindDevices(PDRIVER_OBJECT DriverObject, PCHAR Buffer; ULONG Bus; ULONG DeviceCount; - BOOLEAN FoundDevice; + BOOLEAN FoundDevice = FALSE; NTSTATUS Status; DPRINT("DiskClassFindDevices() called.\n"); diff --git a/reactos/drivers/video/displays/framebuf/surface.c b/reactos/drivers/video/displays/framebuf/surface.c index 82a3f5fcc88..5067da0d895 100644 --- a/reactos/drivers/video/displays/framebuf/surface.c +++ b/reactos/drivers/video/displays/framebuf/surface.c @@ -86,6 +86,9 @@ DrvEnableSurface( case 32: BitmapType = BMF_32BPP; break; + + default: + return FALSE; } ScreenSize.cx = ppdev->ScreenWidth; diff --git a/reactos/drivers/video/displays/vga/objects/bitblt.c b/reactos/drivers/video/displays/vga/objects/bitblt.c index b80fc8ff520..4726dffe890 100644 --- a/reactos/drivers/video/displays/vga/objects/bitblt.c +++ b/reactos/drivers/video/displays/vga/objects/bitblt.c @@ -389,7 +389,7 @@ DrvBitBlt(SURFOBJ *Dest, { PBLTRECTFUNC BltRectFunc; RECTL CombinedRect; - BOOL Ret; + BOOL Ret = FALSE; RECT_ENUM RectEnum; BOOL EnumMore; unsigned i; diff --git a/reactos/drivers/video/displays/vga/objects/paint.c b/reactos/drivers/video/displays/vga/objects/paint.c index af95f60c065..e3f06c22d48 100644 --- a/reactos/drivers/video/displays/vga/objects/paint.c +++ b/reactos/drivers/video/displays/vga/objects/paint.c @@ -11,11 +11,9 @@ BOOL VGADDIFillSolid(SURFOBJ *Surface, RECTL Dimensions, ULONG iColor) ULONG offset, j, pre1; ULONG orgpre1, orgx, midpre1, tmppre1; ULONG ileftpix, imidpix, irightpix; - double leftpix, midpix, rightpix; +/* double leftpix, midpix, rightpix;*/ UCHAR a; - DPRINT("VGADDIFillSolid: x:%d, y:%d, w:%d, h:%d\n", x, y, w, h); - // Swap dimensions so that x, y are at topmost left if ( Dimensions.right < Dimensions.left ) { @@ -42,6 +40,8 @@ BOOL VGADDIFillSolid(SURFOBJ *Surface, RECTL Dimensions, ULONG iColor) w = x2 - x; h = y2 - y; + DPRINT("VGADDIFillSolid: x:%d, y:%d, w:%d, h:%d\n", x, y, w, h); + // Calculate the starting offset offset = xconv[x]+y80[y]; @@ -50,12 +50,8 @@ BOOL VGADDIFillSolid(SURFOBJ *Surface, RECTL Dimensions, ULONG iColor) // Calculate the left mask pixels, middle bytes and right mask pixel ileftpix = 7 - mod8(x-1); - rightpix = mod8(x+w); - midpix = (w-leftpix-rightpix) / 8; - - ileftpix = leftpix; - irightpix = rightpix; - imidpix = midpix; + irightpix = mod8(x+w); + imidpix = (w-ileftpix-irightpix) / 8; pre1 = xconv[(x-1)&~7] + y80[y]; orgpre1=pre1; diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index ff7b14565fb..32a0236a9b6 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.c,v 1.25 2004/06/26 22:30:34 navaraf Exp $ + * $Id: videoprt.c,v 1.26 2004/07/03 17:40:21 navaraf Exp $ */ #include "videoprt.h" @@ -180,7 +180,7 @@ IntVideoPortFindAdapter( WCHAR SymlinkBuffer[20]; UNICODE_STRING SymlinkName; PDEVICE_OBJECT DeviceObject; - BOOL LegacyDetection; + BOOL LegacyDetection = FALSE; /* * Find the first free device number that can be used for video device diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index 6599c2563d1..d747d7d7d95 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -1,4 +1,4 @@ -/* $Id: reg.c,v 1.49 2004/07/03 14:46:39 gvg Exp $ +/* $Id: reg.c,v 1.50 2004/07/03 17:40:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -865,7 +865,7 @@ RegEnumKeyExA (HKEY hKey, ANSI_STRING StringA; LONG ErrorCode = ERROR_SUCCESS; DWORD NameLength; - DWORD ClassLength; + DWORD ClassLength = 0; DWORD BufferSize; DWORD ResultSize; HANDLE KeyHandle; @@ -1042,7 +1042,7 @@ RegEnumKeyExW (HKEY hKey, ULONG BufferSize; ULONG ResultSize; ULONG NameLength; - ULONG ClassLength; + ULONG ClassLength = 0; HANDLE KeyHandle; LONG ErrorCode = ERROR_SUCCESS; NTSTATUS Status; @@ -1193,7 +1193,7 @@ RegEnumValueA (HKEY hKey, ULONG NameLength; ULONG BufferSize; - ULONG DataLength; + ULONG DataLength = 0; ULONG ResultSize; HANDLE KeyHandle; LONG ErrorCode; @@ -1360,7 +1360,7 @@ RegEnumValueW (HKEY hKey, ULONG NameLength; ULONG BufferSize; - ULONG DataLength; + ULONG DataLength = 0; ULONG ResultSize; HANDLE KeyHandle; LONG ErrorCode; @@ -1997,7 +1997,7 @@ RegQueryInfoKeyW (HKEY hKey, KEY_FULL_INFORMATION FullInfoBuffer; PKEY_FULL_INFORMATION FullInfo; ULONG FullInfoSize; - ULONG ClassLength; + ULONG ClassLength = 0; HANDLE KeyHandle; NTSTATUS Status; LONG ErrorCode = ERROR_SUCCESS; diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c index c64ae872d72..ba7cfb8325c 100644 --- a/reactos/lib/advapi32/service/scm.c +++ b/reactos/lib/advapi32/service/scm.c @@ -1,4 +1,4 @@ -/* $Id: scm.c,v 1.21 2004/04/12 17:20:47 navaraf Exp $ +/* $Id: scm.c,v 1.22 2004/07/03 17:40:21 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -82,11 +82,9 @@ BOOL STDCALL CloseServiceHandle(SC_HANDLE hSCObject) { - HANDLE hPipe; DPRINT("CloseServiceHandle() - called.\n"); -// SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - if (!CloseHandle(hPipe)) { + if (!CloseHandle(hSCObject)) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } diff --git a/reactos/lib/cpl/sysdm/environment.c b/reactos/lib/cpl/sysdm/environment.c index ad3f3577f8a..876330bd4dc 100644 --- a/reactos/lib/cpl/sysdm/environment.c +++ b/reactos/lib/cpl/sysdm/environment.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: environment.c,v 1.1 2004/07/02 20:28:00 ekohl Exp $ +/* $Id: environment.c,v 1.2 2004/07/03 17:40:22 navaraf Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/sysdm/environment.c @@ -45,7 +45,7 @@ SetEnvironmentVariables(HWND hwndListView, DWORD i; LPTSTR lpName; LPTSTR lpData; - LPTSTR lpExpandData; + LPTSTR lpExpandData = NULL; DWORD dwNameLength; DWORD dwDataLength; DWORD dwType; diff --git a/reactos/lib/crtdll/stdio/popen.c b/reactos/lib/crtdll/stdio/popen.c index 40cf63de87a..9b00409e1b6 100644 --- a/reactos/lib/crtdll/stdio/popen.c +++ b/reactos/lib/crtdll/stdio/popen.c @@ -20,8 +20,8 @@ FILE *_popen (const char *cm, const char *md) /* program name, pipe mode */ // fixme CreatePipe -// if ( !CreatePipe(&hReadPipe,&hWritePipe,NULL,1024)) -// return NULL; + if ( !CreatePipe(&hReadPipe,&hWritePipe,NULL,1024)) + return NULL; StartupInfo.cb = sizeof(StartupInfo); if ( md == "r" ) { diff --git a/reactos/lib/fslib/vfatlib/fat12.c b/reactos/lib/fslib/vfatlib/fat12.c index 050aed8ccff..fb8cd7dd787 100644 --- a/reactos/lib/fslib/vfatlib/fat12.c +++ b/reactos/lib/fslib/vfatlib/fat12.c @@ -199,7 +199,7 @@ Fat12WriteRootDirectory (IN HANDLE FileHandle, IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; PUCHAR Buffer; LARGE_INTEGER FileOffset; ULONG FirstRootDirSector; diff --git a/reactos/lib/fslib/vfatlib/fat16.c b/reactos/lib/fslib/vfatlib/fat16.c index 31b6c5cdd86..a3f093a6817 100644 --- a/reactos/lib/fslib/vfatlib/fat16.c +++ b/reactos/lib/fslib/vfatlib/fat16.c @@ -201,7 +201,7 @@ Fat16WriteRootDirectory (IN HANDLE FileHandle, IN OUT PFORMAT_CONTEXT Context) { IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; PUCHAR Buffer; LARGE_INTEGER FileOffset; ULONG FirstRootDirSector; diff --git a/reactos/lib/gdi32/objects/font.c b/reactos/lib/gdi32/objects/font.c index 02bdaf615e6..244649af501 100644 --- a/reactos/lib/gdi32/objects/font.c +++ b/reactos/lib/gdi32/objects/font.c @@ -1,4 +1,4 @@ -/* $Id: font.c,v 1.4 2004/04/25 14:46:54 weiden Exp $ +/* $Id: font.c,v 1.5 2004/07/03 17:40:22 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -206,7 +206,7 @@ IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, int FontFamilyCount; unsigned FontFamilySize; PFONTFAMILYINFO Info; - int Ret; + int Ret = 0; unsigned i; ENUMLOGFONTEXA EnumLogFontExA; NEWTEXTMETRICEXA NewTextMetricExA; diff --git a/reactos/lib/kernel32/k32.h b/reactos/lib/kernel32/k32.h index 8f4b2d433cd..995b19bb5ad 100755 --- a/reactos/lib/kernel32/k32.h +++ b/reactos/lib/kernel32/k32.h @@ -1,6 +1,7 @@ #define _WIN32_WINNT 0x0501 #define __USE_W32API #define NTOS_MODE_USER +#define __NO_CTYPE_INLINES #include #include #include diff --git a/reactos/lib/kernel32/mem/global.c b/reactos/lib/kernel32/mem/global.c index 0cf2bc38d9f..32f61e415ab 100644 --- a/reactos/lib/kernel32/mem/global.c +++ b/reactos/lib/kernel32/mem/global.c @@ -1,4 +1,4 @@ -/* $Id: global.c,v 1.25 2004/06/13 20:04:55 navaraf Exp $ +/* $Id: global.c,v 1.26 2004/07/03 17:40:22 navaraf Exp $ * * Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * These functions included in Win32 for compatibility with 16 bit Windows @@ -671,7 +671,7 @@ GlobalUnlock(HGLOBAL hMem) { PGLOBAL_HANDLE phandle; - BOOL locked; + BOOL locked = FALSE; DPRINT("GlobalUnlock( 0x%lX )\n", (ULONG)hMem); diff --git a/reactos/lib/kernel32/misc/lzexpand_main.c b/reactos/lib/kernel32/misc/lzexpand_main.c index 0dcbb123b7d..e97b330c0fc 100644 --- a/reactos/lib/kernel32/misc/lzexpand_main.c +++ b/reactos/lib/kernel32/misc/lzexpand_main.c @@ -1,4 +1,4 @@ -/* $Id: lzexpand_main.c,v 1.2 2004/01/23 21:16:03 ekohl Exp $ +/* $Id: lzexpand_main.c,v 1.3 2004/07/03 17:40:22 navaraf Exp $ * * LZ Decompression functions * @@ -27,6 +27,7 @@ #define NDEBUG #include "../include/debug.h" #include +#define __NO_CTYPE_INLINES #include #include #include diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index 2daf02012a9..a393ce28730 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.85 2004/05/15 20:25:09 hbirr Exp $ +/* $Id: create.c,v 1.86 2004/07/03 17:40:22 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -829,7 +829,7 @@ CreateProcessW UNICODE_STRING RuntimeInfo_U; PVOID ImageBaseAddress; BOOL InputSet, OutputSet, ErrorSet; - BOOL InputDup, OutputDup, ErrorDup; + BOOL InputDup = FALSE, OutputDup = FALSE, ErrorDup = FALSE; WCHAR Name[MAX_PATH]; WCHAR *TidyCmdLine; BOOL IsBatchFile = FALSE; diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 54fe950a1df..41abc521a40 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.96 2004/06/27 12:20:33 ekohl Exp $ +/* $Id: utils.c,v 1.97 2004/07/03 17:40:22 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1629,7 +1629,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL, PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptor; PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptorCurrent; PIMAGE_TLS_DIRECTORY TlsDirectory; - ULONG TlsSize; + ULONG TlsSize = 0; NTSTATUS Status; PLDR_MODULE ImportedModule; PCHAR ImportedName; diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index 15fe23320bb..e8d80ccb614 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.104 2004/07/01 02:40:22 hyperion Exp $ +# $Id: makefile,v 1.105 2004/07/03 17:40:23 navaraf Exp $ PATH_TO_TOP = ../.. @@ -19,7 +19,7 @@ TARGET_LFLAGS = -Wl,--file-alignment,0x1000 \ -Wl,--section-alignment,0x1000 \ -nostartfiles -nostdlib -TARGET_SDKLIBS = string.a rosrtl.a rtl.a +TARGET_SDKLIBS = rosrtl.a rtl.a string.a TARGET_GCCLIBS = gcc diff --git a/reactos/lib/ntdll/rtl/message.c b/reactos/lib/ntdll/rtl/message.c index d7c9facd3f9..1500a463fcd 100644 --- a/reactos/lib/ntdll/rtl/message.c +++ b/reactos/lib/ntdll/rtl/message.c @@ -1,4 +1,4 @@ -/* $Id: message.c,v 1.5 2002/09/08 10:23:06 chorns Exp $ +/* $Id: message.c,v 1.6 2004/07/03 17:40:23 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -30,7 +30,7 @@ RtlFindMessage(PVOID BaseAddress, PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; PRTL_MESSAGE_RESOURCE_DATA MessageTable; NTSTATUS Status; - ULONG EntryOffset, IdOffset; + ULONG EntryOffset, IdOffset = 0; PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; ULONG i; diff --git a/reactos/lib/ntdll/stdio/sprintf.c b/reactos/lib/ntdll/stdio/sprintf.c index d7dbf2181f1..e8cccf09961 100644 --- a/reactos/lib/ntdll/stdio/sprintf.c +++ b/reactos/lib/ntdll/stdio/sprintf.c @@ -1,4 +1,4 @@ -/* $Id: sprintf.c,v 1.15 2004/06/15 08:53:53 hbirr Exp $ +/* $Id: sprintf.c,v 1.16 2004/07/03 17:40:23 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -23,6 +23,7 @@ #include #include #include +#define __NO_CTYPE_INLINES #include #include #include diff --git a/reactos/lib/ntdll/stdlib/atoi64.c b/reactos/lib/ntdll/stdlib/atoi64.c index 1b1856ce450..92e5d12f189 100644 --- a/reactos/lib/ntdll/stdlib/atoi64.c +++ b/reactos/lib/ntdll/stdlib/atoi64.c @@ -1,4 +1,4 @@ -/* $Id: atoi64.c,v 1.4 2003/07/11 13:50:23 royce Exp $ +/* $Id: atoi64.c,v 1.5 2004/07/03 17:40:23 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -7,6 +7,7 @@ */ #include +#define __NO_CTYPE_INLINES #include /* diff --git a/reactos/lib/ntdll/stdlib/strtol.c b/reactos/lib/ntdll/stdlib/strtol.c index 5651f6a8c09..bf11453b7ae 100644 --- a/reactos/lib/ntdll/stdlib/strtol.c +++ b/reactos/lib/ntdll/stdlib/strtol.c @@ -1,5 +1,6 @@ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ #include +#define __NO_CTYPE_INLINES #include #include diff --git a/reactos/lib/ntdll/stdlib/strtoul.c b/reactos/lib/ntdll/stdlib/strtoul.c index efb5a210dd4..ee283b6b44a 100644 --- a/reactos/lib/ntdll/stdlib/strtoul.c +++ b/reactos/lib/ntdll/stdlib/strtoul.c @@ -1,5 +1,6 @@ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ #include +#define __NO_CTYPE_INLINES #include #include diff --git a/reactos/lib/packet/Packet32.c b/reactos/lib/packet/Packet32.c index 72292c839ad..187efc0c409 100644 --- a/reactos/lib/packet/Packet32.c +++ b/reactos/lib/packet/Packet32.c @@ -1289,7 +1289,7 @@ BOOLEAN PacketGetStatsEx(LPADAPTER AdapterObject,struct bpf_stat *s) BOOLEAN PacketRequest(LPADAPTER AdapterObject,BOOLEAN Set,PPACKET_OID_DATA OidData) { //DWORD BytesReturned; - BOOLEAN Result; + BOOLEAN Result = 0; /*commented out since its broken & needs fixing*/ /*Result=DeviceIoControl(AdapterObject->hFile,(DWORD) Set ? pBIOCSETOID : pBIOCQUERYOID, OidData,sizeof(PACKET_OID_DATA)-1+OidData->Length,OidData, diff --git a/reactos/lib/rtl/env.c b/reactos/lib/rtl/env.c index 257b0dc193b..69eb5caae62 100644 --- a/reactos/lib/rtl/env.c +++ b/reactos/lib/rtl/env.c @@ -1,4 +1,4 @@ -/* $Id: env.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ +/* $Id: env.c,v 1.2 2004/07/03 17:40:23 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -19,8 +19,6 @@ #define NDEBUG #include - - /* FUNCTIONS *****************************************************************/ /* diff --git a/reactos/lib/rtl/makefile b/reactos/lib/rtl/makefile index 195bf17702c..c2a5e6a41e2 100644 --- a/reactos/lib/rtl/makefile +++ b/reactos/lib/rtl/makefile @@ -7,7 +7,7 @@ TARGET_NAME = rtl include $(PATH_TO_TOP)/config -TARGET_CFLAGS = -Wall -Werror +TARGET_CFLAGS = -Wall -Werror -ffreestanding # require os code to explicitly request A/W version of structs/functions TARGET_CFLAGS += -D_DISABLE_TIDENTS diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c index fe2f21db287..5f85743bbec 100644 --- a/reactos/lib/rtl/unicode.c +++ b/reactos/lib/rtl/unicode.c @@ -27,6 +27,7 @@ #include #include +#define __NO_CTYPE_INLINES #include #define NDEBUG diff --git a/reactos/lib/user32/controls/scrollbar.c b/reactos/lib/user32/controls/scrollbar.c index 8fa443ccf80..34f5bf3303a 100644 --- a/reactos/lib/user32/controls/scrollbar.c +++ b/reactos/lib/user32/controls/scrollbar.c @@ -342,6 +342,9 @@ IntDrawScrollBar(HWND Wnd, HDC DC, INT Bar) case SB_CTL: Vertical = (GetWindowLongW(Wnd, GWL_STYLE) & SBS_VERT) != 0; break; + + default: + return; } if (! IntGetScrollBarInfo(Wnd, Bar, &Info)) { diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index f6181e52521..a05b417c0e0 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -54,11 +54,9 @@ CleanupThread(VOID) TlsSetValue(User32TlsIndex, 0); } -DWORD +VOID Init(VOID) { - DWORD Status; - /* Set up the kernel callbacks. */ NtCurrentTeb()->Peb->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] = (PVOID)User32CallWindowProcFromKernel; @@ -81,20 +79,14 @@ Init(VOID) InitializeCriticalSection(&gcsMPH); GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); - - return(Status); } -DWORD +VOID Cleanup(VOID) { - DWORD Status; - GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL); TlsFree(User32TlsIndex); - - return(Status); } diff --git a/reactos/lib/user32/windows/class.c b/reactos/lib/user32/windows/class.c index 658906fd641..9730f0caf28 100644 --- a/reactos/lib/user32/windows/class.c +++ b/reactos/lib/user32/windows/class.c @@ -1,4 +1,4 @@ -/* $Id: class.c,v 1.49 2004/05/17 16:38:57 navaraf Exp $ +/* $Id: class.c,v 1.50 2004/07/03 17:40:23 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -587,8 +587,9 @@ SetClassLongA ( int nIndex, LONG dwNewLong) { + UNICODE_STRING str2buf; PUNICODE_STRING str; - PUNICODE_STRING str2; + PUNICODE_STRING str2 = &str2buf; if ( nIndex != GCL_MENUNAME ) { @@ -600,7 +601,7 @@ SetClassLongA ( } else { - RtlCreateUnicodeString ( str2, (LPWSTR)dwNewLong ); + RtlCreateUnicodeStringFromAsciiz ( &str2buf,(LPSTR)dwNewLong ); } str = (PUNICODE_STRING)NtUserSetClassLong(hWnd, nIndex, (DWORD)str2, TRUE); @@ -630,8 +631,9 @@ SetClassLongW( int nIndex, LONG dwNewLong) { + UNICODE_STRING str2buf; PUNICODE_STRING str; - PUNICODE_STRING str2; + PUNICODE_STRING str2 = &str2buf; if (nIndex != GCL_MENUNAME ) { @@ -643,7 +645,7 @@ SetClassLongW( } else { - RtlCreateUnicodeStringFromAsciiz ( str2,(LPSTR)dwNewLong ); + RtlCreateUnicodeString ( &str2buf, (LPWSTR)dwNewLong ); } str = (PUNICODE_STRING)NtUserSetClassLong(hWnd, nIndex, (DWORD)str2, TRUE); diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index a35bf7d1615..3e96bf1ad6a 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.140 2004/05/26 18:59:21 weiden Exp $ +/* $Id: defwnd.c,v 1.141 2004/07/03 17:40:23 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -496,7 +496,7 @@ DefWndDoSizeMove(HWND hwnd, WORD wParam) BOOL moved = FALSE; DWORD dwPoint = GetMessagePos(); BOOL DragFullWindows = FALSE; - HWND hWndParent; + HWND hWndParent = NULL; SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS, 0, &DragFullWindows, 0); diff --git a/reactos/lib/user32/windows/mdi.c b/reactos/lib/user32/windows/mdi.c index baf4dbf369f..fb7db4890e1 100644 --- a/reactos/lib/user32/windows/mdi.c +++ b/reactos/lib/user32/windows/mdi.c @@ -1316,7 +1316,7 @@ static void MDI_UpdateFrameText( HWND frame, HWND hClient, static LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode ) { - MDICLIENTINFO *ci; + MDICLIENTINFO *ci = NULL; if (WM_NCCREATE != message && WM_CREATE != message && NULL == (ci = get_client_info(hwnd))) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index bdd841fdf16..75d94006c74 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -900,7 +900,7 @@ DefWndDoButton(HWND hWnd, WPARAM wParam) BOOL InBtn, HasBtn = FALSE; ULONG Btn, Style; WPARAM SCMsg, CurBtn = wParam, OrigBtn = wParam; - HDC WindowDC; + HDC WindowDC = NULL; Style = GetWindowLongW(hWnd, GWL_STYLE); switch(wParam) diff --git a/reactos/lib/ws2_32/misc/ns.c b/reactos/lib/ws2_32/misc/ns.c index eb6799e2559..3121a3cda20 100644 --- a/reactos/lib/ws2_32/misc/ns.c +++ b/reactos/lib/ws2_32/misc/ns.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/09-2000 Created */ +#define __NO_CTYPE_INLINES #include #include diff --git a/reactos/lib/ws2_32/misc/stubs.c b/reactos/lib/ws2_32/misc/stubs.c index f3b9d1be9e1..332ef500b8e 100644 --- a/reactos/lib/ws2_32/misc/stubs.c +++ b/reactos/lib/ws2_32/misc/stubs.c @@ -377,7 +377,7 @@ WSADuplicateSocketW( Error = Provider->ProcTable.lpWSPDuplicateSocket(s, dwProcessId, lpProtocolInfo, - &Error); + &Errno); DereferenceProviderByPointer(Provider); if (Error == SOCKET_ERROR) @@ -434,7 +434,6 @@ WSAGetOverlappedResult( OUT LPDWORD lpdwFlags) { INT Errno; - int Error; BOOL Success; PCATALOG_ENTRY Provider; @@ -455,7 +454,7 @@ WSAGetOverlappedResult( lpcbTransfer, fWait, lpdwFlags, - &Error); + &Errno); DereferenceProviderByPointer(Provider); if (Success == FALSE) diff --git a/reactos/ntoskrnl/io/deviface.c b/reactos/ntoskrnl/io/deviface.c index 7cb0d5192b0..cf51fa6e28b 100644 --- a/reactos/ntoskrnl/io/deviface.c +++ b/reactos/ntoskrnl/io/deviface.c @@ -109,11 +109,11 @@ IoGetDeviceInterfaces( HANDLE SubKey; HANDLE SymbolicLinkKey; PKEY_FULL_INFORMATION fip; - PKEY_FULL_INFORMATION bfip; + PKEY_FULL_INFORMATION bfip = NULL; PKEY_BASIC_INFORMATION bip; - PKEY_VALUE_PARTIAL_INFORMATION vpip; + PKEY_VALUE_PARTIAL_INFORMATION vpip = NULL; PWCHAR SymLinkList = NULL; - ULONG SymLinkListSize; + ULONG SymLinkListSize = 0; NTSTATUS Status; ULONG Size = 0; ULONG i = 0; diff --git a/reactos/ntoskrnl/io/resource.c b/reactos/ntoskrnl/io/resource.c index d4fd336c260..4ba00fd14f6 100644 --- a/reactos/ntoskrnl/io/resource.c +++ b/reactos/ntoskrnl/io/resource.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: resource.c,v 1.16 2004/06/20 04:50:02 vizzini Exp $ +/* $Id: resource.c,v 1.17 2004/07/03 17:40:24 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/resource.c @@ -125,7 +125,7 @@ IopQueryDeviceDescription( ULONG Bus, PKEY_VALUE_FULL_INFORMATION *BusInformation) { - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; /* Controller Stuff */ UNICODE_STRING ControllerString; @@ -481,13 +481,13 @@ IopQueryBusDescription( UNICODE_STRING SubRootRegName; UNICODE_STRING BusString; UNICODE_STRING SubBusString; - ULONG LenBasicInformation; + ULONG LenBasicInformation = 0; ULONG LenFullInformation; ULONG LenKeyFullInformation; ULONG LenKey; HANDLE SubRootKeyHandle; PKEY_FULL_INFORMATION FullInformation; - PKEY_BASIC_INFORMATION BasicInformation; + PKEY_BASIC_INFORMATION BasicInformation = NULL; OBJECT_ATTRIBUTES ObjectAttributes; PKEY_VALUE_FULL_INFORMATION BusInformation[3] = {NULL, NULL, NULL}; diff --git a/reactos/subsys/system/cmd/dir.c b/reactos/subsys/system/cmd/dir.c index 653f711e5c9..94b76df00bc 100644 --- a/reactos/subsys/system/cmd/dir.c +++ b/reactos/subsys/system/cmd/dir.c @@ -1,4 +1,4 @@ -/* $Id: dir.c,v 1.9 2004/04/30 16:52:41 navaraf Exp $ +/* $Id: dir.c,v 1.10 2004/07/03 17:40:24 navaraf Exp $ * * DIR.C - dir internal command. * @@ -862,7 +862,7 @@ DirList (LPTSTR szPath, LPTSTR szFilespec, LPINT pLine, DWORD dwFlags) TCHAR buffer[32]; ULONG filecount = 0; ULONG dircount = 0; - INT count; + INT count = 0; USHORT screenwidth; INT longestfname = 0; diff --git a/reactos/subsys/system/format/format.c b/reactos/subsys/system/format/format.c index d556f9ee112..c29512de76f 100755 --- a/reactos/subsys/system/format/format.c +++ b/reactos/subsys/system/format/format.c @@ -265,7 +265,7 @@ BOOLEAN LoadFMIFSEntryPoints() int wmain( int argc, WCHAR *argv[] ) { int badArg; - DWORD media; + DWORD media = FMIFS_HARDDISK; DWORD driveType; WCHAR fileSystem[1024]; WCHAR volumeName[1024]; @@ -326,10 +326,6 @@ int wmain( int argc, WCHAR *argv[] ) fgetws( input, sizeof(input)/2, stdin ); media = FMIFS_FLOPPY; - - - driveType = DRIVE_FIXED; - media = FMIFS_HARDDISK; } // diff --git a/reactos/subsys/system/services/database.c b/reactos/subsys/system/services/database.c index 83888bc17fe..31127b8b8be 100644 --- a/reactos/subsys/system/services/database.c +++ b/reactos/subsys/system/services/database.c @@ -1,4 +1,4 @@ -/* $Id: database.c,v 1.16 2004/04/12 17:20:47 navaraf Exp $ +/* $Id: database.c,v 1.17 2004/07/03 17:40:24 navaraf Exp $ * * service control manager * @@ -680,7 +680,7 @@ ScmAutoStartServices(VOID) { CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if ((CurrentGroup->GroupName.Length > 0) && + if ((CurrentService->ServiceGroup.Length == 0) && (CurrentService->Start == SERVICE_AUTO_START) && (CurrentService->ServiceVisited == FALSE)) { @@ -698,7 +698,7 @@ ScmAutoStartServices(VOID) { CurrentService = CONTAINING_RECORD(ServiceEntry, SERVICE, ServiceListEntry); - if ((CurrentGroup->GroupName.Length == 0) && + if ((CurrentService->ServiceGroup.Length == 0) && (CurrentService->Start == SERVICE_AUTO_START) && (CurrentService->ServiceVisited == FALSE)) { diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 7dd5bd4ab1d..8b2cec9342b 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.30 2004/05/25 15:53:16 navaraf Exp $ +/* $Id: winlogon.c,v 1.31 2004/07/03 17:40:24 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -805,7 +805,7 @@ DoLogin(PWLSESSION Session) DWORD WlxAction, Options; WLX_MPR_NOTIFY_INFO MprNotifyInfo; PWLX_PROFILE_V2_0 Profile; - PSID LogonSid; + PSID LogonSid = NULL; HANDLE Token; /* FIXME - Create a Logon Sid diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index e85958231ab..339bcb66c0d 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib16bpp.c,v 1.33 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.34 2004/07/03 17:40:24 navaraf Exp $ */ #include VOID @@ -270,16 +270,16 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG wd, Dest, Source, Pattern = 0, PatternY; + ULONG wd, Dest, Source = 0, Pattern = 0; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; ULONG RoundedRight; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; if (Rop4 == SRCCOPY) { diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 00e1f8cd820..bace95e7501 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib1bpp.c,v 1.30 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.31 2004/07/03 17:40:24 navaraf Exp $ */ #include VOID @@ -346,17 +346,17 @@ DIB_1BPP_BitBlt( XLATEOBJ *ColorTranslation, ULONG Rop4) { ULONG X, Y, SourceX, SourceY, k; - ULONG Dest, Source, Pattern = 0; + ULONG Dest, Source = 0, Pattern = 0; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; ULONG RoundedRight; BYTE NoBits; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; if (Rop4 == SRCCOPY) { @@ -403,8 +403,6 @@ DIB_1BPP_BitBlt( for (Y = DestRect->top; Y < DestRect->bottom; Y++) { - ULONG PatternY; - SourceX = SourcePoint->x; DestBits = (PULONG)( DestSurf->pvScan0 + diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 56e35822bce..9d158967ab6 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib24bpp.c,v 1.29 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib24bpp.c,v 1.30 2004/07/03 17:40:24 navaraf Exp $ */ #include VOID @@ -243,15 +243,15 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG Dest, Source, Pattern = 0, PatternY; + ULONG Dest, Source = 0, Pattern = 0; PBYTE DestBits; BOOL UsesSource; BOOL UsesPattern; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; if (Rop4 == SRCCOPY) { diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index fe378627eda..a9ffaaf613c 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib32bpp.c,v 1.28 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.29 2004/07/03 17:40:24 navaraf Exp $ */ #include VOID @@ -292,15 +292,15 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, { ULONG X, Y; ULONG SourceX, SourceY; - ULONG Dest, Source, Pattern = 0, wd; + ULONG Dest, Source = 0, Pattern = 0, wd; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; if (Rop4 == SRCCOPY) { @@ -351,7 +351,6 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (Y = DestRect->top; Y < DestRect->bottom; Y++) { - ULONG PatternY; SourceX = SourcePoint->x; if(UsesPattern) diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index a1cb1e208e8..6f25051fb5f 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib4bpp.c,v 1.36 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.37 2004/07/03 17:40:24 navaraf Exp $ */ #include VOID @@ -227,16 +227,16 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, XLATEOBJ *ColorTranslation, ULONG Rop4) { LONG i, j, sx, sy; - ULONG Dest, Source, Pattern = 0, PatternY; + ULONG Dest, Source = 0, Pattern = 0; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; LONG RoundedRight; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; static const ULONG ExpandSolidColor[16] = { 0x00000000 /* 0 */, diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index f565135c168..2c189913c33 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib8bpp.c,v 1.27 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.28 2004/07/03 17:40:24 navaraf Exp $ */ #include VOID @@ -265,16 +265,16 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, XLATEOBJ *ColorTranslation, ULONG Rop4) { LONG i, j, k, sx, sy; - ULONG Dest, Source, Pattern = 0, PatternY; + ULONG Dest, Source = 0, Pattern = 0; PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; LONG RoundedRight; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; if (Rop4 == SRCCOPY) { diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index 64f769cc76a..ae128872510 100644 --- a/reactos/subsys/win32k/eng/bitblt.c +++ b/reactos/subsys/win32k/eng/bitblt.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitblt.c,v 1.56 2004/07/03 13:55:35 navaraf Exp $ +/* $Id: bitblt.c,v 1.57 2004/07/03 17:40:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -88,10 +88,10 @@ BltMask(SURFOBJ* Dest, BYTE *tMask, *lMask; static BYTE maskbit[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHOBJ GdiBrush = NULL; HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj; - ULONG PatternWidth, PatternHeight, PatternY; + SURFOBJ *PatternObj = NULL; + ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; if (Mask == NULL) { @@ -243,7 +243,7 @@ EngBitBlt(SURFOBJ *DestObj, SURFOBJ* InputObj; SURFOBJ* OutputObj; PBLTRECTFUNC BltRectFunc; - BOOLEAN Ret; + BOOLEAN Ret = TRUE; RECTL ClipRect; unsigned i; POINTL Pt; @@ -846,7 +846,7 @@ EngMaskBitBlt(SURFOBJ *DestObj, INTENG_ENTER_LEAVE EnterLeaveDest; SURFOBJ* InputObj; SURFOBJ* OutputObj; - BOOLEAN Ret; + BOOLEAN Ret = TRUE; RECTL ClipRect; unsigned i; POINTL Pt; diff --git a/reactos/subsys/win32k/eng/misc.c b/reactos/subsys/win32k/eng/misc.c index 3288c27bed2..6fd3236d145 100644 --- a/reactos/subsys/win32k/eng/misc.c +++ b/reactos/subsys/win32k/eng/misc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: misc.c,v 1.8 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: misc.c,v 1.9 2004/07/03 17:40:25 navaraf Exp $ */ #include BOOL STDCALL @@ -134,7 +134,7 @@ BOOL STDCALL IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave) { POINTL SrcPoint; - BOOL Result; + BOOL Result = TRUE; if (EnterLeave->OutputObj != EnterLeave->DestObj && NULL != EnterLeave->OutputObj) { diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index 3dc43862994..e580cd5c59d 100644 --- a/reactos/subsys/win32k/eng/mouse.c +++ b/reactos/subsys/win32k/eng/mouse.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: mouse.c,v 1.74 2004/07/03 13:55:35 navaraf Exp $ +/* $Id: mouse.c,v 1.75 2004/07/03 17:40:25 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -630,6 +630,7 @@ EngSetPointerShape( case BMF_16BPP: lDelta = Size.cx << 1; break; case BMF_24BPP: lDelta = Size.cx * 3; break; case BMF_32BPP: lDelta = Size.cx << 2; break; + default: lDelta = 0; break; } ppdev->PointerSaveSurface = (HSURF)EngCreateBitmap( diff --git a/reactos/subsys/win32k/eng/transblt.c b/reactos/subsys/win32k/eng/transblt.c index 0fdb080359b..cd934a1e2b7 100644 --- a/reactos/subsys/win32k/eng/transblt.c +++ b/reactos/subsys/win32k/eng/transblt.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: transblt.c,v 1.20 2004/07/03 13:55:35 navaraf Exp $ +/* $Id: transblt.c,v 1.21 2004/07/03 17:40:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -39,7 +39,7 @@ EngTransparentBlt(SURFOBJ *Dest, ULONG iTransColor, ULONG Reserved) { - BOOL Ret; + BOOL Ret = TRUE; BYTE ClippingType; INTENG_ENTER_LEAVE EnterLeaveSource, EnterLeaveDest; SURFOBJ *InputObj, *OutputObj; diff --git a/reactos/subsys/win32k/ntuser/message.c b/reactos/subsys/win32k/ntuser/message.c index 8d9ebf17a75..a55a258d286 100644 --- a/reactos/subsys/win32k/ntuser/message.c +++ b/reactos/subsys/win32k/ntuser/message.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: message.c,v 1.70 2004/06/16 06:09:40 gvg Exp $ +/* $Id: message.c,v 1.71 2004/07/03 17:40:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -287,7 +287,7 @@ NtUserDispatchMessage(PNTUSERDISPATCHMESSAGEINFO UnsafeMsgInfo) NTSTATUS Status; NTUSERDISPATCHMESSAGEINFO MsgInfo; PWINDOW_OBJECT WindowObject; - LRESULT Result; + LRESULT Result = TRUE; Status = MmCopyFromCaller(&MsgInfo, UnsafeMsgInfo, sizeof(NTUSERDISPATCHMESSAGEINFO)); if (! NT_SUCCESS(Status)) @@ -1397,7 +1397,7 @@ IntDoSendMessage(HWND Wnd, PDOSENDMESSAGE dsm, PNTUSERSENDMESSAGEINFO UnsafeInfo) { - LRESULT Result; + LRESULT Result = TRUE; NTSTATUS Status; PWINDOW_OBJECT Window; NTUSERSENDMESSAGEINFO Info; diff --git a/reactos/subsys/win32k/ntuser/scrollbar.c b/reactos/subsys/win32k/ntuser/scrollbar.c index 8b803d6b962..741cd9dff84 100644 --- a/reactos/subsys/win32k/ntuser/scrollbar.c +++ b/reactos/subsys/win32k/ntuser/scrollbar.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: scrollbar.c,v 1.33 2004/05/12 09:47:16 gvg Exp $ +/* $Id: scrollbar.c,v 1.34 2004/07/03 17:40:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -805,6 +805,7 @@ NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) Style = WS_HSCROLL | WS_VSCROLL; break; case SB_CTL: + Style = 0; break; default: IntReleaseWindowObject(Window); diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index dd68202915c..570fc5fabbd 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: window.c,v 1.241 2004/06/22 12:43:49 royce Exp $ +/* $Id: window.c,v 1.242 2004/07/03 17:40:25 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -456,7 +456,7 @@ IntSetMenu( HMENU Menu, BOOL *Changed) { - PMENU_OBJECT OldMenuObject, NewMenuObject; + PMENU_OBJECT OldMenuObject, NewMenuObject = NULL; *Changed = (WindowObject->IDMenu != (UINT) Menu); if (! *Changed) @@ -3153,7 +3153,7 @@ LONG STDCALL NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi) { PWINDOW_OBJECT WindowObject, Parent; - LONG Result; + LONG Result = 0; DPRINT("NtUserGetWindowLong(%x,%d,%d)\n", hWnd, (INT)Index, Ansi); @@ -4193,7 +4193,7 @@ DWORD IntAddWndProcHandle(WNDPROC WindowProc, BOOL IsUnicode) { WORD i; - WORD FreeSpot; + WORD FreeSpot = 0; BOOL found; WndProcHandle *OldArray; WORD OldArraySize; diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 92aa42b2f36..8c1980c6f77 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmaps.c,v 1.76 2004/07/03 13:55:36 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.77 2004/07/03 17:40:27 navaraf Exp $ */ #include #define IN_RECT(r,x,y) \ @@ -47,7 +47,7 @@ NtGdiBitBlt( BOOL Status; PPALGDI PalDestGDI, PalSourceGDI; XLATEOBJ *XlateObj = NULL; - HPALETTE SourcePalette, DestPalette; + HPALETTE SourcePalette = 0, DestPalette = 0; ULONG SourceMode, DestMode; PGDIBRUSHOBJ BrushObj; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); @@ -266,11 +266,11 @@ NtGdiTransparentBlt( RECTL rcDest, rcSrc; BITMAPOBJ *BitmapDest, *BitmapSrc; XLATEOBJ *XlateObj; - HPALETTE SourcePalette, DestPalette; + HPALETTE SourcePalette = 0, DestPalette = 0; PPALGDI PalDestGDI, PalSourceGDI; USHORT PalDestMode, PalSrcMode; - ULONG TransparentColor; - BOOL Ret; + ULONG TransparentColor = 0; + BOOL Ret = FALSE; if(!(DCDest = DC_LockDc(hdcDst))) { @@ -582,7 +582,7 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) BOOL bInRect = FALSE; BITMAPOBJ *BitmapObject; SURFOBJ *SurfaceObject; - HPALETTE Pal; + HPALETTE Pal = 0; PPALGDI PalGDI; USHORT PalMode; XLATEOBJ *XlateObj; @@ -1046,7 +1046,7 @@ NtGdiStretchBlt( BOOL Status; PPALGDI PalDestGDI, PalSourceGDI; XLATEOBJ *XlateObj = NULL; - HPALETTE SourcePalette, DestPalette; + HPALETTE SourcePalette = 0, DestPalette = 0; ULONG SourceMode, DestMode; PGDIBRUSHOBJ BrushObj; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index ac0937ba0f1..4ab20927155 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: brush.c,v 1.38 2004/07/03 13:55:36 navaraf Exp $ + * $Id: brush.c,v 1.39 2004/07/03 17:40:27 navaraf Exp $ */ #include @@ -50,7 +50,7 @@ IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) { PGDIBRUSHOBJ BrushObject; HBRUSH hBrush; - HBITMAP hPattern; + HBITMAP hPattern = 0; switch (LogBrush->lbStyle) { @@ -129,7 +129,7 @@ IntPatBlt( RECTL DestRect; BITMAPOBJ *BitmapObj; POINTL BrushOrigin; - BOOL ret; + BOOL ret = TRUE; BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); if (BitmapObj == NULL) @@ -354,7 +354,7 @@ NtGdiPolyPatBlt( INT cRects, ULONG Reserved) { - PPATRECT rb; + PPATRECT rb = NULL; NTSTATUS Status; BOOL Ret; diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 709c11afc85..0d55a75e9f8 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.47 2004/07/03 13:55:36 navaraf Exp $ */ +/* $Id: color.c,v 1.48 2004/07/03 17:40:27 navaraf Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -440,7 +440,7 @@ HPALETTE STDCALL NtGdiSelectPalette(HDC hDC, BOOL ForceBackground) { PDC dc; - HPALETTE oldPal; + HPALETTE oldPal = NULL; PPALGDI PalGDI; // FIXME: mark the palette as a [fore\back]ground pal diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 995f10e0237..0e951e5f0e1 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.58 2004/07/03 13:55:36 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.59 2004/07/03 17:40:27 navaraf Exp $ */ #include PCURICON_OBJECT FASTCALL @@ -1077,7 +1077,7 @@ NtUserDrawIconEx( COLORREF oldFg, oldBg; HDC hdcMem, hdcOff = (HDC)0; HBITMAP hbmOff = (HBITMAP)0; - HGDIOBJ hOldOffBrush, hOldOffBmp, hOldMem; + HGDIOBJ hOldOffBrush = 0, hOldOffBmp = 0, hOldMem; BOOL Ret = FALSE; #if CANSTRETCHBLT INT nStretchMode; diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 9b32c7ab2b5..9667640e560 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.142 2004/07/03 13:55:36 navaraf Exp $ +/* $Id: dc.c,v 1.143 2004/07/03 17:40:27 navaraf Exp $ * * DC.C - Device context functions * @@ -940,6 +940,7 @@ NtGdiGetCurrentObject(HDC hDC, UINT ObjectType) break; case OBJ_PAL: DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_PAL not supported yet!\n"); + SelObject = NULL; break; case OBJ_FONT: SelObject = dc->w.hFont; @@ -949,6 +950,7 @@ NtGdiGetCurrentObject(HDC hDC, UINT ObjectType) break; case OBJ_COLORSPACE: DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_COLORSPACE not supported yet!\n"); + SelObject = NULL; break; default: SelObject = NULL; @@ -1742,7 +1744,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) PPALGDI PalGDI; DWORD objectType; COLORREF MonoColorMap[2]; - ULONG NumColors; + ULONG NumColors = 0; HRGN hVisRgn; USHORT Mode; @@ -2187,7 +2189,7 @@ IntGetDCColor(HDC hDC, ULONG Object) PGDIBRUSHOBJ pen; PGDIBRUSHOBJ brush; XLATEOBJ *XlateObj; - HPALETTE Pal; + HPALETTE Pal = 0; USHORT Mode; ULONG iColor; @@ -2279,7 +2281,7 @@ IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color) PGDIBRUSHOBJ pen; PGDIBRUSHOBJ brush; XLATEOBJ *XlateObj; - HPALETTE Pal; + HPALETTE Pal = 0; USHORT Mode; ULONG iColor; diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index ca7bcc5be27..86324311b3c 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: line.c,v 1.34 2004/07/03 13:55:37 navaraf Exp $ */ +/* $Id: line.c,v 1.35 2004/07/03 17:40:27 navaraf Exp $ */ #include // Some code from the WINE project source (www.winehq.com) @@ -52,7 +52,7 @@ IntGdiLineTo(DC *dc, int YEnd) { BITMAPOBJ *BitmapObj; - BOOL Ret; + BOOL Ret = TRUE; PGDIBRUSHOBJ PenBrushObj; RECTL Bounds; POINT Points[2]; diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 08390bf1041..005df53c83b 100644 --- a/reactos/subsys/win32k/objects/path.c +++ b/reactos/subsys/win32k/objects/path.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: path.c,v 1.22 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: path.c,v 1.23 2004/07/03 17:40:27 navaraf Exp $ */ #include #include @@ -403,7 +403,6 @@ PATH_Arc ( PDC dc, INT x1, INT y1, INT x2, INT y2, INT xStart, INT yStart, INT xEnd, INT yEnd) { GdiPath *pPath; - DC *pDC; double angleStart, angleEnd, angleStartQuadrant, angleEndQuadrant=0.0; /* Initialize angleEndQuadrant to silence gcc's warning */ double x, y; @@ -442,10 +441,10 @@ PATH_Arc ( PDC dc, INT x1, INT y1, INT x2, INT y2, pointStart.y=(FLOAT)yStart; pointEnd.x=(FLOAT)xEnd; pointEnd.y=(FLOAT)yEnd; - INTERNAL_LPTODP_FLOAT(pDC, corners); - INTERNAL_LPTODP_FLOAT(pDC, corners+1); - INTERNAL_LPTODP_FLOAT(pDC, &pointStart); - INTERNAL_LPTODP_FLOAT(pDC, &pointEnd); + INTERNAL_LPTODP_FLOAT(dc, corners); + INTERNAL_LPTODP_FLOAT(dc, corners+1); + INTERNAL_LPTODP_FLOAT(dc, &pointStart); + INTERNAL_LPTODP_FLOAT(dc, &pointEnd); /* Make sure first corner is top left and second corner is bottom right */ if ( corners[0].x > corners[1].x ) diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index d19dc086b93..21658a98a9f 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -/* $Id: region.c,v 1.60 2004/07/03 13:55:37 navaraf Exp $ */ +/* $Id: region.c,v 1.61 2004/07/03 17:40:27 navaraf Exp $ */ #include #include @@ -2209,14 +2209,8 @@ NtGdiExtCreateRegion(CONST PXFORM Xform, DWORD Count, CONST PROSRGNDATA RgnData) { - HRGN hRgn; - - // FIXME: Apply Xform transformation to the regional data - if(Xform != NULL) { - - } - - return hRgn; + UNIMPLEMENTED; + return 0; } BOOL diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 29cd537776d..4b9856c8088 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.101 2004/07/03 13:55:37 navaraf Exp $ */ +/* $Id: text.c,v 1.102 2004/07/03 17:40:27 navaraf Exp $ */ #include #include @@ -1993,7 +1993,7 @@ NtGdiGetCharWidth32(HDC hDC, FT_Face face; FT_CharMap charmap, found = NULL; UINT i, glyph_index, BufferSize; - HFONT hFont; + HFONT hFont = 0; if (LastChar < FirstChar) { From 4d9b237e6d38b09ca924677fac0310581fe56609 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 3 Jul 2004 18:41:56 +0000 Subject: [PATCH 182/356] - Don't use the "cpu" directive because NASM 0.98 doesn't support it. svn path=/trunk/; revision=9985 --- reactos/lib/pseh/i386/framebased.asm | 3 ++- reactos/lib/pseh/i386/setjmp.asm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/pseh/i386/framebased.asm b/reactos/lib/pseh/i386/framebased.asm index 50adede06e3..0db8ad10d0d 100644 --- a/reactos/lib/pseh/i386/framebased.asm +++ b/reactos/lib/pseh/i386/framebased.asm @@ -18,7 +18,8 @@ ; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ; SOFTWARE. -cpu 486 +; DON'T USE THE "cpu" DIRECTIVE BECAUSE NASM 0.98 DOESN'T SUPPORT IT +; cpu 486 segment .text use32 global __SEHCleanHandlerEnvironment diff --git a/reactos/lib/pseh/i386/setjmp.asm b/reactos/lib/pseh/i386/setjmp.asm index abc81b10095..a46897071a7 100644 --- a/reactos/lib/pseh/i386/setjmp.asm +++ b/reactos/lib/pseh/i386/setjmp.asm @@ -18,7 +18,8 @@ ; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ; SOFTWARE. -cpu 486 +; DON'T USE THE "cpu" DIRECTIVE BECAUSE NASM 0.98 DOESN'T SUPPORT IT +; cpu 486 segment .text use32 ; Note: the undecorated names are for Borland C++ (and possibly other compilers From 0c94f9e2c2483ece829666fa935b3b0682db9f91 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 3 Jul 2004 22:36:01 +0000 Subject: [PATCH 183/356] - Fixed buffer handling and coordinate translation in IntGdiPolyline. svn path=/trunk/; revision=9986 --- reactos/subsys/win32k/objects/line.c | 81 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 42 deletions(-) diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 86324311b3c..ade99359842 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: line.c,v 1.35 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: line.c,v 1.36 2004/07/03 22:36:01 navaraf Exp $ */ #include // Some code from the WINE project source (www.winehq.com) @@ -188,56 +188,53 @@ IntGdiPolyline(DC *dc, LPPOINT pt, int Count) { - BITMAPOBJ *BitmapObj; - BOOL ret = FALSE; // default to failure - LONG i; - PGDIBRUSHOBJ PenBrushObj; - POINT *pts; + BITMAPOBJ *BitmapObj; + GDIBRUSHOBJ *PenBrushObj; + LPPOINT Points; + BOOL Ret = TRUE; + LONG i; - if ( PATH_IsPathOpen ( dc->w.path ) ) - return PATH_Polyline ( dc, pt, Count ); + if (PATH_IsPathOpen(dc->w.path)) + return PATH_Polyline(dc, pt, Count); - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); - ASSERT(BitmapObj); + /* Get BRUSHOBJ from current pen. */ + PenBrushObj = PENOBJ_LockPen(dc->w.hPen); + ASSERT(PenBrushObj); - //Allocate "Count" bytes of memory to hold a safe copy of pt - pts = (POINT*)ExAllocatePoolWithTag ( PagedPool, sizeof(POINT)*Count, TAG_SHAPE ); - if ( pts ) - { - // safely copy pt to local version - if ( STATUS_SUCCESS == MmCopyFromCaller(pts, pt, sizeof(POINT)*Count) ) - { - //offset the array of point by the dc->w.DCOrg - for ( i = 0; i < Count; i++ ) + if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) + { + Points = EngAllocMem(0, Count * sizeof(POINT), TAG_COORD); + if (Points != NULL) { - pts[i].x += dc->w.DCOrgX; - pts[i].y += dc->w.DCOrgY; + BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + ASSERT(BitmapObj); + + RtlCopyMemory(Points, pt, Count * sizeof(POINT)); + IntLPtoDP(dc, Points, Count); + + /* Offset the array of point by the dc->w.DCOrg */ + for (i = 0; i < Count; i++) + { + Points[i].x += dc->w.DCOrgX; + Points[i].y += dc->w.DCOrgY; + } + + Ret = IntEngPolyline(BitmapObj, dc->CombinedClip, + &PenBrushObj->BrushObject, Points, Count, + dc->w.ROPmode); + + BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); + EngFreeMem(Points); } - - /* get BRUSHOBJ from current pen. */ - PenBrushObj = PENOBJ_LockPen( dc->w.hPen ); - ASSERT(PenBrushObj); - - if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) + else { - //get IntEngPolyline to do the drawing. - ret = IntEngPolyline(BitmapObj, - dc->CombinedClip, - &PenBrushObj->BrushObject, - pts, - Count, - dc->w.ROPmode); + Ret = FALSE; } + } - PENOBJ_UnlockPen( dc->w.hPen ); - } + PENOBJ_UnlockPen(dc->w.hPen); - ExFreePool ( pts ); - } - - BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); - - return ret; + return Ret; } BOOL FASTCALL From 05345c056a9f9c8de5da0b1a2cad5fa54f4b33bd Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 3 Jul 2004 22:36:27 +0000 Subject: [PATCH 184/356] - Allocate memory from paged pool in EngAllocMem. svn path=/trunk/; revision=9987 --- reactos/subsys/win32k/eng/mem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/eng/mem.c b/reactos/subsys/win32k/eng/mem.c index 61524e3a4ee..79ace46beca 100644 --- a/reactos/subsys/win32k/eng/mem.c +++ b/reactos/subsys/win32k/eng/mem.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: mem.c,v 1.16 2004/05/10 17:07:17 weiden Exp $ +/* $Id: mem.c,v 1.17 2004/07/03 22:36:27 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -46,7 +46,7 @@ EngAllocMem(ULONG Flags, { PVOID newMem; - newMem = ExAllocatePoolWithTag(NonPagedPool, MemSize, Tag); // FIXME: Use PagedPool when it is implemented + newMem = ExAllocatePoolWithTag(PagedPool, MemSize, Tag); if (Flags == FL_ZERO_MEMORY && NULL != newMem) { From f5d1bff687168d51809902f2bdcf9c7b92ba98f2 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Sun, 4 Jul 2004 00:33:26 +0000 Subject: [PATCH 185/356] small fix to constant we aren't even using, yet, but should svn path=/trunk/; revision=9988 --- reactos/include/ntos/except.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ntos/except.h b/reactos/include/ntos/except.h index 753d50a4538..7034cb782e5 100644 --- a/reactos/include/ntos/except.h +++ b/reactos/include/ntos/except.h @@ -14,7 +14,7 @@ typedef enum { ExceptionContinueSearch, ExceptionNestedException, ExceptionCollidedUnwind, - ExceptionDismiss /* ??? */ + ExceptionDismiss = 0 /* assuming this is the same thing as DISPOSITION_DISMISS */ } EXCEPTION_DISPOSITION; From 9ac102fb1720823051acf25c00592aabdb51e4cf Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 01:23:32 +0000 Subject: [PATCH 186/356] - Support resursive locking of the GDI objects. - Call EngMovePointer instead of DrvMovePointer if driver DrvSetPointerShape returned SPS_DECLINE. svn path=/trunk/; revision=9989 --- reactos/include/win32k/dc.h | 2 + reactos/include/win32k/gdiobj.h | 4 +- reactos/subsys/win32k/ntuser/input.c | 11 ++--- reactos/subsys/win32k/objects/cursoricon.c | 18 ++++--- reactos/subsys/win32k/objects/gdiobj.c | 55 +++++++++++++++++++++- 5 files changed, 73 insertions(+), 17 deletions(-) diff --git a/reactos/include/win32k/dc.h b/reactos/include/win32k/dc.h index 4f877f0bfd9..dc7cf9e0cae 100644 --- a/reactos/include/win32k/dc.h +++ b/reactos/include/win32k/dc.h @@ -116,6 +116,8 @@ typedef struct DRIVER_FUNCTIONS DriverFunctions; PFILE_OBJECT VideoFileObject; + PGD_MOVEPOINTER MovePointer; + struct { BOOL Enable; LONG Column; diff --git a/reactos/include/win32k/gdiobj.h b/reactos/include/win32k/gdiobj.h index fd2ac756d9a..801b50eb021 100644 --- a/reactos/include/win32k/gdiobj.h +++ b/reactos/include/win32k/gdiobj.h @@ -49,7 +49,9 @@ typedef struct _GDIOBJHDR WORD Magic; const char* lockfile; int lockline; - FAST_MUTEX Lock; +/* FAST_MUTEX Lock;*/ + DWORD LockTid; + DWORD LockCount; } GDIOBJHDR, *PGDIOBJHDR; typedef struct _GDIMULTILOCK diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index e86347993d6..8d8506f2600 100644 --- a/reactos/subsys/win32k/ntuser/input.c +++ b/reactos/subsys/win32k/ntuser/input.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: input.c,v 1.35 2004/07/03 13:55:36 navaraf Exp $ +/* $Id: input.c,v 1.36 2004/07/04 01:23:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -640,14 +640,9 @@ IntMouseInput(MOUSEINPUT *mi) { SurfObj = &BitmapObj->SurfObj; - if(GDIDEVFUNCS(SurfObj).MovePointer) + if (GDIDEV(SurfObj)->MovePointer) { - GDIDEVFUNCS(SurfObj).MovePointer( - SurfObj, MousePos.x, MousePos.y, &PointerRect); - } - else - { - EngMovePointer(SurfObj, MousePos.x, MousePos.y, &PointerRect); + GDIDEV(SurfObj)->MovePointer(SurfObj, MousePos.x, MousePos.y, &PointerRect); } BITMAPOBJ_UnlockBitmap(hBitmap); diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 0e951e5f0e1..3acd970ed80 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.59 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.60 2004/07/04 01:23:32 navaraf Exp $ */ #include PCURICON_OBJECT FASTCALL @@ -88,10 +88,8 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, if (NULL != CurInfo->CurrentCursorObject && CurInfo->ShowingCursor) { /* Remove the cursor if it was displayed */ - if (GDIDEVFUNCS(SurfObj).MovePointer) - GDIDEVFUNCS(SurfObj).MovePointer(SurfObj, -1, -1, &PointerRect); - else - EngMovePointer(SurfObj, -1, -1, &PointerRect); + if (GDIDEV(SurfObj)->MovePointer) + GDIDEV(SurfObj)->MovePointer(SurfObj, -1, -1, &PointerRect); SetPointerRect(CurInfo, &PointerRect); } @@ -174,13 +172,15 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->y, &PointerRect, SPS_CHANGE); + DbgPrint("SetCursor: DrvSetPointerShape() returned %x\n", + GDIDEV(SurfObj)->PointerStatus); } else { GDIDEV(SurfObj)->PointerStatus = SPS_DECLINE; } - if(((GDIDEVICE *)SurfObj->hdev)->PointerStatus == SPS_DECLINE) + if(GDIDEV(SurfObj)->PointerStatus == SPS_DECLINE) { GDIDEV(SurfObj)->PointerStatus = EngSetPointerShape( SurfObj, soMask, soColor, XlateObj, @@ -190,7 +190,11 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->y, &PointerRect, SPS_CHANGE); - DbgPrint("SetCursor: DrvSetPointerShape() returned SPS_DECLINE\n"); + GDIDEV(SurfObj)->MovePointer = EngMovePointer; + } + else + { + GDIDEV(SurfObj)->MovePointer = GDIDEVFUNCS(SurfObj).MovePointer; } SetPointerRect(CurInfo, &PointerRect); diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 0627c3ecbbb..a26e967ddec 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -19,7 +19,7 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.69 2004/07/03 13:55:36 navaraf Exp $ + * $Id: gdiobj.c,v 1.70 2004/07/04 01:23:32 navaraf Exp $ * */ #include @@ -178,6 +178,7 @@ static HGDIOBJ StockObjects[NB_STOCK_OBJECTS]; static PGDI_HANDLE_TABLE HandleTable = 0; static FAST_MUTEX HandleTableMutex; static FAST_MUTEX RefCountHandling; +static LARGE_INTEGER ShortDelay; /*! * Allocate GDI object table. @@ -344,7 +345,12 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) newObject->Magic = GDI_TYPE_TO_MAGIC(ObjectType); newObject->lockfile = NULL; newObject->lockline = 0; +#if 0 ExInitializeFastMutex(&newObject->Lock); +#else + newObject->LockTid = 0; + newObject->LockCount = 0; +#endif HandleTable->Handles[Index] = newObject; #if GDI_COUNT_OBJECTS HandleTable->HandlesCount++; @@ -550,6 +556,8 @@ InitGdiObjectHandleTable (VOID) ExInitializeFastMutex (&HandleTableMutex); ExInitializeFastMutex (&RefCountHandling); + ShortDelay.QuadPart = -100; + HandleTable = GDIOBJ_iAllocHandleTable (GDI_HANDLE_COUNT); DPRINT("HandleTable: %x\n", HandleTable ); @@ -704,6 +712,7 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) return NULL; } +#if 0 #ifdef NDEBUG ExAcquireFastMutex(&ObjHdr->Lock); #else /* NDEBUG */ @@ -719,6 +728,24 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) DPRINT1(" Disregard previous message about object 0x%x, it's ok\n", hObj); } #endif /* NDEBUG */ +#else + if (ObjHdr->LockTid == (DWORD)PsGetCurrentThreadId()) + { + InterlockedIncrement(&ObjHdr->LockCount); + } + else + { + for (;;) + { + if (InterlockedCompareExchange(&ObjHdr->LockTid, (DWORD)PsGetCurrentThreadId(), 0)) + { + InterlockedIncrement(&ObjHdr->LockCount); + break; + } + /* FIXME: KeDelayExecutionThread(KernelMode, FALSE, &ShortDelay); */ + } + } +#endif ExAcquireFastMutex(&RefCountHandling); ObjHdr->dwCount++; @@ -780,7 +807,26 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ObjectType) return NULL; } +#if 0 ExAcquireFastMutex(&ObjHdr->Lock); +#else + if (ObjHdr->LockTid == (DWORD)PsGetCurrentThreadId()) + { + InterlockedIncrement(&ObjHdr->LockCount); + } + else + { + for (;;) + { + if (InterlockedCompareExchange(&ObjHdr->LockTid, (DWORD)PsGetCurrentThreadId(), 0)) + { + InterlockedIncrement(&ObjHdr->LockCount); + break; + } + /* FIXME: KeDelayExecutionThread(KernelMode, FALSE, &ShortDelay); */ + } + } +#endif ExAcquireFastMutex(&RefCountHandling); ObjHdr->dwCount++; @@ -813,7 +859,14 @@ GDIOBJ_UnlockObj(HGDIOBJ hObj, DWORD ObjectType) return FALSE; } +#if 0 ExReleaseFastMutex(&ObjHdr->Lock); +#else + if (InterlockedDecrement(&ObjHdr->LockCount) == 0) + { + InterlockedExchange(&ObjHdr->LockTid, 0); + } +#endif ExAcquireFastMutex(&RefCountHandling); if (0 == (ObjHdr->dwCount & ~0x80000000)) From 31456c578a2674189dfb26641721eddd5ef2c3c2 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 02:01:02 +0000 Subject: [PATCH 187/356] - Don't continue execution if there is no exception handler. It's common that continuing such execution would result in the same exception again and thus creating infinite loop. svn path=/trunk/; revision=9990 --- reactos/lib/rtl/i386/exception.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/lib/rtl/i386/exception.c b/reactos/lib/rtl/i386/exception.c index ea80bc90a4a..961b1376c5d 100644 --- a/reactos/lib/rtl/i386/exception.c +++ b/reactos/lib/rtl/i386/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.1 2004/06/25 01:41:20 hyperion Exp $ +/* $Id: exception.c,v 1.2 2004/07/04 02:01:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -231,6 +231,8 @@ RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, DPRINT("RtlpDispatchException(): Return ExceptionContinueExecution\n"); + ExceptionRecord->ExceptionFlags = EXCEPTION_NONCONTINUABLE; + return ExceptionContinueExecution; } From 62a8ad0e874643e8d11bc1f44e86945fd4049355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 4 Jul 2004 06:56:41 +0000 Subject: [PATCH 188/356] Mike McCormack - Fix a buffer overrun in autocomplete. svn path=/trunk/; revision=9991 --- reactos/lib/shell32/autocomplete.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/shell32/autocomplete.c b/reactos/lib/shell32/autocomplete.c index 50460c4bec9..ebc2bfcc304 100644 --- a/reactos/lib/shell32/autocomplete.c +++ b/reactos/lib/shell32/autocomplete.c @@ -562,7 +562,7 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, HeapFree(GetProcessHeap(), 0, This->txtbackup); This->txtbackup = (WCHAR*) HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, lstrlenW(hwndText)*sizeof(WCHAR)); + HEAP_ZERO_MEMORY, (lstrlenW(hwndText)+1)*sizeof(WCHAR)); lstrcpyW(This->txtbackup, hwndText); /* Returns if there is no text to search and we doesn't want to display all the entries */ From 5c7b116b2889a13c60f4d3ff50f882df6bf48953 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 4 Jul 2004 08:30:28 +0000 Subject: [PATCH 189/356] - Fixed a bug in IoCsqRemoveIrp and IoCsqRemoveNextIrp. svn path=/trunk/; revision=9992 --- reactos/drivers/lib/csq/csq.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/lib/csq/csq.c b/reactos/drivers/lib/csq/csq.c index 1b656724460..ebf66624ff4 100644 --- a/reactos/drivers/lib/csq/csq.c +++ b/reactos/drivers/lib/csq/csq.c @@ -23,6 +23,8 @@ * all happen at DISPATCH_LEVEL all of the time, so thread switching on a single * processor can create races too. */ +/* $Id: csq.c,v 1.4 2004/07/04 08:30:28 hbirr Exp $ */ + #define __NTDRIVER__ #include #include @@ -321,7 +323,7 @@ PIRP NTAPI IoCsqRemoveIrp(PIO_CSQ Csq, /* This IRP is valid and is ours. Dequeue it, fix it up, and return */ Csq->CsqRemoveIrp(Csq, Irp); - Context = (PIO_CSQ_IRP_CONTEXT)InterlockedExchange(Irp->Tail.Overlay.DriverContext[3], 0); + Context = (PIO_CSQ_IRP_CONTEXT)InterlockedExchangePointer(&Irp->Tail.Overlay.DriverContext[3], NULL); if(Context && Context->Type == IO_TYPE_CSQ_IRP_CONTEXT) Context->Irp = NULL; @@ -371,7 +373,7 @@ PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq, Csq->CsqRemoveIrp(Csq, Irp); /* Unset the context stuff and return */ - Context = (PIO_CSQ_IRP_CONTEXT)InterlockedExchange(Irp->Tail.Overlay.DriverContext[3], 0); + Context = (PIO_CSQ_IRP_CONTEXT)InterlockedExchangePointer(&Irp->Tail.Overlay.DriverContext[3], NULL); if(Context && Context->Type == IO_TYPE_CSQ_IRP_CONTEXT) Context->Irp = NULL; From 390647c9fb30bf834890a8e048bd434d882e5aaa Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 11:18:56 +0000 Subject: [PATCH 190/356] - Send the cursor to display driver in top-down format. svn path=/trunk/; revision=9993 --- reactos/subsys/win32k/objects/cursoricon.c | 28 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 3acd970ed80..ddbc4f56631 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.60 2004/07/04 01:23:32 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.61 2004/07/04 11:18:56 navaraf Exp $ */ #include PCURICON_OBJECT FASTCALL @@ -47,6 +47,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, PCURICON_OBJECT OldCursor; HCURSOR Ret = (HCURSOR)0; HBITMAP hColor = (HBITMAP)0; + HBITMAP hMask = 0; SURFOBJ *soMask = NULL, *soColor = NULL; XLATEOBJ *XlateObj = NULL; RECTL PointerRect; @@ -148,7 +149,23 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, MaskBmpObj = BITMAPOBJ_LockBitmap(NewCursor->IconInfo.hbmMask); if(MaskBmpObj) { - soMask = &MaskBmpObj->SurfObj; + RECTL DestRect = {0, 0, MaskBmpObj->SurfObj.sizlBitmap.cx, MaskBmpObj->SurfObj.sizlBitmap.cy}; + POINTL SourcePoint = {0, 0}; + + /* + * NOTE: For now we create the cursor in top-down bitmap, + * because VMware driver rejects it otherwise. This should + * be fixed later. + */ + hMask = EngCreateBitmap( + MaskBmpObj->SurfObj.sizlBitmap, abs(MaskBmpObj->SurfObj.lDelta), + MaskBmpObj->SurfObj.iBitmapFormat, BMF_TOPDOWN, + NULL); + ASSERT(hMask); + soMask = EngLockSurface((HSURF)hMask); + EngCopyBits(soMask, &MaskBmpObj->SurfObj, NULL, NULL, + &DestRect, &SourcePoint); + BITMAPOBJ_UnlockBitmap(NewCursor->IconInfo.hbmMask); } } } @@ -172,7 +189,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, CurInfo->y, &PointerRect, SPS_CHANGE); - DbgPrint("SetCursor: DrvSetPointerShape() returned %x\n", + DPRINT("SetCursor: DrvSetPointerShape() returned %x\n", GDIDEV(SurfObj)->PointerStatus); } else @@ -200,9 +217,10 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, SetPointerRect(CurInfo, &PointerRect); BITMAPOBJ_UnlockBitmap(SurfObj->hsurf); - if(MaskBmpObj) + if(hMask) { - BITMAPOBJ_UnlockBitmap(soMask->hsurf); + EngUnlockSurface(soMask); + EngDeleteSurface((HSURF)hMask); } if(hColor) { From 78ae71475473938da16e8bbfe9c858e48e858710 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 12:00:40 +0000 Subject: [PATCH 191/356] - Fix GDI object locking broken by this patch: http://reactos.com:8080/archives/public/ros-cvs/2004-July/004334.html svn path=/trunk/; revision=9994 --- reactos/include/win32k/gdiobj.h | 8 ++- reactos/subsys/win32k/objects/gdiobj.c | 70 +++++++++++++++++--------- 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/reactos/include/win32k/gdiobj.h b/reactos/include/win32k/gdiobj.h index 801b50eb021..b29164e1ce9 100644 --- a/reactos/include/win32k/gdiobj.h +++ b/reactos/include/win32k/gdiobj.h @@ -37,6 +37,8 @@ typedef PVOID PGDIOBJ; typedef BOOL (FASTCALL *GDICLEANUPPROC)(PGDIOBJ Obj); +#define GDIOBJ_USE_FASTMUTEX + /*! * GDI object header. This is a part of any GDI object */ @@ -49,9 +51,13 @@ typedef struct _GDIOBJHDR WORD Magic; const char* lockfile; int lockline; -/* FAST_MUTEX Lock;*/ +#ifdef GDIOBJ_USE_FASTMUTEX + FAST_MUTEX Lock; + DWORD RecursiveLockCount; +#else DWORD LockTid; DWORD LockCount; +#endif } GDIOBJHDR, *PGDIOBJHDR; typedef struct _GDIMULTILOCK diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index a26e967ddec..58fc7fa6b2f 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -19,7 +19,7 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.70 2004/07/04 01:23:32 navaraf Exp $ + * $Id: gdiobj.c,v 1.71 2004/07/04 12:00:40 navaraf Exp $ * */ #include @@ -345,8 +345,9 @@ GDIOBJ_AllocObj(WORD Size, DWORD ObjectType, GDICLEANUPPROC CleanupProc) newObject->Magic = GDI_TYPE_TO_MAGIC(ObjectType); newObject->lockfile = NULL; newObject->lockline = 0; -#if 0 +#ifdef GDIOBJ_USE_FASTMUTEX ExInitializeFastMutex(&newObject->Lock); + newObject->RecursiveLockCount = 0; #else newObject->LockTid = 0; newObject->LockCount = 0; @@ -684,6 +685,9 @@ PGDIOBJ FASTCALL GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) { PGDIOBJHDR ObjHdr = GDIOBJ_iGetObjectForIndex(GDI_HANDLE_GET_INDEX(hObj)); +#ifndef GDIOBJ_USE_FASTMUTEX + DWORD CurrentTid = (DWORD)PsGetCurrentThreadId(); +#endif DPRINT("(%s:%i) GDIOBJ_LockObjDbg(0x%08x,0x%08x)\n", file, line, hObj, ObjectType); if (! GDI_VALID_OBJECT(hObj, ObjHdr, ObjectType, GDIOBJFLAG_DEFAULT)) @@ -712,24 +716,32 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) return NULL; } -#if 0 -#ifdef NDEBUG - ExAcquireFastMutex(&ObjHdr->Lock); -#else /* NDEBUG */ - if (! ExTryToAcquireFastMutex(&ObjHdr->Lock)) +#ifdef GDIOBJ_USE_FASTMUTEX + if (ObjHdr->Lock.Owner == KeGetCurrentThread()) { - DPRINT1("Caution! GDIOBJ_LockObj trying to lock object 0x%x second time\n", hObj); - DPRINT1(" called from: %s:%i (thread %x)\n", file, line, KeGetCurrentThread()); - if (NULL != ObjHdr->lockfile) - { - DPRINT1(" previously locked from: %s:%i (thread %x)\n", ObjHdr->lockfile, ObjHdr->lockline, ObjHdr->Lock.Owner); - } - ExAcquireFastMutex(&ObjHdr->Lock); - DPRINT1(" Disregard previous message about object 0x%x, it's ok\n", hObj); + ObjHdr->RecursiveLockCount++; } + else + { +#ifdef NDEBUG + ExAcquireFastMutex(&ObjHdr->Lock); +#else /* NDEBUG */ + if (! ExTryToAcquireFastMutex(&ObjHdr->Lock)) + { + DPRINT1("Caution! GDIOBJ_LockObj trying to lock object 0x%x second time\n", hObj); + DPRINT1(" called from: %s:%i (thread %x)\n", file, line, KeGetCurrentThread()); + if (NULL != ObjHdr->lockfile) + { + DPRINT1(" previously locked from: %s:%i (thread %x)\n", ObjHdr->lockfile, ObjHdr->lockline, ObjHdr->Lock.Owner); + } + ExAcquireFastMutex(&ObjHdr->Lock); + DPRINT1(" Disregard previous message about object 0x%x, it's ok\n", hObj); + } #endif /* NDEBUG */ + ObjHdr->RecursiveLockCount++; + } #else - if (ObjHdr->LockTid == (DWORD)PsGetCurrentThreadId()) + if (ObjHdr->LockTid == CurrentTid) { InterlockedIncrement(&ObjHdr->LockCount); } @@ -737,7 +749,7 @@ GDIOBJ_LockObjDbg (const char* file, int line, HGDIOBJ hObj, DWORD ObjectType) { for (;;) { - if (InterlockedCompareExchange(&ObjHdr->LockTid, (DWORD)PsGetCurrentThreadId(), 0)) + if (InterlockedCompareExchange(&ObjHdr->LockTid, CurrentTid, 0) == CurrentTid) { InterlockedIncrement(&ObjHdr->LockCount); break; @@ -798,6 +810,9 @@ PGDIOBJ FASTCALL GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ObjectType) { PGDIOBJHDR ObjHdr = GDIOBJ_iGetObjectForIndex(GDI_HANDLE_GET_INDEX(hObj)); +#ifndef GDIOBJ_USE_FASTMUTEX + DWORD CurrentTid = (DWORD)PsGetCurrentThreadId(); +#endif DPRINT("GDIOBJ_LockObj: hObj: 0x%08x, type: 0x%08x, objhdr: %x\n", hObj, ObjectType, ObjHdr); if (! GDI_VALID_OBJECT(hObj, ObjHdr, ObjectType, GDIOBJFLAG_DEFAULT)) @@ -807,10 +822,18 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ObjectType) return NULL; } -#if 0 - ExAcquireFastMutex(&ObjHdr->Lock); +#ifdef GDIOBJ_USE_FASTMUTEX + if (ObjHdr->Lock.Owner == KeGetCurrentThread()) + { + ObjHdr->RecursiveLockCount++; + } + else + { + ExAcquireFastMutex(&ObjHdr->Lock); + ObjHdr->RecursiveLockCount++; + } #else - if (ObjHdr->LockTid == (DWORD)PsGetCurrentThreadId()) + if (ObjHdr->LockTid == CurrentTid) { InterlockedIncrement(&ObjHdr->LockCount); } @@ -818,7 +841,7 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ObjectType) { for (;;) { - if (InterlockedCompareExchange(&ObjHdr->LockTid, (DWORD)PsGetCurrentThreadId(), 0)) + if (InterlockedCompareExchange(&ObjHdr->LockTid, CurrentTid, 0) == CurrentTid) { InterlockedIncrement(&ObjHdr->LockCount); break; @@ -859,8 +882,9 @@ GDIOBJ_UnlockObj(HGDIOBJ hObj, DWORD ObjectType) return FALSE; } -#if 0 - ExReleaseFastMutex(&ObjHdr->Lock); +#ifdef GDIOBJ_USE_FASTMUTEX + if (--ObjHdr->RecursiveLockCount == 0) + ExReleaseFastMutex(&ObjHdr->Lock); #else if (InterlockedDecrement(&ObjHdr->LockCount) == 0) { From dd643751959760e1e46c5a78220b1cdb9ecb09a4 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 17:08:40 +0000 Subject: [PATCH 192/356] - Guard against out of bounds access to KeyboardLayout->pusVSCtoVK in W32kKeyProcessMessage. - Fixed SetKeyState to correctly index the keyboard state table. svn path=/trunk/; revision=9995 --- reactos/subsys/win32k/ntuser/keyboard.c | 66 +++++++++++++++---------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index d94bdcb9428..02a633e32cd 100644 --- a/reactos/subsys/win32k/ntuser/keyboard.c +++ b/reactos/subsys/win32k/ntuser/keyboard.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: keyboard.c,v 1.29 2004/05/10 17:07:18 weiden Exp $ +/* $Id: keyboard.c,v 1.30 2004/07/04 17:08:40 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -82,35 +82,44 @@ static UINT DontDistinguishShifts( UINT ret ) { } static VOID STDCALL SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) { + ASSERT(vk <= 0xff); + /* Special handling for toggles like numpad and caps lock */ - - if (vk == VK_CAPITAL || vk == VK_NUMLOCK) - { - if (down) QueueKeyStateTable[key] ^= 1; - } - - if (vk == VK_LSHIFT && ext) { - SetKeyState(VK_RSHIFT, 0, 0, down); - } else if (vk == VK_LSHIFT || vk == VK_SHIFT) { - SetKeyState(VK_LSHIFT, 0, 0, down); - } - - if (vk == VK_LCONTROL && ext) { - SetKeyState(VK_RCONTROL, 0, 0, down); - } else if (vk == VK_LCONTROL || vk == VK_CONTROL) { - SetKeyState(VK_LCONTROL, 0, 0, down); - } - - if (vk == VK_LMENU && ext) { - SetKeyState(VK_RMENU, 0, 0, down); - } else if (vk == VK_LMENU || vk == VK_MENU) { - SetKeyState(VK_LMENU, 0, 0, down); - } + if (vk == VK_CAPITAL || vk == VK_NUMLOCK) { + if (down) QueueKeyStateTable[vk] ^= KS_LOCK_BIT; + } if (down) - QueueKeyStateTable[key] |= KS_DOWN_BIT; + QueueKeyStateTable[vk] |= KS_DOWN_BIT; else - QueueKeyStateTable[key] &= ~KS_DOWN_MASK; + QueueKeyStateTable[vk] &= ~KS_DOWN_MASK; + + if (vk == VK_LSHIFT || vk == VK_RSHIFT) { + if ((QueueKeyStateTable[VK_LSHIFT] & KS_DOWN_BIT) || + (QueueKeyStateTable[VK_RSHIFT] & KS_DOWN_BIT)) { + QueueKeyStateTable[VK_SHIFT] |= KS_DOWN_BIT; + } else { + QueueKeyStateTable[VK_SHIFT] &= ~KS_DOWN_MASK; + } + } + + if (vk == VK_LCONTROL || vk == VK_RCONTROL) { + if ((QueueKeyStateTable[VK_LCONTROL] & KS_DOWN_BIT) || + (QueueKeyStateTable[VK_RCONTROL] & KS_DOWN_BIT)) { + QueueKeyStateTable[VK_CONTROL] |= KS_DOWN_BIT; + } else { + QueueKeyStateTable[VK_CONTROL] &= ~KS_DOWN_MASK; + } + } + + if (vk == VK_LMENU || vk == VK_RMENU) { + if ((QueueKeyStateTable[VK_LMENU] & KS_DOWN_BIT) || + (QueueKeyStateTable[VK_RMENU] & KS_DOWN_BIT)) { + QueueKeyStateTable[VK_MENU] |= KS_DOWN_BIT; + } else { + QueueKeyStateTable[VK_MENU] &= ~KS_DOWN_MASK; + } + } } VOID DumpKeyState( PBYTE KeyState ) { @@ -965,7 +974,10 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { ScanCode = (Msg->lParam >> 16) & 0xff; BaseMapping = Msg->wParam = IntMapVirtualKeyEx( ScanCode, 1, KeyboardLayout ); - RawVk = KeyboardLayout->pusVSCtoVK[ScanCode]; + if( ScanCode >= KeyboardLayout->bMaxVSCtoVK ) + RawVk = 0; + else + RawVk = KeyboardLayout->pusVSCtoVK[ScanCode]; if ((ModifierBits & NUMLOCK_BIT) && !(ModifierBits & GetShiftBit(KeyboardLayout, VK_SHIFT)) && From 91008697a8339ac1f769401aa64a861293b26c1f Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 17:09:45 +0000 Subject: [PATCH 193/356] - Use absolute value of the color difference when calculating color match rating. svn path=/trunk/; revision=9996 --- reactos/subsys/win32k/eng/xlate.c | 8 ++++---- reactos/subsys/win32k/objects/color.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index 43d4eff8408..8ff75a93b31 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.39 2004/07/03 13:55:35 navaraf Exp $ +/* $Id: xlate.c,v 1.40 2004/07/04 17:09:45 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -64,11 +64,11 @@ ClosestColorMatch(XLATEGDI *XlateGDI, LPPALETTEENTRY SourceColor, for (CurrentIndex = 0; CurrentIndex < NumColors; CurrentIndex++) { - cxRed = (SourceRed - DestColors[CurrentIndex].peRed); + cxRed = abs((SHORT)SourceRed - (SHORT)DestColors[CurrentIndex].peRed); cxRed *= cxRed; - cxGreen = (SourceGreen - DestColors[CurrentIndex].peGreen); + cxGreen = abs((SHORT)SourceGreen - (SHORT)DestColors[CurrentIndex].peGreen); cxGreen *= cxGreen; - cxBlue = (SourceBlue - DestColors[CurrentIndex].peBlue); + cxBlue = abs((SHORT)SourceBlue - (SHORT)DestColors[CurrentIndex].peBlue); cxBlue *= cxBlue; Rating = cxRed + cxGreen + cxBlue; diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 0d55a75e9f8..bd4010937e1 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.48 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: color.c,v 1.49 2004/07/04 17:09:45 navaraf Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -550,9 +550,9 @@ INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, continue; #endif - r = palPalEntry[i].peRed - GetRValue(col); - g = palPalEntry[i].peGreen - GetGValue(col); - b = palPalEntry[i].peBlue - GetBValue(col); + r = abs((SHORT)palPalEntry[i].peRed - GetRValue(col)); + g = abs((SHORT)palPalEntry[i].peGreen - GetGValue(col)); + b = abs((SHORT)palPalEntry[i].peBlue - GetBValue(col)); r = r*r + g*g + b*b; From 907bf3c0a8112164ea04a11f3c31d30f5fc9fb93 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 4 Jul 2004 17:22:33 +0000 Subject: [PATCH 194/356] - Fixed NumLock, CapsLock and ScrollLock handling in ConioGetShiftState. svn path=/trunk/; revision=9997 --- reactos/subsys/csrss/win32csr/conio.c | 30 +++++++-------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/reactos/subsys/csrss/win32csr/conio.c b/reactos/subsys/csrss/win32csr/conio.c index fe7c91b9fc1..70df7e10f9c 100644 --- a/reactos/subsys/csrss/win32csr/conio.c +++ b/reactos/subsys/csrss/win32csr/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.10 2004/04/09 20:03:16 navaraf Exp $ +/* $Id: conio.c,v 1.11 2004/07/04 17:22:33 navaraf Exp $ * * reactos/subsys/csrss/win32csr/conio.c * @@ -1125,32 +1125,18 @@ ConioProcessChar(PCSRSS_CONSOLE Console, STATIC DWORD FASTCALL ConioGetShiftState(PBYTE KeyState) { - int i; DWORD ssOut = 0; - for (i = 0; i < 0x100; i++) - { - if (0 != (KeyState[i] & 0x80)) - { - UINT vk = MapVirtualKeyExW(i, 3, 0) & 0xff; - switch(vk) - { - case VK_CAPITAL: - ssOut |= CAPSLOCK_ON; - break; + if (KeyState[VK_CAPITAL] & 1) + ssOut |= CAPSLOCK_ON; - case VK_NUMLOCK: - ssOut |= NUMLOCK_ON; - break; + if (KeyState[VK_NUMLOCK] & 1) + ssOut |= NUMLOCK_ON; - case VK_SCROLL: - ssOut |= SCROLLLOCK_ON; - break; - } - } - } + if (KeyState[VK_SCROLL] & 1) + ssOut |= SCROLLLOCK_ON; - if (KeyState[VK_LSHIFT] & 0x80 || KeyState[VK_RSHIFT] & 0x80) + if (KeyState[VK_SHIFT] & 0x80) ssOut |= SHIFT_PRESSED; if (KeyState[VK_LCONTROL] & 0x80) From 52f4f6acefd8d027447a9f489817472e2c3ace59 Mon Sep 17 00:00:00 2001 From: Jason Filby Date: Sun, 4 Jul 2004 18:11:49 +0000 Subject: [PATCH 195/356] lstrcpy and lstrcat should return NULL if the string to copy to is NULL instead of crashing; verified by a test app on Windows XP svn path=/trunk/; revision=9998 --- reactos/lib/kernel32/string/lstring.c | 50 +++++++++++++++++++++------ 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/reactos/lib/kernel32/string/lstring.c b/reactos/lib/kernel32/string/lstring.c index c72c1dc9298..67890fcd129 100644 --- a/reactos/lib/kernel32/string/lstring.c +++ b/reactos/lib/kernel32/string/lstring.c @@ -21,7 +21,7 @@ lstrcmpA( LPCSTR lpString2 ) { - return strcmp(lpString1,lpString2); + return strcmp(lpString1,lpString2); } @@ -35,7 +35,7 @@ lstrcmpiA( LPCSTR lpString2 ) { - return _stricmp(lpString1,lpString2); + return _stricmp(lpString1,lpString2); } @@ -54,6 +54,11 @@ lstrcpynA( lpString1 with NUL bytes while lstrcpynA doesn't. Also lstrcpynA guarantees NUL termination while strncpy doesn't */ + if (lpString1 == NULL) + { + return NULL; + } + if (1 < iMaxLength) { char *d = lpString1; @@ -89,7 +94,12 @@ lstrcpyA( LPCSTR lpString2 ) { - return strcpy(lpString1,lpString2); + if (lpString1 == NULL) + { + return NULL; + } + + return strcpy(lpString1,lpString2); } @@ -103,7 +113,12 @@ lstrcatA( LPCSTR lpString2 ) { - return strcat(lpString1,lpString2); + if (lpString1 == NULL) + { + return NULL; + } + + return strcat(lpString1,lpString2); } @@ -116,7 +131,7 @@ lstrlenA( LPCSTR lpString ) { - return strlen(lpString); + return strlen(lpString); } @@ -130,7 +145,7 @@ lstrcmpW( LPCWSTR lpString2 ) { - return wcscmp(lpString1,lpString2); + return wcscmp(lpString1,lpString2); } @@ -144,7 +159,7 @@ lstrcmpiW( LPCWSTR lpString2 ) { - return _wcsicmp(lpString1,lpString2); + return _wcsicmp(lpString1,lpString2); } @@ -163,6 +178,11 @@ lstrcpynW( lpString1 with NUL bytes while lstrcpynW doesn't Also lstrcpynW guarantees NUL termination while wcsncpy doesn't */ + if (lpString1 == NULL) + { + return NULL; + } + if (1 < iMaxLength) { WCHAR *d = lpString1; @@ -198,7 +218,12 @@ lstrcpyW( LPCWSTR lpString2 ) { - return wcscpy(lpString1,lpString2); + if (lpString1 == NULL) + { + return NULL; + } + + return wcscpy(lpString1,lpString2); } @@ -212,7 +237,12 @@ lstrcatW( LPCWSTR lpString2 ) { - return wcscat(lpString1,lpString2); + if (lpString1 == NULL) + { + return NULL; + } + + return wcscat(lpString1,lpString2); } @@ -225,5 +255,5 @@ lstrlenW( LPCWSTR lpString ) { - return wcslen(lpString); + return wcslen(lpString); } From fac1d981b14b93f474d1f2cead8799b31c91e8dd Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 5 Jul 2004 21:39:02 +0000 Subject: [PATCH 196/356] - Removed the using of the media change count to recognize a median change. svn path=/trunk/; revision=9999 --- reactos/drivers/fs/vfat/create.c | 42 ++++++++++++++------------------ reactos/drivers/fs/vfat/fsctl.c | 28 ++++----------------- reactos/drivers/fs/vfat/vfat.h | 5 +--- 3 files changed, 24 insertions(+), 51 deletions(-) diff --git a/reactos/drivers/fs/vfat/create.c b/reactos/drivers/fs/vfat/create.c index 00843c284da..433a516891c 100644 --- a/reactos/drivers/fs/vfat/create.c +++ b/reactos/drivers/fs/vfat/create.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: create.c,v 1.69 2004/07/03 17:31:30 hbirr Exp $ +/* $Id: create.c,v 1.70 2004/07/05 21:39:02 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: drivers/fs/vfat/create.c @@ -178,7 +178,7 @@ FindFile (PDEVICE_EXTENSION DeviceExt, PVOID Page; PVFATFCB rcFcb; BOOLEAN FoundLong; - BOOLEAN FoundShort; + BOOLEAN FoundShort = FALSE; UNICODE_STRING PathNameU; BOOLEAN WildCard; PWCHAR curr, last; @@ -339,8 +339,7 @@ VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, PVFATFCB ParentFcb; PVFATFCB Fcb; NTSTATUS Status; - ULONG Size; - ULONG MediaChangeCount; + // PDEVICE_OBJECT DeviceObject = DeviceExt->StorageDevice->Vpb->DeviceObject; @@ -373,39 +372,34 @@ VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, if (!DeviceExt->FatInfo.FixedMedia) { - Size = sizeof(ULONG); Status = VfatBlockDeviceIoControl (DeviceExt->StorageDevice, IOCTL_DISK_CHECK_VERIFY, NULL, 0, - &MediaChangeCount, - &Size, + NULL, + 0, FALSE); - if (Status == STATUS_VERIFY_REQUIRED || MediaChangeCount != DeviceExt->MediaChangeCount) + if (Status == STATUS_VERIFY_REQUIRED) + { PDEVICE_OBJECT DeviceToVerify; DPRINT ("Media change detected!\n"); DPRINT ("Device %p\n", DeviceExt->StorageDevice); - DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); - IoSetDeviceToVerify (PsGetCurrentThread (), + DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ()); + + IoSetDeviceToVerify (PsGetCurrentThread (), NULL); - - Status = IoVerifyVolume (DeviceToVerify, - FALSE); - if (!NT_SUCCESS(Status)) - { - DPRINT ("Status %lx\n", Status); - return Status; - } - } - else if (!NT_SUCCESS(Status)) - { - DPRINT ("Status %lx\n", Status); - return Status; - } + Status = IoVerifyVolume (DeviceExt->StorageDevice, + FALSE); + } + if (!NT_SUCCESS(Status)) + { + DPRINT ("Status %lx\n", Status); + return Status; + } } diff --git a/reactos/drivers/fs/vfat/fsctl.c b/reactos/drivers/fs/vfat/fsctl.c index 890595b35f9..f179d268afc 100644 --- a/reactos/drivers/fs/vfat/fsctl.c +++ b/reactos/drivers/fs/vfat/fsctl.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: fsctl.c,v 1.32 2004/06/23 20:23:59 hbirr Exp $ +/* $Id: fsctl.c,v 1.33 2004/07/05 21:39:02 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -275,7 +275,6 @@ VfatMountDevice(PDEVICE_EXTENSION DeviceExt, { NTSTATUS Status; BOOLEAN RecognizedFS; - ULONG Size; DPRINT("Mounting VFAT device...\n"); @@ -286,21 +285,6 @@ VfatMountDevice(PDEVICE_EXTENSION DeviceExt, } DPRINT("MountVfatdev %d, PAGE_SIZE = %d\n", DeviceExt->FatInfo.BytesPerCluster, PAGE_SIZE); - if (!DeviceExt->FatInfo.FixedMedia) - { - Size = sizeof(ULONG); - Status = VfatBlockDeviceIoControl (DeviceToMount, - IOCTL_DISK_CHECK_VERIFY, - NULL, - 0, - &DeviceExt->MediaChangeCount, - &Size, - FALSE); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } return(STATUS_SUCCESS); } @@ -498,20 +482,19 @@ VfatVerify (PVFAT_IRP_CONTEXT IrpContext) NTSTATUS Status = STATUS_SUCCESS; FATINFO FatInfo; BOOLEAN RecognizedFS; - ULONG Size; PDEVICE_EXTENSION DeviceExt = IrpContext->DeviceExt; DPRINT("VfatVerify(IrpContext %x)\n", IrpContext); DeviceToVerify = IrpContext->Stack->Parameters.VerifyVolume.DeviceObject; - Size = sizeof(ULONG); Status = VfatBlockDeviceIoControl(DeviceToVerify, IOCTL_DISK_CHECK_VERIFY, NULL, 0, - &DeviceExt->MediaChangeCount, - &Size, - FALSE); + NULL, + 0, + TRUE); + DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME; if (!NT_SUCCESS(Status) && Status != STATUS_VERIFY_REQUIRED) { DPRINT("VfatBlockDeviceIoControl() failed (Status %lx)\n", Status); @@ -533,7 +516,6 @@ VfatVerify (PVFAT_IRP_CONTEXT IrpContext) * Each write to the root directory must update this crc sum. */ - DeviceToVerify->Flags &= ~DO_VERIFY_VOLUME; } else { diff --git a/reactos/drivers/fs/vfat/vfat.h b/reactos/drivers/fs/vfat/vfat.h index 0eb9b0d53a4..56c2f151104 100644 --- a/reactos/drivers/fs/vfat/vfat.h +++ b/reactos/drivers/fs/vfat/vfat.h @@ -1,4 +1,4 @@ -/* $Id: vfat.h,v 1.64 2004/06/23 20:23:59 hbirr Exp $ */ +/* $Id: vfat.h,v 1.65 2004/07/05 21:39:02 hbirr Exp $ */ #include @@ -163,9 +163,6 @@ typedef struct struct _VFATFCB * VolumeFcb; LIST_ENTRY VolumeListEntry; - - ULONG MediaChangeCount; - } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB; typedef struct From 405e3b3822e0978e012ef6403b982555e143ab36 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 5 Jul 2004 21:42:05 +0000 Subject: [PATCH 197/356] - Removed IOCTL_DISK_CHECK_VERIFY. We must use the port driver to detect the current state of the drive. svn path=/trunk/; revision=10000 --- reactos/drivers/storage/disk/disk.c | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 93bfdd5e991..f457bc3bbc0 100644 --- a/reactos/drivers/storage/disk/disk.c +++ b/reactos/drivers/storage/disk/disk.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: disk.c,v 1.43 2004/07/03 17:40:21 navaraf Exp $ +/* $Id: disk.c,v 1.44 2004/07/05 21:42:05 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1206,25 +1206,6 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, } break; - - case IOCTL_DISK_CHECK_VERIFY: - DPRINT("IOCTL_DISK_CHECK_VERIFY\n"); - Information = 0; - if (OutputLength != 0) - { - Irp->AssociatedIrp.SystemBuffer = (PVOID) DeviceExtension->MediaChangeCount; - Information = sizeof(ULONG); - - } - if (DeviceObject->Flags & DO_VERIFY_VOLUME) - { - DPRINT("Do Verify Set\n"); - Status = STATUS_VERIFY_REQUIRED; - } - else - Status = STATUS_SUCCESS; - break; - case IOCTL_DISK_VERIFY: case IOCTL_DISK_FORMAT_TRACKS: case IOCTL_DISK_PERFORMANCE: From 1b16d86ba8df5dc2fa7207e6455dfc06558aa058 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 5 Jul 2004 21:44:27 +0000 Subject: [PATCH 198/356] - Check for a valid buffer on a call to IOCTL_DISK_CHECK_VERIFY. svn path=/trunk/; revision=10001 --- reactos/drivers/storage/floppy/ioctl.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/storage/floppy/ioctl.c b/reactos/drivers/storage/floppy/ioctl.c index 7242a3311d2..a50b7ba67f0 100644 --- a/reactos/drivers/storage/floppy/ioctl.c +++ b/reactos/drivers/storage/floppy/ioctl.c @@ -210,9 +210,25 @@ VOID NTAPI DeviceIoctlPassive(PDRIVE_INFO DriveInfo, case IOCTL_DISK_CHECK_VERIFY: KdPrint(("floppy: IOCTL_DISK_CHECK_VERIFY called\n")); - *((PULONG)OutputBuffer) = DriveInfo->DiskChangeCount; - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(ULONG); + if (OutputLength != 0) + { + if (OutputLength < sizeof(ULONG)) + { + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + } + else + { + *((PULONG)OutputBuffer) = DriveInfo->DiskChangeCount; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(ULONG); + } + } + else + { + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + } break; case IOCTL_DISK_GET_DRIVE_GEOMETRY: From ad8356897959aad8aa3467b17ed6021b00b65632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 5 Jul 2004 22:12:45 +0000 Subject: [PATCH 199/356] Patch by Jens Collin Fixes autocompletion, see bug #177 svn path=/trunk/; revision=10002 --- reactos/subsys/system/cmd/filecomp.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/reactos/subsys/system/cmd/filecomp.c b/reactos/subsys/system/cmd/filecomp.c index b79ce848756..9ed63022ac8 100644 --- a/reactos/subsys/system/cmd/filecomp.c +++ b/reactos/subsys/system/cmd/filecomp.c @@ -14,6 +14,10 @@ * * 30-Apr-2004 (Filip Navara ) * Make the file listing readable when there is a lot of long names. + * + + * 05-Jul-2004 (Jens Collin ) + * Now expands lfn even when trailing " is omitted. */ #include "config.h" @@ -25,7 +29,7 @@ #include #include -#include "cmd.h" +#include "cmd.h" #ifdef FEATURE_UNIX_FILENAME_COMPLETION @@ -37,6 +41,7 @@ VOID CompleteFilename (LPTSTR str, INT charcount) INT curplace = 0; INT start; INT count; + INT step, c; BOOL found_dot = FALSE; BOOL perfectmatch = TRUE; TCHAR path[MAX_PATH]; @@ -50,8 +55,18 @@ VOID CompleteFilename (LPTSTR str, INT charcount) if (count < 0) count = 0; + /* find how many '"'s there is typed already.*/ + step = count; + while (step > 0) + { + if (str[step] == _T('"')) + c++; + step--; + } + /* if c is odd, then user typed " before name, else not.*/ + /* find front of word */ - if (str[count] == _T('"')) + if (str[count] == _T('"') || (c % 2)) { count--; while (count > 0 && str[count] != _T('"')) @@ -256,9 +271,9 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) if (curplace >= 0 && directory[curplace] == _T('"')) directory[curplace--] = _T('\0'); - + _tcscpy (path, directory); - + while (curplace >= 0 && directory[curplace] != _T('\\') && directory[curplace] != _T(':')) @@ -312,13 +327,13 @@ BOOL ShowCompletionMatches (LPTSTR str, INT charcount) /* Increase by the number of spaces behind file name */ longestfname += 3; - + /* find anything */ ConOutChar (_T('\n')); do { /* ignore . and .. */ - if (!_tcscmp (file.cFileName, _T(".")) || + if (!_tcscmp (file.cFileName, _T(".")) || !_tcscmp (file.cFileName, _T(".."))) continue; From f54f6b901865ec4dcd049dddd99837ac3b0328eb Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Mon, 5 Jul 2004 22:33:14 +0000 Subject: [PATCH 200/356] fixed typo svn path=/trunk/; revision=10003 --- reactos/lib/samlib/samlib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/samlib/samlib.c b/reactos/lib/samlib/samlib.c index 9f7475aea1e..e163a0c33df 100644 --- a/reactos/lib/samlib/samlib.c +++ b/reactos/lib/samlib/samlib.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: samlib.c,v 1.2 2004/02/04 17:57:56 ekohl Exp $ +/* $Id: samlib.c,v 1.3 2004/07/05 22:33:14 royce Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -397,7 +397,7 @@ SamCreateUser (PWSTR UserName, if (dwDisposition == REG_OPENED_EXISTING_KEY) { - DPRINT1 ("User alredy exists!\n"); + DPRINT1 ("User already exists!\n"); RegCloseKey (hUserKey); SetLastError (ERROR_USER_EXISTS); return FALSE; From 37635ba8535b7110f6e093db9ec66e1c9c6c2099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 6 Jul 2004 22:07:26 +0000 Subject: [PATCH 201/356] Make AdjustTokenPrivileges confirm to MSDN-documented behaviour: - return FALSE on error with appropriate LastError - return TRUE with LastError == ERROR_NOT_ALL_ASSIGNED if not all privileges could be adjusted - return TRUE with LastError == ERROR_SUCCESS if all privileges were successfully adjusted svn path=/trunk/; revision=10004 --- reactos/lib/advapi32/token/token.c | 12 +++++++++--- reactos/ntoskrnl/se/token.c | 14 +++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/reactos/lib/advapi32/token/token.c b/reactos/lib/advapi32/token/token.c index 2d48b6d853e..97a8e191d2c 100644 --- a/reactos/lib/advapi32/token/token.c +++ b/reactos/lib/advapi32/token/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.10 2004/03/25 11:30:07 ekohl Exp $ +/* $Id: token.c,v 1.11 2004/07/06 22:07:25 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -61,12 +61,18 @@ AdjustTokenPrivileges (HANDLE TokenHandle, BufferLength, PreviousState, (PULONG)ReturnLength); - if (!NT_SUCCESS (Status)) + if (STATUS_NOT_ALL_ASSIGNED == Status) { - SetLastError (RtlNtStatusToDosError (Status)); + SetLastError(ERROR_NOT_ALL_ASSIGNED); + return TRUE; + } + if (! NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } + SetLastError(ERROR_SUCCESS); /* AdjustTokenPrivileges is documented to do this */ return TRUE; } diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 84363af24d0..f929bdffd76 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.35 2004/05/18 12:23:48 ekohl Exp $ +/* $Id: token.c,v 1.36 2004/07/06 22:07:26 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -989,6 +989,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, ULONG i; ULONG j; ULONG k; + ULONG Count; #if 0 ULONG a; ULONG b; @@ -1059,9 +1060,11 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, Token->Privileges[i].Attributes &= ~SE_PRIVILEGE_ENABLED; } } + Status = STATUS_SUCCESS; } else { + Count = 0; for (i = 0; i < Token->PrivilegeCount; i++) { for (j = 0; j < NewState->PrivilegeCount; j++) @@ -1094,9 +1097,11 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, DPRINT ("New attributes %lx\n", Token->Privileges[i].Attributes); } + Count++; } } } + Status = Count < NewState->PrivilegeCount ? STATUS_NOT_ALL_ASSIGNED : STATUS_SUCCESS; } if (ReturnLength != NULL) @@ -1113,12 +1118,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, DPRINT ("NtAdjustPrivilegesToken() done\n"); - if (k < NewState->PrivilegeCount) - { - return STATUS_NOT_ALL_ASSIGNED; - } - - return STATUS_SUCCESS; + return Status; } From f3903190861958bd8977be0928a67ea506d4c110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 6 Jul 2004 22:08:48 +0000 Subject: [PATCH 202/356] Implement LookupPrivilegeValueW for local machine svn path=/trunk/; revision=10005 --- reactos/lib/advapi32/sec/misc.c | 63 ++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 88d3c9c1983..be32d2b1508 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.18 2004/05/27 14:50:17 weiden Exp $ +/* $Id: misc.c,v 1.19 2004/07/06 22:08:48 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -455,11 +455,64 @@ LookupPrivilegeValueA (LPCSTR lpSystemName, * @unimplemented */ BOOL STDCALL -LookupPrivilegeValueW (LPCWSTR lpSystemName, - LPCWSTR lpName, - PLUID lpLuid) +LookupPrivilegeValueW (LPCWSTR SystemName, + LPCWSTR PrivName, + PLUID Luid) { - DPRINT1("LookupPrivilegeValueW: stub\n"); + static const WCHAR * const DefaultPrivNames[] = + { + L"SeCreateTokenPrivilege", + L"SeAssignPrimaryTokenPrivilege", + L"SeLockMemoryPrivilege", + L"SeIncreaseQuotaPrivilege", + L"SeUnsolicitedInputPrivilege", + L"SeMachineAccountPrivilege", + L"SeTcbPrivilege", + L"SeSecurityPrivilege", + L"SeTakeOwnershipPrivilege", + L"SeLoadDriverPrivilege", + L"SeSystemProfilePrivilege", + L"SeSystemtimePrivilege", + L"SeProfileSingleProcessPrivilege", + L"SeIncreaseBasePriorityPrivilege", + L"SeCreatePagefilePrivilege", + L"SeCreatePermanentPrivilege", + L"SeBackupPrivilege", + L"SeRestorePrivilege", + L"SeShutdownPrivilege", + L"SeDebugPrivilege", + L"SeAuditPrivilege", + L"SeSystemEnvironmentPrivilege", + L"SeChangeNotifyPrivilege", + L"SeRemoteShutdownPrivilege", + L"SeUndockPrivilege", + L"SeSyncAgentPrivilege", + L"SeEnableDelegationPrivilege", + L"SeManageVolumePrivilege", + L"SeImpersonatePrivilege", + L"SeCreateGlobalPrivilege" + }; + unsigned Priv; + + if (NULL != SystemName && L'\0' != *SystemName) + { + DPRINT1("LookupPrivilegeValueW: not implemented for remote system\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; + } + + for (Priv = 0; Priv < sizeof(DefaultPrivNames) / sizeof(DefaultPrivNames[0]); Priv++) + { + if (0 == wcscmp(PrivName, DefaultPrivNames[Priv])) + { + Luid->LowPart = Priv + 1; + Luid->HighPart = 0; + return TRUE; + } + } + + DPRINT1("LookupPrivilegeValueW: no such privilege %S\n", PrivName); + SetLastError(ERROR_NO_SUCH_PRIVILEGE); return FALSE; } From 20180bf59f028a3270499c7e43d85edfdc5dd61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Jul 2004 08:39:54 +0000 Subject: [PATCH 203/356] Silence debug messages svn path=/trunk/; revision=10006 --- reactos/drivers/net/ndis/ndis/main.c | 2 +- reactos/drivers/net/tcpip/tcpip/main.c | 2 +- reactos/ntoskrnl/ps/i386/continue.c | 6 +++--- reactos/subsys/win32k/objects/cursoricon.c | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/net/ndis/ndis/main.c b/reactos/drivers/net/ndis/ndis/main.c index 53d6ebf6a99..1d00be4374d 100644 --- a/reactos/drivers/net/ndis/ndis/main.c +++ b/reactos/drivers/net/ndis/ndis/main.c @@ -18,7 +18,7 @@ #ifdef DBG /* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MIN_TRACE; +DWORD DebugTraceLevel = 0; #endif /* DBG */ diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 4fa181cfa1c..3e906921d45 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -25,7 +25,7 @@ #ifndef NDEBUG DWORD DebugTraceLevel = 0x7fffffff; #else -DWORD DebugTraceLevel = MIN_TRACE; +DWORD DebugTraceLevel = 0; #endif /* NDEBUG */ PDEVICE_OBJECT TCPDeviceObject = NULL; diff --git a/reactos/ntoskrnl/ps/i386/continue.c b/reactos/ntoskrnl/ps/i386/continue.c index 8e32a7c9b13..5a3136d18ef 100644 --- a/reactos/ntoskrnl/ps/i386/continue.c +++ b/reactos/ntoskrnl/ps/i386/continue.c @@ -1,4 +1,4 @@ -/* $Id: continue.c,v 1.2 2004/07/02 01:23:26 royce Exp $ +/* $Id: continue.c,v 1.3 2004/07/07 08:39:53 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -42,10 +42,10 @@ NtContinue ( PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; PKTRAP_FRAME PrevTrapFrame = (PKTRAP_FRAME)TrapFrame->Edx; - DPRINT1("NtContinue: Context: Eip=0x%x, Esp=0x%x\n", Context->Eip, Context->Esp ); + DPRINT("NtContinue: Context: Eip=0x%x, Esp=0x%x\n", Context->Eip, Context->Esp ); PULONG Frame = 0; __asm__("mov %%ebp, %%ebx" : "=b" (Frame) : ); - DbgPrint ( "NtContinue(): Ebp=%x, prev/TF=%x/%x\n", Frame, Frame[0], TrapFrame ); + DPRINT( "NtContinue(): Ebp=%x, prev/TF=%x/%x\n", Frame, Frame[0], TrapFrame ); KeRosDumpStackFrames(NULL,5); if ( Context == NULL ) diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index ddbc4f56631..53f04c30fe9 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.61 2004/07/04 11:18:56 navaraf Exp $ */ +/* $Id: cursoricon.c,v 1.62 2004/07/07 08:39:54 gvg Exp $ */ #include PCURICON_OBJECT FASTCALL @@ -118,7 +118,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BITMAPOBJ_UnlockBitmap(NewCursor->IconInfo.hbmMask); if (maskBpp != 1) { - DbgPrint("SetCursor: The Mask bitmap must have 1BPP!\n"); + DPRINT1("SetCursor: The Mask bitmap must have 1BPP!\n"); BITMAPOBJ_UnlockBitmap(SurfObj->hsurf); return Ret; } @@ -131,7 +131,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, /* FIXME - Create a color pointer, only 32bit bitmap, set alpha bits! Do not pass a mask bitmap to DrvSetPointerShape()! Create a XLATEOBJ that describes the colors of the bitmap. */ - DbgPrint("SetCursor: (Colored) alpha cursors are not supported!\n"); + DPRINT1("SetCursor: (Colored) alpha cursors are not supported!\n"); } else { @@ -142,7 +142,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, Do not pass a mask bitmap to DrvSetPointerShape()! Create a XLATEOBJ that describes the colors of the bitmap. (16bit bitmaps are propably allowed) */ - DbgPrint("SetCursor: Cursors with colors are not supported!\n"); + DPRINT1("SetCursor: Cursors with colors are not supported!\n"); } else { @@ -232,7 +232,7 @@ IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, } if(GDIDEV(SurfObj)->PointerStatus == SPS_ERROR) - DbgPrint("SetCursor: DrvSetPointerShape() returned SPS_ERROR\n"); + DPRINT1("SetCursor: DrvSetPointerShape() returned SPS_ERROR\n"); return Ret; } @@ -1124,7 +1124,7 @@ NtUserDrawIconEx( IntReleaseCurIconObject(CurIconObject); if(istepIfAniCur) - DbgPrint("NtUserDrawIconEx: istepIfAniCur is not supported!\n"); + DPRINT1("NtUserDrawIconEx: istepIfAniCur is not supported!\n"); if(!hbmMask || !IntGdiGetObject(hbmMask, sizeof(BITMAP), &bmpMask)) goto done; From f79ec69b9cbec8f0e6463732b3b73d3f22761ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Jul 2004 08:41:47 +0000 Subject: [PATCH 204/356] Set default (Administrator) privileges when logging on svn path=/trunk/; revision=10007 --- reactos/lib/advapi32/misc/logon.c | 75 +++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/reactos/lib/advapi32/misc/logon.c b/reactos/lib/advapi32/misc/logon.c index 73fc8f19ae3..cfc0f6f74fa 100644 --- a/reactos/lib/advapi32/misc/logon.c +++ b/reactos/lib/advapi32/misc/logon.c @@ -1,4 +1,4 @@ -/* $Id: logon.c,v 1.6 2004/06/17 09:07:12 ekohl Exp $ +/* $Id: logon.c,v 1.7 2004/07/07 08:41:47 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -248,6 +248,36 @@ LogonUserW (LPWSTR lpszUsername, DWORD dwLogonProvider, PHANDLE phToken) { + /* FIXME shouldn't use hard-coded list of privileges */ + static struct + { + LPCWSTR PrivName; + DWORD Attributes; + } + DefaultPrivs[] = + { + { L"SeUnsolicitedInputPrivilege", 0 }, + { L"SeMachineAccountPrivilege", 0 }, + { L"SeSecurityPrivilege", 0 }, + { L"SeTakeOwnershipPrivilege", 0 }, + { L"SeLoadDriverPrivilege", 0 }, + { L"SeSystemProfilePrivilege", 0 }, + { L"SeSystemtimePrivilege", 0 }, + { L"SeProfileSingleProcessPrivilege", 0 }, + { L"SeIncreaseBasePriorityPrivilege", 0 }, + { L"SeCreatePagefilePrivilege", 0 }, + { L"SeBackupPrivilege", 0 }, + { L"SeRestorePrivilege", 0 }, + { L"SeShutdownPrivilege", 0 }, + { L"SeDebugPrivilege", 0 }, + { L"SeSystemEnvironmentPrivilege", 0 }, + { L"SeChangeNotifyPrivilege", SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_ENABLED_BY_DEFAULT }, + { L"SeRemoteShutdownPrivilege", 0 }, + { L"SeUndockPrivilege", 0 }, + { L"SeEnableDelegationPrivilege", 0 }, + { L"SeImpersonatePrivilege", SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_ENABLED_BY_DEFAULT }, + { L"SeCreateGlobalPrivilege", SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_ENABLED_BY_DEFAULT } + }; OBJECT_ATTRIBUTES ObjectAttributes; SECURITY_QUALITY_OF_SERVICE Qos; TOKEN_USER TokenUser; @@ -255,8 +285,7 @@ LogonUserW (LPWSTR lpszUsername, TOKEN_PRIMARY_GROUP TokenPrimaryGroup; TOKEN_GROUPS TokenGroups; // PTOKEN_GROUPS TokenGroups; - TOKEN_PRIVILEGES TokenPrivileges; -// PTOKEN_PRIVILEGES TokenPrivileges; + PTOKEN_PRIVILEGES TokenPrivileges; TOKEN_DEFAULT_DACL TokenDefaultDacl; LARGE_INTEGER ExpirationTime; LUID AuthenticationId; @@ -264,8 +293,8 @@ LogonUserW (LPWSTR lpszUsername, PSID UserSid; ACL Dacl; NTSTATUS Status; - SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; + unsigned i; Qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); Qos.ImpersonationLevel = SecurityAnonymous; @@ -309,8 +338,30 @@ LogonUserW (LPWSTR lpszUsername, TokenGroups.Groups[0].Sid = UserSid; /* FIXME */ TokenGroups.Groups[0].Attributes = SE_GROUP_ENABLED; -// TokenPrivileges = NULL; - TokenPrivileges.PrivilegeCount = 0; + TokenPrivileges = RtlAllocateHeap(GetProcessHeap(), 0, + sizeof(TOKEN_PRIVILEGES) + + sizeof(DefaultPrivs) / sizeof(DefaultPrivs[0]) + * sizeof(LUID_AND_ATTRIBUTES)); + if (NULL == TokenPrivileges) + { + RtlFreeSid (UserSid); + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + TokenPrivileges->PrivilegeCount = 0; + for (i = 0; i < sizeof(DefaultPrivs) / sizeof(DefaultPrivs[0]); i++) + { + if (! LookupPrivilegeValueW(NULL, DefaultPrivs[i].PrivName, + &TokenPrivileges->Privileges[TokenPrivileges->PrivilegeCount].Luid)) + { + DPRINT1("Can't set privilege %S\n", DefaultPrivs[i].PrivName); + } + else + { + TokenPrivileges->Privileges[TokenPrivileges->PrivilegeCount].Attributes = DefaultPrivs[i].Attributes; + TokenPrivileges->PrivilegeCount++; + } + } TokenOwner.Owner = UserSid; @@ -319,6 +370,7 @@ LogonUserW (LPWSTR lpszUsername, Status = RtlCreateAcl (&Dacl, sizeof(ACL), ACL_REVISION); if (!NT_SUCCESS(Status)) { + RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); RtlFreeSid (UserSid); return FALSE; } @@ -344,21 +396,16 @@ LogonUserW (LPWSTR lpszUsername, &TokenUser, // TokenGroups, &TokenGroups, -// TokenPrivileges, - &TokenPrivileges, + TokenPrivileges, &TokenOwner, &TokenPrimaryGroup, &TokenDefaultDacl, &TokenSource); - if (!NT_SUCCESS(Status)) - { - RtlFreeSid (UserSid); - return FALSE; - } + RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); RtlFreeSid (UserSid); - return TRUE; + return NT_SUCCESS(Status); } /* EOF */ From 6a871dff662d34469c0dc134052abb8d896dc8d3 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 7 Jul 2004 09:42:58 +0000 Subject: [PATCH 205/356] Implement environment variable dialog. svn path=/trunk/; revision=10008 --- reactos/lib/cpl/sysdm/environment.c | 348 ++++++++++++++++++++++++++-- reactos/lib/cpl/sysdm/resource.h | 4 + reactos/lib/cpl/sysdm/sysdm.rc | 18 +- 3 files changed, 347 insertions(+), 23 deletions(-) diff --git a/reactos/lib/cpl/sysdm/environment.c b/reactos/lib/cpl/sysdm/environment.c index 876330bd4dc..fe0942b14eb 100644 --- a/reactos/lib/cpl/sysdm/environment.c +++ b/reactos/lib/cpl/sysdm/environment.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: environment.c,v 1.2 2004/07/03 17:40:22 navaraf Exp $ +/* $Id: environment.c,v 1.3 2004/07/07 09:42:58 ekohl Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/sysdm/environment.c @@ -33,6 +33,104 @@ #include "sysdm.h" +typedef struct _VARIABLE_DATA +{ + LPTSTR lpName; + LPTSTR lpRawValue; + LPTSTR lpCookedValue; +} VARIABLE_DATA, *PVARIABLE_DATA; + + + +BOOL CALLBACK +EditVariableDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PVARIABLE_DATA VarData; + DWORD dwNameLength; + DWORD dwValueLength; + + VarData = (PVARIABLE_DATA)GetWindowLong(hwndDlg, GWL_USERDATA); + + switch (uMsg) + { + case WM_INITDIALOG: + SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)lParam); + VarData = (PVARIABLE_DATA)lParam; + + if (VarData->lpName != NULL) + { + SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_SETTEXT, 0, (LPARAM)VarData->lpName); + } + + if (VarData->lpRawValue != NULL) + { + SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_SETTEXT, 0, (LPARAM)VarData->lpRawValue); + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + dwNameLength = (DWORD)SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_GETTEXTLENGTH, 0, 0); + dwValueLength = (DWORD)SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXTLENGTH, 0, 0); + if (dwNameLength != 0 && dwValueLength != 0) + { + if (VarData->lpName == NULL) + { + VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); + } + else if (_tcslen(VarData->lpName) < dwNameLength) + { + GlobalFree(VarData->lpName); + VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); + } + SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_GETTEXT, dwNameLength + 1, (LPARAM)VarData->lpName); + + if (VarData->lpRawValue == NULL) + { + VarData->lpRawValue = GlobalAlloc(GPTR, (dwValueLength + 1) * sizeof(TCHAR)); + } + else if (_tcslen(VarData->lpRawValue) < dwValueLength) + { + GlobalFree(VarData->lpRawValue); + VarData->lpRawValue = GlobalAlloc(GPTR, (dwValueLength + 1) * sizeof(TCHAR)); + } + SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXT, dwValueLength + 1, (LPARAM)VarData->lpRawValue); + + if (_tcschr(VarData->lpRawValue, _T('%'))) + { + if (VarData->lpCookedValue == NULL) + { + VarData->lpCookedValue = GlobalAlloc(GPTR, 2 * MAX_PATH * sizeof(TCHAR)); + } + + ExpandEnvironmentStrings(VarData->lpRawValue, + VarData->lpCookedValue, + 2 * MAX_PATH); + } + else if (VarData->lpCookedValue) + { + GlobalFree(VarData->lpCookedValue); + } + } + EndDialog(hwndDlg, 1); + return TRUE; + + case IDCANCEL: + EndDialog(hwndDlg, 0); + return TRUE; + } + break; + } + + return FALSE; +} + + static VOID SetEnvironmentVariables(HWND hwndListView, HKEY hRootKey, @@ -49,9 +147,10 @@ SetEnvironmentVariables(HWND hwndListView, DWORD dwNameLength; DWORD dwDataLength; DWORD dwType; + PVARIABLE_DATA VarData; LV_ITEM lvi; - int nIndex; + int iItem; if (RegOpenKeyEx(hRootKey, lpSubKeyName, @@ -111,9 +210,17 @@ SetEnvironmentVariables(HWND hwndListView, return; } + VarData = GlobalAlloc(GPTR, sizeof(VARIABLE_DATA)); + + VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); + _tcscpy(VarData->lpName, lpName); + + VarData->lpRawValue = GlobalAlloc(GPTR, (dwDataLength + 1) * sizeof(TCHAR)); + _tcscpy(VarData->lpRawValue, lpData); + if (dwType == REG_EXPAND_SZ) { - lpExpandData = GlobalAlloc(GPTR, MAX_PATH * sizeof(TCHAR)); + lpExpandData = GlobalAlloc(GPTR, MAX_PATH * 2* sizeof(TCHAR)); if (lpExpandData == NULL) { GlobalFree(lpName); @@ -124,24 +231,22 @@ SetEnvironmentVariables(HWND hwndListView, ExpandEnvironmentStrings(lpData, lpExpandData, - MAX_PATH); + 2 * MAX_PATH); + + VarData->lpCookedValue = GlobalAlloc(GPTR, (_tcslen(lpExpandData) + 1) * sizeof(TCHAR)); + _tcscpy(VarData->lpCookedValue, lpExpandData); + GlobalFree(lpExpandData); } memset(&lvi, 0x00, sizeof(lvi)); - lvi.mask = LVIF_TEXT | LVIF_STATE; - lvi.pszText = lpName; - lvi.state=0; - nIndex = ListView_InsertItem(hwndListView, &lvi); + lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; + lvi.lParam = (LPARAM)VarData; + lvi.pszText = VarData->lpName; + lvi.state = (i == 0) ? LVIS_SELECTED : 0; + iItem = ListView_InsertItem(hwndListView, &lvi); - if (dwType == REG_EXPAND_SZ) - { - ListView_SetItemText(hwndListView, nIndex, 1, lpExpandData); - GlobalFree(lpExpandData); - } - else - { - ListView_SetItemText(hwndListView, nIndex, 1, lpData); - } + ListView_SetItemText(hwndListView, iItem, 1, + (VarData->lpCookedValue) ? VarData->lpCookedValue : VarData->lpRawValue); } GlobalFree(lpName); @@ -159,7 +264,7 @@ SetListViewColumns(HWND hwndListView) GetClientRect(hwndListView, &rect); memset(&column, 0x00, sizeof(column)); - column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM|LVCF_TEXT; + column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; column.fmt=LVCFMT_LEFT; column.cx = (rect.right - rect.left) / 3; column.iSubItem = 0; @@ -205,6 +310,170 @@ OnInitDialog(HWND hwndDlg) } +VOID +OnNewVariable(HWND hwndDlg, + int iDlgItem) +{ + HWND hwndListView; + PVARIABLE_DATA VarData; + LV_ITEM lvi; + int iItem; + + hwndListView = GetDlgItem(hwndDlg, iDlgItem); + + VarData = GlobalAlloc(GPTR, sizeof(VARIABLE_DATA)); + + if (!DialogBoxParam(hApplet, + MAKEINTRESOURCE(IDD_EDIT_VARIABLE), + hwndDlg, + EditVariableDlgProc, + (LPARAM)VarData) > 0) + { + if (VarData->lpName != NULL) + GlobalFree(VarData->lpName); + + if (VarData->lpRawValue != NULL) + GlobalFree(VarData->lpRawValue); + + if (VarData->lpCookedValue != NULL) + GlobalFree(VarData->lpCookedValue); + + GlobalFree(VarData); + } + + memset(&lvi, 0x00, sizeof(lvi)); + lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; + lvi.lParam = (LPARAM)VarData; + lvi.pszText = VarData->lpName; + lvi.state = 0; + iItem = ListView_InsertItem(hwndListView, &lvi); + + ListView_SetItemText(hwndListView, iItem, 1, + (VarData->lpCookedValue) ? VarData->lpCookedValue : VarData->lpRawValue); +} + + +VOID +OnEditVariable(HWND hwndDlg, + int iDlgItem) +{ + HWND hwndListView; + PVARIABLE_DATA VarData; + LV_ITEM lvi; + int iItem; + + hwndListView = GetDlgItem(hwndDlg, iDlgItem); + + iItem = ListView_GetSelectionMark(hwndListView); + if (iItem != -1) + { + memset(&lvi, 0x00, sizeof(lvi)); + lvi.mask = LVIF_PARAM; + lvi.iItem = iItem; + + if (ListView_GetItem(hwndListView, &lvi)) + { + VarData = (PVARIABLE_DATA)lvi.lParam; + + if (DialogBoxParam(hApplet, + MAKEINTRESOURCE(IDD_EDIT_VARIABLE), + hwndDlg, + EditVariableDlgProc, + (LPARAM)VarData) > 0) + { + ListView_SetItemText(hwndListView, iItem, 0, VarData->lpName); + ListView_SetItemText(hwndListView, iItem, 1, + (VarData->lpCookedValue) ? VarData->lpCookedValue : VarData->lpRawValue); + } + } + } +} + + +VOID +OnDeleteVariable(HWND hwndDlg, + int iDlgItem) +{ + HWND hwndListView; + PVARIABLE_DATA VarData; + LV_ITEM lvi; + int iItem; + + hwndListView = GetDlgItem(hwndDlg, iDlgItem); + + iItem = ListView_GetSelectionMark(hwndListView); + if (iItem != -1) + { + memset(&lvi, 0x00, sizeof(lvi)); + lvi.mask = LVIF_PARAM; + lvi.iItem = iItem; + + if (ListView_GetItem(hwndListView, &lvi)) + { + VarData = (PVARIABLE_DATA)lvi.lParam; + if (VarData != NULL) + { + if (VarData->lpName != NULL) + GlobalFree(VarData->lpName); + + if (VarData->lpRawValue != NULL) + GlobalFree(VarData->lpRawValue); + + if (VarData->lpCookedValue != NULL) + GlobalFree(VarData->lpCookedValue); + + GlobalFree(VarData); + lvi.lParam = 0; + } + } + + ListView_DeleteItem(hwndListView, iItem); + } +} + + +VOID +ReleaseListViewItems(HWND hwndDlg, + int iDlgItem) +{ + HWND hwndListView; + PVARIABLE_DATA VarData; + int nItemCount; + LV_ITEM lvi; + int i; + + hwndListView = GetDlgItem(hwndDlg, iDlgItem); + + memset(&lvi, 0x00, sizeof(lvi)); + + nItemCount = ListView_GetItemCount(hwndListView); + for (i = 0; i < nItemCount; i++) + { + lvi.mask = LVIF_PARAM; + lvi.iItem = i; + + if (ListView_GetItem(hwndListView, &lvi)) + { + VarData = (PVARIABLE_DATA)lvi.lParam; + if (VarData != NULL) + { + if (VarData->lpName != NULL) + GlobalFree(VarData->lpName); + + if (VarData->lpRawValue != NULL) + GlobalFree(VarData->lpRawValue); + + if (VarData->lpCookedValue != NULL) + GlobalFree(VarData->lpCookedValue); + + GlobalFree(VarData); + lvi.lParam = 0; + } + } + } +} + + /* Environment dialog procedure */ BOOL CALLBACK EnvironmentDlgProc(HWND hwndDlg, @@ -222,24 +491,59 @@ EnvironmentDlgProc(HWND hwndDlg, switch (LOWORD(wParam)) { case IDC_USER_VARIABLE_NEW: + OnNewVariable(hwndDlg, IDC_USER_VARIABLE_LIST); + return TRUE; + case IDC_USER_VARIABLE_EDIT: + OnEditVariable(hwndDlg, IDC_USER_VARIABLE_LIST); + return TRUE; + case IDC_USER_VARIABLE_DELETE: - break; + OnDeleteVariable(hwndDlg, IDC_USER_VARIABLE_LIST); + return TRUE; case IDC_SYSTEM_VARIABLE_NEW: + OnNewVariable(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); + return TRUE; + case IDC_SYSTEM_VARIABLE_EDIT: + OnEditVariable(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); + return TRUE; + case IDC_SYSTEM_VARIABLE_DELETE: - break; + OnDeleteVariable(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); + return TRUE; case IDOK: - EndDialog(hwndDlg, 0); - return TRUE; + /* FIXME: Set environment variables in the registry */ case IDCANCEL: + ReleaseListViewItems(hwndDlg, IDC_USER_VARIABLE_LIST); + ReleaseListViewItems(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); EndDialog(hwndDlg, 0); return TRUE; } break; + + case WM_NOTIFY: + { + NMHDR *phdr; + + phdr = (NMHDR*)lParam; + switch(phdr->code) + { + case NM_DBLCLK: + { + if (phdr->idFrom == IDC_USER_VARIABLE_LIST || + phdr->idFrom == IDC_SYSTEM_VARIABLE_LIST) + { + OnEditVariable(hwndDlg, phdr->idFrom); + return TRUE; + } + } + } + } + break; } return FALSE; diff --git a/reactos/lib/cpl/sysdm/resource.h b/reactos/lib/cpl/sysdm/resource.h index e4d56fb1615..3fe4acc0974 100644 --- a/reactos/lib/cpl/sysdm/resource.h +++ b/reactos/lib/cpl/sysdm/resource.h @@ -61,6 +61,10 @@ #define IDC_SYSTEM_VARIABLE_EDIT 226 #define IDC_SYSTEM_VARIABLE_DELETE 227 +#define IDD_EDIT_VARIABLE 106 +#define IDC_VARIABLE_NAME 230 +#define IDC_VARIABLE_VALUE 231 + #endif /* __CPL_RESOURCE_H */ /* EOF */ diff --git a/reactos/lib/cpl/sysdm/sysdm.rc b/reactos/lib/cpl/sysdm/sysdm.rc index d9344bd6d27..dea372e7c57 100644 --- a/reactos/lib/cpl/sysdm/sysdm.rc +++ b/reactos/lib/cpl/sysdm/sysdm.rc @@ -146,7 +146,7 @@ BEGIN PUSHBUTTON "&Delete",IDC_USER_VARIABLE_DELETE,188,90,50,14 GROUPBOX "System variables",-1,7,116,238,100 - LTEXT "V&ariables:",410,14,128,224,8 + LTEXT "V&ariables:",-1,14,128,224,8 CONTROL "",IDC_SYSTEM_VARIABLE_LIST,"SysListView32",LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS|LVS_SORTASCENDING|LVS_NOSORTHEADER|WS_VSCROLL|WS_HSCROLL|WS_TABSTOP,14,139,224,48,WS_EX_CLIENTEDGE PUSHBUTTON "Ne&w...",IDC_SYSTEM_VARIABLE_NEW,80,194,50,14 PUSHBUTTON "Ed&it...",IDC_SYSTEM_VARIABLE_EDIT,134,194,50,14 @@ -156,6 +156,22 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,195,224,50,14 END + +IDD_EDIT_VARIABLE DIALOGEX 10, 15, 227, 71 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Edit Variable" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Variable &Name:",-1,7,14,50,8 + EDITTEXT IDC_VARIABLE_NAME,75,12,145,12,ES_AUTOHSCROLL + LTEXT "Variable &Value:",-1,7,32,50,8 + EDITTEXT IDC_VARIABLE_VALUE,75,30,145,12,ES_AUTOHSCROLL + + DEFPUSHBUTTON "OK",IDOK,116,50,50,14,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,170,50,50,14 +END + + STRINGTABLE BEGIN IDS_CPLSYSTEMNAME "System" From 7a25c2785c43289f06b3a1c577669cf42f33b739 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:22:22 +0000 Subject: [PATCH 206/356] - Add VBE video mode registry. (Gerard Gatineau asked for it) svn path=/trunk/; revision=10009 --- reactos/bootdata/hiveinst.inf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/bootdata/hiveinst.inf b/reactos/bootdata/hiveinst.inf index 551441aabfc..888b3c8c74a 100644 --- a/reactos/bootdata/hiveinst.inf +++ b/reactos/bootdata/hiveinst.inf @@ -10,6 +10,10 @@ Signature = "$ReactOS$" ; VBE SVGA driver HKLM,"SYSTEM\CurrentControlSet\Services\VBE","Start",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\VBE\Device0","DefaultSettings.VRefresh",0x00010001,1 +HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\VBE\Device0","DefaultSettings.BitsPerPel",0x00010001,16 +HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\VBE\Device0","DefaultSettings.XResolution",0x00010001,800 +HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\VBE\Device0","DefaultSettings.YResolution",0x00010001,600 ; VGA miniport driver HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Start",0x00010001,0x00000001 From bfb94c6d6f58f0dbe8d6473562e5360b7a60d62a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:25:00 +0000 Subject: [PATCH 207/356] - Fixed RtlUnwind to correctly remove SEH frames and not to call ZwContinue. svn path=/trunk/; revision=10010 --- reactos/lib/rtl/i386/exception.c | 50 ++++++++++---------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/reactos/lib/rtl/i386/exception.c b/reactos/lib/rtl/i386/exception.c index 961b1376c5d..bb091e72396 100644 --- a/reactos/lib/rtl/i386/exception.c +++ b/reactos/lib/rtl/i386/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.2 2004/07/04 02:01:02 navaraf Exp $ +/* $Id: exception.c,v 1.3 2004/07/07 16:25:00 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -13,7 +13,7 @@ #include #include -//#define NDEBUG +#define NDEBUG #include /* FUNCTIONS ***************************************************************/ @@ -307,34 +307,25 @@ RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, Context.Eax = EaxValue; // Begin traversing the list of EXCEPTION_REGISTRATION - while ((ULONG_PTR)ERHead != -1) + while ((ULONG_PTR)ERHead != -1 && ERHead != RegistrationFrame) { EXCEPTION_RECORD er2; DPRINT("ERHead 0x%X\n", ERHead); - if (ERHead == RegistrationFrame) + // If there's an exception frame, but it's lower on the stack + // than the head of the exception list, something's wrong! + if (RegistrationFrame && (RegistrationFrame <= ERHead)) { - DPRINT("Continueing execution\n"); - ZwContinue(&Context, FALSE); - return; - } - else - { - // If there's an exception frame, but it's lower on the stack - // than the head of the exception list, something's wrong! - if (RegistrationFrame && (RegistrationFrame <= ERHead)) - { - DPRINT("The exception frame is bad\n"); + DPRINT("The exception frame is bad\n"); - // Generate an exception to bail out - er2.ExceptionRecord = pExceptRec; - er2.NumberParameters = 0; - er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; - er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; + // Generate an exception to bail out + er2.ExceptionRecord = pExceptRec; + er2.NumberParameters = 0; + er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; + er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - RtlRaiseException(&er2); - } + RtlRaiseException(&er2); } #if 0 @@ -386,10 +377,10 @@ RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, DPRINT("New ERHead is 0x%X\n", ERHead); DPRINT("Setting exception registration at 0x%X as current\n", - RegistrationFrame->prev); + /*RegistrationFrame->prev*/ pCurrExceptReg->prev); // Unlink the exception handler - SehpSetExceptionList(RegistrationFrame->prev); + SehpSetExceptionList(pCurrExceptReg->prev); } else // The stack looks goofy! Raise an exception to bail out { @@ -403,17 +394,6 @@ RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame, RtlRaiseException(&er2); } } - - // If we get here, we reached the end of the EXCEPTION_REGISTRATION list. - // This shouldn't happen normally. - - DPRINT("Ran out of exception registrations. RegistrationFrame is (0x%X)\n", - RegistrationFrame); - - if ((ULONG_PTR)RegistrationFrame == -1) - ZwContinue(&Context, FALSE); - else - NtRaiseException(pExceptRec, &Context, 0); } /* EOF */ From be3d5c04dac985b06033e4ea69e28e3a81a222a7 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:28:35 +0000 Subject: [PATCH 208/356] - Fixed NtQueryInformationProcess to return STATUS_NOT_IMPLEMENTED for unimplemented cases. svn path=/trunk/; revision=10011 --- reactos/ntoskrnl/ps/process.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 7cf0612b1c5..5c2580f7259 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.131 2004/05/02 04:40:25 jimtabor Exp $ +/* $Id: process.c,v 1.132 2004/07/07 16:28:35 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1085,6 +1085,9 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, case ProcessQuotaLimits: case ProcessIoCounters: + Status = STATUS_NOT_IMPLEMENTED; + break; + case ProcessTimes: if (ProcessInformationLength != sizeof(KERNEL_USER_TIMES)) { @@ -1106,10 +1109,14 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, } } break; + case ProcessDebugPort: case ProcessLdtInformation: case ProcessWorkingSetWatch: case ProcessWx86Information: + Status = STATUS_NOT_IMPLEMENTED; + break; + case ProcessHandleCount: if (ProcessInformationLength != sizeof(ULONG)) { @@ -1125,6 +1132,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, } } break; + case ProcessSessionInformation: case ProcessWow64Information: Status = STATUS_NOT_IMPLEMENTED; From eb298d6e0106eb1ae2a24b85fc8e33f864bf4c24 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:32:02 +0000 Subject: [PATCH 209/356] - Imporved implementation of UnhandledExceptionFilter. - Moved most of code from _except_handler in process/create.c to UnhandledExceptionFilter and changed _except_handler to call it. svn path=/trunk/; revision=10012 --- reactos/lib/kernel32/except/except.c | 138 ++++++++++++++++++-------- reactos/lib/kernel32/process/create.c | 113 +++++---------------- 2 files changed, 125 insertions(+), 126 deletions(-) diff --git a/reactos/lib/kernel32/except/except.c b/reactos/lib/kernel32/except/except.c index 02e66b9c229..f2756e7dcf2 100644 --- a/reactos/lib/kernel32/except/except.c +++ b/reactos/lib/kernel32/except/except.c @@ -1,4 +1,4 @@ -/* $Id: except.c,v 1.14 2004/06/13 20:04:55 navaraf Exp $ +/* $Id: except.c,v 1.15 2004/07/07 16:32:01 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -12,8 +12,11 @@ #include -UINT GlobalErrMode; -LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter; +#define NDEBUG +#include "../include/debug.h" + +UINT GlobalErrMode = 0; +LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter = NULL; UINT GetErrorMode(void) { @@ -50,52 +53,107 @@ SetUnhandledExceptionFilter( } +/* + * Private helper function to lookup the module name from a given address. + * The address can point to anywhere within the module. + */ +static const char* +_module_name_from_addr(const void* addr, char* psz, size_t nChars) +{ + MEMORY_BASIC_INFORMATION mbi; + if (VirtualQuery(addr, &mbi, sizeof(mbi)) != sizeof(mbi) || + !GetModuleFileNameA((HMODULE)mbi.AllocationBase, psz, nChars)) + { + psz[0] = '\0'; + } + return psz; +} + + /* * @unimplemented */ -LONG -STDCALL +LONG STDCALL UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) { - DWORD dbgRet; - HANDLE DebugPort; - NTSTATUS errCode; + DWORD RetValue; + HANDLE DebugPort = NULL; + NTSTATUS ErrCode; + static int RescursionTrap = 3; - if(ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION) { - // might check read only resource - // Is there a debugger running ? - errCode = NtQueryInformationProcess(NtCurrentProcess(),ProcessDebugPort,&DebugPort,sizeof(HANDLE),NULL); - if ( !NT_SUCCESS(errCode) ) { - SetLastErrorByStatus(errCode); - return EXCEPTION_EXECUTE_HANDLER; - } - if ( DebugPort ) { - //return EXCEPTION_CONTINUE_SEARCH; - } - if(GlobalTopLevelExceptionFilter != NULL) { - dbgRet = GlobalTopLevelExceptionFilter(ExceptionInfo); - if(dbgRet == EXCEPTION_EXECUTE_HANDLER) - return EXCEPTION_EXECUTE_HANDLER; - else if(dbgRet == EXCEPTION_CONTINUE_EXECUTION) - return EXCEPTION_CONTINUE_EXECUTION; - } +#if 0 + if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION && + ExceptionInfo->ExceptionRecord->ExceptionInformation[0]) + { + RetValue = _BasepCheckForReadOnlyResource( + ExceptionInfo->ExceptionRecord->ExceptionInformation[1]); + if (RetValue == EXCEPTION_CONTINUE_EXECUTION) + return EXCEPTION_CONTINUE_EXECUTION; + } +#endif - } + if (--RescursionTrap > 0) + { + /* Is there a debugger running ? */ + ErrCode = NtQueryInformationProcess(NtCurrentProcess(), ProcessDebugPort, + &DebugPort, sizeof(HANDLE), NULL); + if (!NT_SUCCESS(ErrCode) && ErrCode != STATUS_NOT_IMPLEMENTED) + { + SetLastErrorByStatus(ErrCode); + return EXCEPTION_EXECUTE_HANDLER; + } - //if ( GetErrorMode() & SEM_NOGPFAULTERRORBOX == SEM_NOGPFAULTERRORBOX ) { - // produce a stack trace or pop a message - //sprintf( message, "Unhandled exception 0x%08lx at address 0x%08lx.", - // ExceptionInfo->ExceptionRecord->ExceptionCode, - // (DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress ); - //MessageBoxA( 0, message, "Error", MB_OK | MB_ICONHAND ); - - //} - // Returning EXCEPTION_EXECUTE_HANDLER means that the code in - // the __execept block will be executed. Normally this will end up in a - // Terminate process. + if (DebugPort) + { + /* Pass the exception to debugger. */ + DPRINT("Passing exception to debugger\n"); + return EXCEPTION_CONTINUE_SEARCH; + } - return EXCEPTION_EXECUTE_HANDLER; - + /* Run unhandled exception handler. */ + if (GlobalTopLevelExceptionFilter != NULL) + { + RetValue = GlobalTopLevelExceptionFilter(ExceptionInfo); + if (RetValue == EXCEPTION_EXECUTE_HANDLER) + return EXCEPTION_EXECUTE_HANDLER; + if (RetValue == EXCEPTION_CONTINUE_EXECUTION) + return EXCEPTION_CONTINUE_EXECUTION; + } + } + + if (RescursionTrap >= 0 && (GetErrorMode() & SEM_NOGPFAULTERRORBOX) == 0) + { +#ifdef _X86_ + PULONG Frame; + CHAR szMod[128] = ""; +#endif + + /* Print a stack trace. */ + DPRINT1("Unhandled exception\n"); + DPRINT1("Address:\n"); + DPRINT1(" %8x %s\n", + ExceptionInfo->ExceptionRecord->ExceptionAddress, + _module_name_from_addr(ExceptionInfo->ExceptionRecord->ExceptionAddress, szMod, sizeof(szMod))); + +#ifdef _X86_ + DPRINT1("Frames:\n"); + Frame = (PULONG)ExceptionInfo->ContextRecord->Ebp; + while (Frame[1] != 0 && Frame[1] != 0xdeadbeef) + { + _module_name_from_addr((const void*)Frame[1], szMod, sizeof(szMod)); + DPRINT1(" %8x %s\n", Frame[1], szMod); + Frame = (PULONG)Frame[0]; + } +#endif + } + + /* + * Returning EXCEPTION_EXECUTE_HANDLER means that the code in + * the __except block will be executed. Normally this will end up in a + * Terminate process. + */ + + return EXCEPTION_EXECUTE_HANDLER; } diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index a393ce28730..14fc209dbe8 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.86 2004/07/03 17:40:22 navaraf Exp $ +/* $Id: create.c,v 1.87 2004/07/07 16:32:02 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -283,103 +283,44 @@ BOOL STDCALL CreateProcessA(LPCSTR lpApplicationName, } -/* - * Private helper function to lookup the module name from a given address. - * The address can point to anywhere within the module. - */ -static const char* -_module_name_from_addr(const void* addr, char* psz, size_t nChars) +static EXCEPTION_DISPOSITION __cdecl +_except_handler(EXCEPTION_RECORD *ExceptionRecord, + void * EstablisherFrame, + CONTEXT *ContextRecord, + void * DispatcherContext) { - MEMORY_BASIC_INFORMATION mbi; - if (VirtualQuery(addr, &mbi, sizeof(mbi)) != sizeof(mbi) || - !GetModuleFileNameA((HMODULE)mbi.AllocationBase, psz, nChars)) + EXCEPTION_POINTERS ExceptionInfo; + EXCEPTION_DISPOSITION ExceptionDisposition; + ExceptionInfo.ExceptionRecord = ExceptionRecord; + ExceptionInfo.ContextRecord = ContextRecord; + ExceptionDisposition = UnhandledExceptionFilter(&ExceptionInfo); + if (ExceptionDisposition == EXCEPTION_EXECUTE_HANDLER) { - psz[0] = '\0'; + /* FIXME */ +#if 0 + if (_BaseRunningInServerProcess) + ExitThread(ExceptionRecord->ExceptionCode); + else +#endif + ExitProcess(ExceptionRecord->ExceptionCode); } - return psz; + + return ExceptionDisposition; } -static int _except_recursion_trap = 0; - -struct _CONTEXT; -struct __EXCEPTION_RECORD; - -static -EXCEPTION_DISPOSITION -__cdecl -_except_handler( - struct _EXCEPTION_RECORD *ExceptionRecord, - void * EstablisherFrame, - struct _CONTEXT *ContextRecord, - void * DispatcherContext ) -{ -#ifdef _X86_ - char szMod[128] = ""; -#endif - DPRINT1("Thread terminated abnormally due to unhandled exception\n"); - DPRINT1("Address:\n"); - DPRINT1("%8x %s\n", - ExceptionRecord->ExceptionAddress, - _module_name_from_addr(ExceptionRecord->ExceptionAddress, szMod, sizeof(szMod))); - -#ifdef _X86_ - { - PULONG Frame; - DPRINT1("Frames:\n"); - Frame = (PULONG)((CONTEXT *)ContextRecord)->Ebp; - while ((PVOID)Frame[1] != NULL && (PULONG)Frame[1] != (PULONG)0xdeadbeef) - { - _module_name_from_addr((const void*)Frame[1], szMod, sizeof(szMod)); - DPRINT1("%8x %s\n", (PVOID)Frame[1], szMod); - Frame = (PULONG)Frame[0]; - } - } -#endif - - if (3 < ++_except_recursion_trap) - { - DPRINT1("_except_handler(...) appears to be recursing.\n"); - DPRINT1("Process HALTED.\n"); - for (;;) - { - } - } - - if (/* FIXME: */ TRUE) /* Not a service */ - { - DPRINT(" calling ExitProcess(0) no, lets try ExitThread . . .\n"); - /* ExitProcess(0); */ - ExitThread(0); - } - else - { - DPRINT(" calling ExitThread(0) . . .\n"); - ExitThread(0); - } - - DPRINT1(" We should not get to here !!!\n"); - /* We should not get to here */ - return ExceptionContinueSearch; -} VOID STDCALL BaseProcessStart(LPTHREAD_START_ROUTINE lpStartAddress, DWORD lpParameter) { - UINT uExitCode = 0; + UINT uExitCode = 0; - DPRINT("BaseProcessStart(..) - setting up exception frame.\n"); + DPRINT("BaseProcessStart(..) - setting up exception frame.\n"); - __try1(_except_handler) - { - uExitCode = (lpStartAddress)((PVOID)lpParameter); - } __except1 - { - } - - DPRINT("BaseProcessStart(..) - cleaned up exception frame.\n"); - - ExitThread(uExitCode); + __try1(_except_handler) + { + uExitCode = (lpStartAddress)((PVOID)lpParameter); + } __except1 } From bf1db388a0a0b62f847906802406cfb3514fec58 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:33:44 +0000 Subject: [PATCH 210/356] - Handle allocation failure in IntCreateBitmap. - Don't allow creating surface with BitmapFormat == 0 (Invalid) in IntCreateSurface. svn path=/trunk/; revision=10013 --- reactos/subsys/win32k/eng/surface.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 1f5ce7b4045..40b4a82ace0 100644 --- a/reactos/subsys/win32k/eng/surface.c +++ b/reactos/subsys/win32k/eng/surface.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: surface.c,v 1.43 2004/07/03 13:55:35 navaraf Exp $ +/* $Id: surface.c,v 1.44 2004/07/07 16:33:44 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -223,6 +223,9 @@ IntCreateBitmap(IN SIZEL Size, PVOID UncompressedBits; ULONG UncompressedFormat; + if (Format == 0) + return 0; + NewBitmap = BITMAPOBJ_AllocBitmap(); if (NewBitmap == NULL) return 0; @@ -274,8 +277,14 @@ IntCreateBitmap(IN SIZEL Size, { SurfObj->pvBits = EngAllocMem(0 != (Flags & BMF_NOZEROINIT) ? 0 : FL_ZERO_MEMORY, SurfObj->cjBits, 0); - } - } + } + if (SurfObj->pvBits == NULL) + { + BITMAPOBJ_UnlockBitmap(NewBitmap); + BITMAPOBJ_FreeBitmap(NewBitmap); + return 0; + } + } } From bce67c86c4caf1596d786b138031ecd33a25e19f Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:34:33 +0000 Subject: [PATCH 211/356] - Fixed ExcludeClipRgn for case when DC contained no clipping region before the call to this function. svn path=/trunk/; revision=10014 --- reactos/subsys/win32k/objects/cliprgn.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index 71b819e50d6..c2b3bb6dcc8 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cliprgn.c,v 1.40 2004/05/26 18:49:06 weiden Exp $ */ +/* $Id: cliprgn.c,v 1.41 2004/07/07 16:34:33 navaraf Exp $ */ #include int FASTCALL @@ -251,14 +251,18 @@ int STDCALL NtGdiExcludeClipRect(HDC hDC, { Result = ERROR; } - else if (!dc->w.hClipRgn) - { - dc->w.hClipRgn = NewRgn; - Result = SIMPLEREGION; - } else { - Result = NtGdiCombineRgn(dc->w.hClipRgn, dc->w.hClipRgn, NewRgn, RGN_DIFF); + if (!dc->w.hClipRgn) + { + dc->w.hClipRgn = NtGdiCreateRectRgn(0, 0, 0, 0); + NtGdiCombineRgn(dc->w.hClipRgn, dc->w.hVisRgn, NewRgn, RGN_DIFF); + Result = SIMPLEREGION; + } + else + { + Result = NtGdiCombineRgn(dc->w.hClipRgn, dc->w.hClipRgn, NewRgn, RGN_DIFF); + } NtGdiDeleteObject(NewRgn); } if (Result != ERROR) From 226251dab16fcf072b740c0b2af37f7d4414e6f6 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:36:08 +0000 Subject: [PATCH 212/356] - Don't create XLATEOBJ for BitBlt and StretchBlt operations that don't use source DC. svn path=/trunk/; revision=10015 --- reactos/subsys/win32k/objects/bitmaps.c | 209 +++++++++++++----------- 1 file changed, 110 insertions(+), 99 deletions(-) diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 8c1980c6f77..12f7d091d28 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmaps.c,v 1.77 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.78 2004/07/07 16:36:08 navaraf Exp $ */ #include #define IN_RECT(r,x,y) \ @@ -139,34 +139,17 @@ NtGdiBitBlt( BrushObj = NULL; } - if (DCDest->w.hPalette != 0) - DestPalette = DCDest->w.hPalette; - - if (UsesSource && DCSrc->w.hPalette != 0) - SourcePalette = DCSrc->w.hPalette; - - PalSourceGDI = PALETTE_LockPalette(SourcePalette); - if (NULL == PalSourceGDI) + /* Create the XLATEOBJ. */ + if (UsesSource) { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - SourceMode = PalSourceGDI->Mode; - PALETTE_UnlockPalette(SourcePalette); + if (DCDest->w.hPalette != 0) + DestPalette = DCDest->w.hPalette; - if (DestPalette == SourcePalette) - { - DestMode = SourceMode; - } - else - { - PalDestGDI = PALETTE_LockPalette(DestPalette); - if (NULL == PalDestGDI) + if (DCSrc->w.hPalette != 0) + SourcePalette = DCSrc->w.hPalette; + + PalSourceGDI = PALETTE_LockPalette(SourcePalette); + if (NULL == PalSourceGDI) { if (UsesSource && hDCSrc != hDCDest) { @@ -176,56 +159,78 @@ NtGdiBitBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } - DestMode = PalDestGDI->Mode; - PALETTE_UnlockPalette(DestPalette); - } + SourceMode = PalSourceGDI->Mode; + PALETTE_UnlockPalette(SourcePalette); - /* KB41464 details how to convert between mono and color */ - if (DCDest->w.bitsPerPixel == 1) - { - XlateObj = (XLATEOBJ*)IntEngCreateMonoXlate(SourceMode, DestPalette, - SourcePalette, DCSrc->w.backgroundColor); - } - else if (UsesSource && 1 == DCSrc->w.bitsPerPixel) - { - ULONG Colors[2]; - - Colors[0] = DCSrc->w.textColor; - Colors[1] = DCSrc->w.backgroundColor; - Mono = PALETTE_AllocPaletteIndexedRGB(2, (RGBQUAD*)Colors); - if (NULL != Mono) + if (DestPalette == SourcePalette) { - XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); + DestMode = SourceMode; } else { - XlateObj = NULL; + PalDestGDI = PALETTE_LockPalette(DestPalette); + if (NULL == PalDestGDI) + { + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + DestMode = PalDestGDI->Mode; + PALETTE_UnlockPalette(DestPalette); } - } - else - { - XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); - } - if (NULL == XlateObj) - { - if (NULL != Mono) + + /* KB41464 details how to convert between mono and color */ + if (DCDest->w.bitsPerPixel == 1) { - EngDeletePalette(Mono); + XlateObj = (XLATEOBJ*)IntEngCreateMonoXlate(SourceMode, DestPalette, + SourcePalette, DCSrc->w.backgroundColor); } - if (UsesSource && hDCSrc != hDCDest) + else if (DCSrc->w.bitsPerPixel == 1) { - DC_UnlockDc(hDCSrc); + ULONG Colors[2]; + + Colors[0] = DCSrc->w.textColor; + Colors[1] = DCSrc->w.backgroundColor; + Mono = PALETTE_AllocPaletteIndexedRGB(2, (RGBQUAD*)Colors); + if (NULL != Mono) + { + XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); + } + else + { + XlateObj = NULL; + } + } + else + { + XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); + } + if (NULL == XlateObj) + { + if (NULL != Mono) + { + EngDeletePalette(Mono); + } + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + return FALSE; } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return FALSE; } /* Perform the bitblt operation */ Status = IntEngBitBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, XlateObj, &DestRect, &SourcePoint, NULL, &BrushObj->BrushObject, &BrushOrigin, ROP); - EngDeleteXlate(XlateObj); + if (UsesSource) + EngDeleteXlate(XlateObj); BITMAPOBJ_UnlockBitmap(DCDest->w.hBitmap); if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) { @@ -1140,34 +1145,17 @@ NtGdiStretchBlt( BrushObj = NULL; } - if (DCDest->w.hPalette != 0) - DestPalette = DCDest->w.hPalette; - - if (UsesSource && DCSrc->w.hPalette != 0) - SourcePalette = DCSrc->w.hPalette; - - PalSourceGDI = PALETTE_LockPalette(SourcePalette); - if (NULL == PalSourceGDI) + /* Create the XLATEOBJ. */ + if (UsesSource) { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - SourceMode = PalSourceGDI->Mode; - PALETTE_UnlockPalette(SourcePalette); + if (DCDest->w.hPalette != 0) + DestPalette = DCDest->w.hPalette; - if (DestPalette == SourcePalette) - { - DestMode = SourceMode; - } - else - { - PalDestGDI = PALETTE_LockPalette(DestPalette); - if (NULL == PalDestGDI) + if (DCSrc->w.hPalette != 0) + SourcePalette = DCSrc->w.hPalette; + + PalSourceGDI = PALETTE_LockPalette(SourcePalette); + if (NULL == PalSourceGDI) { if (UsesSource && hDCSrc != hDCDest) { @@ -1177,27 +1165,50 @@ NtGdiStretchBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } - DestMode = PalDestGDI->Mode; - PALETTE_UnlockPalette(DestPalette); - } + SourceMode = PalSourceGDI->Mode; + PALETTE_UnlockPalette(SourcePalette); - XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); - if (NULL == XlateObj) - { - if (UsesSource && hDCSrc != hDCDest) + if (DestPalette == SourcePalette) { - DC_UnlockDc(hDCSrc); + DestMode = SourceMode; + } + else + { + PalDestGDI = PALETTE_LockPalette(DestPalette); + if (NULL == PalDestGDI) + { + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + DestMode = PalDestGDI->Mode; + PALETTE_UnlockPalette(DestPalette); + } + + /* FIXME: Use the same logic for create XLATEOBJ as in NtGdiBitBlt. */ + XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); + if (NULL == XlateObj) + { + if (UsesSource && hDCSrc != hDCDest) + { + DC_UnlockDc(hDCSrc); + } + DC_UnlockDc(hDCDest); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + return FALSE; } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return FALSE; } /* Perform the bitblt operation */ Status = IntEngStretchBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, XlateObj, &DestRect, &SourceRect, NULL, NULL, NULL, COLORONCOLOR); - EngDeleteXlate(XlateObj); + if (UsesSource) + EngDeleteXlate(XlateObj); BITMAPOBJ_UnlockBitmap(DCDest->w.hBitmap); if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) { From 680d163578ab03057a617c4164eb3b7e051c6a6e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 7 Jul 2004 16:47:43 +0000 Subject: [PATCH 213/356] added missing cvsignore file svn path=/trunk/; revision=10016 --- reactos/lib/cpl/access/.cvsignore | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 reactos/lib/cpl/access/.cvsignore diff --git a/reactos/lib/cpl/access/.cvsignore b/reactos/lib/cpl/access/.cvsignore new file mode 100644 index 00000000000..e569704df95 --- /dev/null +++ b/reactos/lib/cpl/access/.cvsignore @@ -0,0 +1,14 @@ +*.coff +*.cpl +*.d +*.a +*.o +*.sym +*.map +*.tmp + +*.ncb +*.opt +*.plg +Debug +Release \ No newline at end of file From e4848fe10094613188aa3a566e2664ecad18ca71 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:50:54 +0000 Subject: [PATCH 214/356] - Return image name in SymGetModuleInfo since some applications use it for determining path. It's still a stub though. svn path=/trunk/; revision=10017 --- reactos/lib/imagehlp/symbol.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/reactos/lib/imagehlp/symbol.c b/reactos/lib/imagehlp/symbol.c index d71a843d5a1..6ab4428e5e6 100644 --- a/reactos/lib/imagehlp/symbol.c +++ b/reactos/lib/imagehlp/symbol.c @@ -94,11 +94,23 @@ BOOL WINAPI SymGetModuleInfo( HANDLE hProcess, DWORD dwAddr, PIMAGEHLP_MODULE ModuleInfo) { - FIXME("(%p, 0x%08lx, %p): stub\n", + MEMORY_BASIC_INFORMATION mbi; + + FIXME("(%p, 0x%08lx, %p): hacked stub\n", hProcess, dwAddr, ModuleInfo ); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + + /* + * OpenOffice uses this function to get paths of it's modules + * from address inside the module. So return at least that for + * now. + */ + if (VirtualQuery((PVOID)dwAddr, &mbi, sizeof(mbi)) != sizeof(mbi) || + !GetModuleFileNameA((HMODULE)mbi.AllocationBase, ModuleInfo->ImageName, sizeof(ModuleInfo->ImageName))) + { + return FALSE; + } + return TRUE; } /*********************************************************************** From 825a514a465b1a77a14637a840a243c45a4335a8 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 16:54:43 +0000 Subject: [PATCH 215/356] - Use LinBytesPerScanLine (value for linar framebuffer modes) instead of BytesPerScanLine for VBE 3.0 controllers. svn path=/trunk/; revision=10018 --- reactos/drivers/video/miniport/vbe/vbemp.c | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index cd2a21917ac..c16897b77d3 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -88,8 +88,8 @@ VBESortModesCallback(PVBE_MODEINFO VbeModeInfoA, PVBE_MODEINFO VbeModeInfoB) * be available we favor more bits per pixel. It should be changed * later. */ - if (VbeModeInfoA->BitsPerPixel < VbeModeInfoB->BitsPerPixel) return 1; - if (VbeModeInfoA->BitsPerPixel > VbeModeInfoB->BitsPerPixel) return -1; + if (VbeModeInfoA->BitsPerPixel < VbeModeInfoB->BitsPerPixel) return -1; + if (VbeModeInfoA->BitsPerPixel > VbeModeInfoB->BitsPerPixel) return 1; if (VbeModeInfoA->XResolution < VbeModeInfoB->XResolution) return -1; if (VbeModeInfoA->XResolution > VbeModeInfoB->XResolution) return 1; if (VbeModeInfoA->YResolution < VbeModeInfoB->YResolution) return -1; @@ -737,9 +737,18 @@ VBEMapVideoMemory( FrameBuffer.QuadPart = DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].PhysBasePtr; MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress; - MapInformation->VideoRamLength = - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BytesPerScanLine * - DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution; + if (DeviceExtension->VbeInfo.Version < 0x300) + { + MapInformation->VideoRamLength = + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BytesPerScanLine * + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution; + } + else + { + MapInformation->VideoRamLength = + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].LinBytesPerScanLine * + DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution; + } } #ifdef VBE12_SUPPORT else @@ -816,7 +825,10 @@ VBEQueryMode( VideoMode->ModeIndex = VideoModeId; VideoMode->VisScreenWidth = VBEMode->XResolution; VideoMode->VisScreenHeight = VBEMode->YResolution; - VideoMode->ScreenStride = VBEMode->BytesPerScanLine; + if (DeviceExtension->VbeInfo.Version < 0x300) + VideoMode->ScreenStride = VBEMode->BytesPerScanLine; + else + VideoMode->ScreenStride = VBEMode->LinBytesPerScanLine; VideoMode->NumberOfPlanes = VBEMode->NumberOfPlanes; VideoMode->BitsPerPlane = VBEMode->BitsPerPixel / VBEMode->NumberOfPlanes; VideoMode->Frequency = 1; From 596469a0b65405be80d053ca81171cae5e752360 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 7 Jul 2004 17:03:32 +0000 Subject: [PATCH 216/356] - Updated system colors. svn path=/trunk/; revision=10019 --- reactos/lib/user32/windows/defwnd.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index 3e96bf1ad6a..f791d0895b9 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.141 2004/07/03 17:40:23 navaraf Exp $ +/* $Id: defwnd.c,v 1.142 2004/07/07 17:03:32 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -59,33 +59,33 @@ static HBITMAP hbScrRight; static COLORREF SysColors[] = { - RGB(192, 192, 192) /* COLOR_SCROLLBAR */, + RGB(212, 208, 200) /* COLOR_SCROLLBAR */, RGB(58, 110, 165) /* COLOR_BACKGROUND */, RGB(10, 36, 106) /* COLOR_ACTIVECAPTION */, RGB(128, 128, 128) /* COLOR_INACTIVECAPTION */, - RGB(192, 192, 192) /* COLOR_MENU */, + RGB(212, 208, 200) /* COLOR_MENU */, RGB(255, 255, 255) /* COLOR_WINDOW */, RGB(0, 0, 0) /* COLOR_WINDOWFRAME */, RGB(0, 0, 0) /* COLOR_MENUTEXT */, RGB(0, 0, 0) /* COLOR_WINDOWTEXT */, RGB(255, 255, 255) /* COLOR_CAPTIONTEXT */, - RGB(192, 192, 192) /* COLOR_ACTIVEBORDER */, - RGB(192, 192, 192) /* COLOR_INACTIVEBORDER */, + RGB(212, 208, 200) /* COLOR_ACTIVEBORDER */, + RGB(212, 208, 200) /* COLOR_INACTIVEBORDER */, RGB(128, 128, 128) /* COLOR_APPWORKSPACE */, - RGB(0, 0, 128) /* COLOR_HILIGHT */, + RGB(10, 36, 106) /* COLOR_HILIGHT */, RGB(255, 255, 255) /* COLOR_HILIGHTTEXT */, - RGB(192, 192, 192) /* COLOR_BTNFACE */, + RGB(212, 208, 200) /* COLOR_BTNFACE */, RGB(128, 128, 128) /* COLOR_BTNSHADOW */, RGB(128, 128, 128) /* COLOR_GRAYTEXT */, RGB(0, 0, 0) /* COLOR_BTNTEXT */, - RGB(192, 192, 192) /* COLOR_INACTIVECAPTIONTEXT */, + RGB(212, 208, 200) /* COLOR_INACTIVECAPTIONTEXT */, RGB(255, 255, 255) /* COLOR_BTNHILIGHT */, - RGB(32, 32, 32) /* COLOR_3DDKSHADOW */, - RGB(192, 192, 192) /* COLOR_3DLIGHT */, + RGB(64, 64, 64) /* COLOR_3DDKSHADOW */, + RGB(212, 208, 200) /* COLOR_3DLIGHT */, RGB(0, 0, 0) /* COLOR_INFOTEXT */, - RGB(255, 255, 192) /* COLOR_INFOBK */, - RGB(180, 180, 180) /* COLOR_ALTERNATEBTNFACE */, - RGB(0, 0, 255) /* COLOR_HOTLIGHT */, + RGB(255, 255, 225) /* COLOR_INFOBK */, + RGB(181, 181, 181) /* COLOR_ALTERNATEBTNFACE */, + RGB(0, 0, 128) /* COLOR_HOTLIGHT */, RGB(166, 202, 240) /* COLOR_GRADIENTACTIVECAPTION */, RGB(192, 192, 192) /* COLOR_GRADIENTINACTIVECAPTION */, }; From 6d616faf61b33508d6d639caf06c3b184048de6b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 7 Jul 2004 17:20:35 +0000 Subject: [PATCH 217/356] Add ACCESS_STATE and INITIAL_PRIVILEGE_SET. svn path=/trunk/; revision=10020 --- reactos/include/ddk/setypes.h | 26 +++++++++++++++++++++++++- reactos/include/ntos/obtypes.h | 5 +---- reactos/include/ntos/security.h | 9 +++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/reactos/include/ddk/setypes.h b/reactos/include/ddk/setypes.h index 78baff63748..087e110dbb6 100644 --- a/reactos/include/ddk/setypes.h +++ b/reactos/include/ddk/setypes.h @@ -1,4 +1,4 @@ -/* $Id: setypes.h,v 1.13 2004/02/02 12:03:43 ekohl Exp $ +/* $Id: setypes.h,v 1.14 2004/07/07 17:20:35 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory for details * PROJECT: ReactOS kernel @@ -179,6 +179,30 @@ typedef enum _SECURITY_OPERATION_CODE AssignSecurityDescriptor } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE; +typedef struct _ACCESS_STATE +{ + LUID OperationID; + BOOLEAN SecurityEvaluated; + BOOLEAN GenerateAudit; + BOOLEAN GenerateClose; + BOOLEAN PrivilegesAllocated; + ULONG Flags; + ACCESS_MASK RemainingDesiredAccess; + ACCESS_MASK PreviouslyGrantedAccess; + ACCESS_MASK OriginallyDesiredAccess; + SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; /* 0x1C */ + PSECURITY_DESCRIPTOR SecurityDescriptor; /* 0x2C */ + PVOID AuxData; /* 0x30 */ + union + { + INITIAL_PRIVILEGE_SET InitialPrivilegeSet; + PRIVILEGE_SET PrivilegeSet; + } Privileges; + BOOLEAN AuditPrivileges; + UNICODE_STRING ObjectName; + UNICODE_STRING ObjectTypeName; +} ACCESS_STATE, *PACCESS_STATE; + #endif /* EOF */ diff --git a/reactos/include/ntos/obtypes.h b/reactos/include/ntos/obtypes.h index 71a27325dde..958b61f31c3 100755 --- a/reactos/include/ntos/obtypes.h +++ b/reactos/include/ntos/obtypes.h @@ -1,14 +1,11 @@ #ifndef _INCLUDE_DDK_OBTYPES_H #define _INCLUDE_DDK_OBTYPES_H -/* $Id: obtypes.h,v 1.7 2003/10/21 15:49:19 ekohl Exp $ */ +/* $Id: obtypes.h,v 1.8 2004/07/07 17:20:16 ekohl Exp $ */ struct _DIRECTORY_OBJECT; struct _OBJECT_ATTRIBUTES; #ifndef __USE_W32API -typedef ULONG ACCESS_STATE, *PACCESS_STATE; - - typedef struct _OBJECT_HANDLE_INFORMATION { ULONG HandleAttributes; diff --git a/reactos/include/ntos/security.h b/reactos/include/ntos/security.h index 87804906b68..ea778000f66 100644 --- a/reactos/include/ntos/security.h +++ b/reactos/include/ntos/security.h @@ -349,6 +349,15 @@ typedef struct _PRIVILEGE_SET LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]; } PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET; +#define INITIAL_PRIVILEGE_COUNT 3 + +typedef struct _INITIAL_PRIVILEGE_SET +{ + ULONG PrivilegeCount; + ULONG Control; + LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT]; +} INITIAL_PRIVILEGE_SET, *PINITIAL_PRIVILEGE_SET; + typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; From 8d126dbfc4a36f9901beeb8debf72be9e798c2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 7 Jul 2004 22:29:37 +0000 Subject: [PATCH 218/356] Add command-line shutdown/logoff utility svn path=/trunk/; revision=10028 --- reactos/apps/tests/fiber/fiber.c | 4 +- reactos/apps/utils/Makefile | 2 +- reactos/apps/utils/shutdown/.cvsignore | 6 + reactos/apps/utils/shutdown/Makefile | 23 ++++ reactos/apps/utils/shutdown/shutdown.c | 168 +++++++++++++++++++++++++ reactos/include/tchar.h | 17 ++- 6 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 reactos/apps/utils/shutdown/.cvsignore create mode 100644 reactos/apps/utils/shutdown/Makefile create mode 100644 reactos/apps/utils/shutdown/shutdown.c diff --git a/reactos/apps/tests/fiber/fiber.c b/reactos/apps/tests/fiber/fiber.c index 3dfb2dc1be8..94318f56d13 100644 --- a/reactos/apps/tests/fiber/fiber.c +++ b/reactos/apps/tests/fiber/fiber.c @@ -1,4 +1,4 @@ -/* $Id: fiber.c,v 1.3 2004/07/03 17:40:19 navaraf Exp $ +/* $Id: fiber.c,v 1.4 2004/07/07 22:29:37 gvg Exp $ */ #include @@ -426,7 +426,7 @@ int _tmain(int argc, _TCHAR const * const * argv) unsigned nFibers; if(argc > 1) - nFibers = _tcstoul(argv[1], 0, NULL); + nFibers = _tcstoul(argv[1], NULL, 0); else nFibers = FIBERTEST_COUNT; diff --git a/reactos/apps/utils/Makefile b/reactos/apps/utils/Makefile index ec127395847..2744bc70c11 100644 --- a/reactos/apps/utils/Makefile +++ b/reactos/apps/utils/Makefile @@ -9,7 +9,7 @@ include $(PATH_TO_TOP)/rules.mak # Console system utilities # cabman cat net objdir partinfo pice ps sc stats -UTIL_APPS = cat objdir partinfo pnpdump sc stats tickcount consw rundll32 regsvr32 +UTIL_APPS = cat objdir partinfo pnpdump sc shutdown stats tickcount consw rundll32 regsvr32 UTIL_NET_APPS = diff --git a/reactos/apps/utils/shutdown/.cvsignore b/reactos/apps/utils/shutdown/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/utils/shutdown/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/utils/shutdown/Makefile b/reactos/apps/utils/shutdown/Makefile new file mode 100644 index 00000000000..d47429a5353 --- /dev/null +++ b/reactos/apps/utils/shutdown/Makefile @@ -0,0 +1,23 @@ +# $Id: Makefile,v 1.1 2004/07/07 22:29:37 gvg Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = shutdown + +TARGET_SDKLIBS = kernel32.a user32.a + +TARGET_OBJECTS = shutdown.o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/utils/shutdown/shutdown.c b/reactos/apps/utils/shutdown/shutdown.c new file mode 100644 index 00000000000..b978a8043cd --- /dev/null +++ b/reactos/apps/utils/shutdown/shutdown.c @@ -0,0 +1,168 @@ +/* $Id: shutdown.c,v 1.1 2004/07/07 22:29:37 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS shutdown/logoff utility + * FILE: apps/utils/shutdown/shutdown.c + * PURPOSE: Initiate logoff, shutdown or reboot of the system + */ + +#include +#include +#include +#include + +static void +PrintUsage(LPCTSTR Cmd) +{ + _ftprintf(stderr, _T("usage: %s [action] [flag]\n"), Cmd); + _ftprintf(stderr, _T(" action = \"logoff\", \"reboot\", \"shutdown\" or \"poweroff\"\n")); + _ftprintf(stderr, _T(" flag = \"force\"\n")); +} + +int +_tmain(int argc, TCHAR *argv[]) +{ + static struct + { + TCHAR *Name; + UINT ExitType; + UINT ExitFlags; + } + Options[] = + { + { _T("logoff"), EWX_LOGOFF, 0 }, + { _T("logout"), EWX_LOGOFF, 0 }, + { _T("poweroff"), EWX_POWEROFF, 0 }, + { _T("powerdown"), EWX_POWEROFF, 0 }, + { _T("reboot"), EWX_REBOOT, 0 }, + { _T("restart"), EWX_REBOOT, 0 }, + { _T("shutdown"), EWX_SHUTDOWN, 0 }, + { _T("force"), 0, EWX_FORCE } + }; + UINT ExitType, ExitFlags; + HANDLE hToken; + TOKEN_PRIVILEGES npr; + TCHAR *Arg; + TCHAR BaseName[_MAX_FNAME]; + unsigned i, j; + BOOL HaveType, Matched; + + ExitType = 0; + ExitFlags = 0; + HaveType = FALSE; + + _tsplitpath(argv[0], NULL, NULL, BaseName, NULL); + + /* Process optional arguments */ + for (i = 1; i < (unsigned) argc; i++) + { + /* Allow e.g. "/s" or "-l" for shutdown resp. logoff */ + Arg = argv[i]; + if (_T('/') == *Arg || _T('-') == *Arg) + { + Arg++; + } + + /* Search known options */ + Matched = FALSE; + for (j = 0; j < sizeof(Options) / sizeof(Options[0]) && ! Matched; j++) + { + /* Match if arg starts the same as the option name */ + if (0 == _tcsnicmp(Options[j].Name, Arg, _tcslen(Arg))) + { + if (0 != Options[j].ExitType) + { + /* Can have only 1 type */ + if (HaveType) + { + PrintUsage(BaseName); + exit(1); + } + ExitType = Options[j].ExitType; + HaveType = TRUE; + } + else + { + /* Can have only 1 flag */ + if (0 != ExitFlags) + { + PrintUsage(BaseName); + exit(1); + } + ExitFlags |= Options[j].ExitFlags; + } + Matched = TRUE; + } + } + + /* Was the argument processed? */ + if (! Matched) + { + PrintUsage(BaseName); + exit(1); + } + } + + /* Check command name if user didn't explicitly specify action */ + if (! HaveType) + { + for (j = 0; j < sizeof(Options) / sizeof(Options[0]); j++) + { + if (0 == _tcsicmp(Options[j].Name, BaseName) && 0 != Options[j].ExitType) + { + ExitType = Options[j].ExitType; + HaveType = TRUE; + } + } + } + + /* Still not sure what to do? */ + if (! HaveType) + { + PrintUsage(BaseName); + exit(1); + } + + /* Everyone can logoff, for the other actions you need the appropriate privilege */ + if (EWX_LOGOFF != ExitType) + { + /* enable shutdown privilege for current process */ + if (! OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) + { + _ftprintf(stderr, _T("OpenProcessToken failed with error %d\n"), (int) GetLastError()); + exit(1); + } + npr.PrivilegeCount = 1; + npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + if (! LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &npr.Privileges[0].Luid)) + { + CloseHandle(hToken); + _ftprintf(stderr, _T("LookupPrivilegeValue failed with error %d\n"), (int) GetLastError()); + exit(1); + } + if (! AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0) + || ERROR_SUCCESS != GetLastError()) + { + CloseHandle(hToken); + if (ERROR_NOT_ALL_ASSIGNED == GetLastError()) + { + _ftprintf(stderr, _T("You are not authorized to shutdown the system\n")); + } + else + { + _ftprintf(stderr, _T("AdjustTokenPrivileges failed with error %d\n"), (int) GetLastError()); + } + exit(1); + } + CloseHandle(hToken); + } + + /* Finally do it */ + if (! ExitWindowsEx(ExitType | ExitFlags, 0)) + { + _ftprintf(stderr, _T("ExitWindowsEx failed with error %d\n"), (int) GetLastError()); + exit(1); + } + + return 0; +} diff --git a/reactos/include/tchar.h b/reactos/include/tchar.h index 95e6cdbeabd..0ac89e0cff1 100644 --- a/reactos/include/tchar.h +++ b/reactos/include/tchar.h @@ -29,14 +29,20 @@ * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.10 $ - * $Author: royce $ - * $Date: 2003/08/11 00:04:05 $ + * $Revision: 1.11 $ + * $Author: gvg $ + * $Date: 2004/07/07 22:29:37 $ * */ -#ifndef _TCHAR_H_ -#define _TCHAR_H_ +#ifndef _ROS_TCHAR_H_ +#define _ROS_TCHAR_H_ + +#ifdef __USE_W32API + +#include_next + +#else /* Not __USE_W32API */ #include @@ -259,3 +265,4 @@ typedef char TCHAR; #endif /* Not _TCHAR_H_ */ +#endif /* Not __USE_W32API */ From 580f2e7a686fb2a0da7ff3ca441232a867ff9778 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Jul 2004 00:40:31 +0000 Subject: [PATCH 219/356] 1. implemented the timer queue functions of kernel32 (I tested the implementation of CreateTimerQueueTimer() and DeleteTimerQueueTimer() on windows) 2. export the timer queue Rtl* stubs of ntdll svn path=/trunk/; revision=10029 --- reactos/include/base.h | 4 +- reactos/include/funcs.h | 23 -- reactos/include/ntdll/rtl.h | 31 +- reactos/lib/kernel32/makefile | 4 +- reactos/lib/kernel32/misc/stubs.c | 123 +------- reactos/lib/kernel32/misc/timerqueue.c | 377 +++++++++++++++++++++++++ reactos/lib/ntdll/def/ntdll.def | 8 +- reactos/lib/ntdll/def/ntdll.edf | 8 +- reactos/lib/ntdll/makefile | 3 +- reactos/lib/ntdll/rtl/timerqueue.c | 119 ++++++++ 10 files changed, 547 insertions(+), 153 deletions(-) create mode 100644 reactos/lib/kernel32/misc/timerqueue.c create mode 100644 reactos/lib/ntdll/rtl/timerqueue.c diff --git a/reactos/include/base.h b/reactos/include/base.h index 282db9f5917..333a062fe56 100644 --- a/reactos/include/base.h +++ b/reactos/include/base.h @@ -733,8 +733,8 @@ typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE { HighMemoryResourceNotification } MEMORY_RESOURCE_NOTIFICATION_TYPE; -typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); -typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK; +typedef VOID (CALLBACK *WAITORTIMERCALLBACK) (PVOID, BOOLEAN ); + /* End of stuff from ddeml.h in old Cygnus headers */ /* ----------------------------------------------- */ diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index 7c8423d1c9a..763a63f156c 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -1073,29 +1073,6 @@ STDCALL RtlQueryDepthSList ( PSLIST_HEADER ListHead ); -NTSTATUS -STDCALL -RtlCreateTimer(HANDLE TimerQueue,PHANDLE phNewTimer, WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,ULONG Flags); - -NTSTATUS -STDCALL -RtlCreateTimerQueue(PHANDLE TimerQueue); - -NTSTATUS -STDCALL -RtlDeleteTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent); - -NTSTATUS -STDCALL -RtlUpdateTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period); - -NTSTATUS -STDCALL -RtlDeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent); - -NTSTATUS -STDCALL -RtlDeleteTimerQueue(HANDLE TimerQueue); NTSTATUS STDCALL diff --git a/reactos/include/ntdll/rtl.h b/reactos/include/ntdll/rtl.h index 365a41386e3..e61f005d1cc 100644 --- a/reactos/include/ntdll/rtl.h +++ b/reactos/include/ntdll/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.43 2004/02/03 14:19:56 ekohl Exp $ +/* $Id: rtl.h,v 1.44 2004/07/08 00:40:30 weiden Exp $ * */ @@ -616,6 +616,35 @@ VOID STDCALL RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash, IN OUT PUNICODE_STRING String); +/* Timer Queue functions */ + +typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); + +NTSTATUS +STDCALL +RtlCreateTimer(HANDLE TimerQueue,PHANDLE phNewTimer, WAITORTIMERCALLBACKFUNC Callback,PVOID Parameter,DWORD DueTime,DWORD Period,ULONG Flags); + +NTSTATUS +STDCALL +RtlCreateTimerQueue(PHANDLE TimerQueue); + +NTSTATUS +STDCALL +RtlDeleteTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent); + +NTSTATUS +STDCALL +RtlUpdateTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period); + +NTSTATUS +STDCALL +RtlDeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent); + +NTSTATUS +STDCALL +RtlDeleteTimerQueue(HANDLE TimerQueue); + + #ifndef __NTDRIVER__ #ifndef __INTERLOCKED_DECLARED diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index eff36290df5..9258dd80b04 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.81 2004/06/26 20:11:18 gdalsnes Exp $ +# $Id: makefile,v 1.82 2004/07/08 00:40:30 weiden Exp $ PATH_TO_TOP = ../.. @@ -30,7 +30,7 @@ SYNCH_OBJECTS = synch/critical.o synch/event.o synch/intrlck.o synch/mutex.o \ MISC_OBJECTS = misc/error.o misc/atom.o misc/handle.o misc/env.o \ misc/dllmain.o misc/comm.o misc/errormsg.o \ - misc/console.o misc/time.o misc/toolhelp.o \ + misc/console.o misc/time.o misc/timerqueue.o misc/toolhelp.o \ misc/stubs.o misc/lang.o misc/ldr.o misc/res.o \ misc/sysinfo.o misc/profile.o \ misc/mbchars.o misc/muldiv.o misc/computername.o \ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 0c5056691c7..ca067da5f21 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.79 2004/06/26 12:56:11 navaraf Exp $ +/* $Id: stubs.c,v 1.80 2004/07/08 00:40:30 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -653,35 +653,6 @@ CancelDeviceWakeupRequest( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -CancelTimerQueueTimer( - HANDLE TimerQueue, - HANDLE Timer - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} -/* - * @unimplemented - */ - -BOOL -STDCALL -ChangeTimerQueueTimer( - HANDLE TimerQueue, - HANDLE Timer, - ULONG DueTime, - ULONG Period - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} /* * @unimplemented @@ -736,38 +707,6 @@ CreateMemoryResourceNotification( return 0; } -/* - * @unimplemented - */ -HANDLE -STDCALL -CreateTimerQueue( - VOID - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CreateTimerQueueTimer( - PHANDLE phNewTimer, - HANDLE TimerQueue, - WAITORTIMERCALLBACK Callback, - PVOID Parameter, - DWORD DueTime, - DWORD Period, - ULONG Flags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -783,48 +722,6 @@ DeactivateActCtx( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -DeleteTimerQueue( - HANDLE TimerQueue - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -DeleteTimerQueueEx( - HANDLE TimerQueue, - HANDLE CompletionEvent - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -DeleteTimerQueueTimer( - HANDLE TimerQueue, - HANDLE Timer, - HANDLE CompletionEvent - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -1458,24 +1355,6 @@ SetThreadExecutionState( return 0; } -/* - * @unimplemented - */ -HANDLE -STDCALL -SetTimerQueueTimer( - HANDLE TimerQueue, - WAITORTIMERCALLBACK Callback, - PVOID Parameter, - DWORD DueTime, - DWORD Period, - BOOL PreferIo - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/kernel32/misc/timerqueue.c b/reactos/lib/kernel32/misc/timerqueue.c new file mode 100644 index 00000000000..4bb0e1aeeb6 --- /dev/null +++ b/reactos/lib/kernel32/misc/timerqueue.c @@ -0,0 +1,377 @@ +/* + * ReactOS kernel + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: timerqueue.c,v 1.1 2004/07/08 00:40:30 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Timer Queue functions + * FILE: lib/kernel32/misc/timerqueue.c + * PROGRAMER: Thomas Weidenmueller + */ + +/* INCLUDES ******************************************************************/ + +#include + +#define NDEBUG +#include "../include/debug.h" + + +/* FUNCTIONS *****************************************************************/ + +HANDLE DefaultTimerQueue = NULL; + +/* + * Create the default timer queue for the current process. This function is only + * called if CreateTimerQueueTimer() or SetTimerQueueTimer() is called. + * However, ChangeTimerQueueTimer() fails with ERROR_INVALID_PARAMETER if the + * default timer queue has not been created, because it assumes there has to be + * a timer queue with a timer if it want's to be changed. + */ +static BOOL +IntCreateDefaultTimerQueue(VOID) +{ + NTSTATUS Status; + + /* FIXME - make this thread safe */ + + /* create the timer queue */ + Status = RtlCreateTimerQueue(&DefaultTimerQueue); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + DPRINT1("Unable to create the default timer queue!\n"); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +CancelTimerQueueTimer(HANDLE TimerQueue, + HANDLE Timer) +{ + /* Since this function is not documented in PSDK and apparently does nothing + but delete the timer, we just do the same as DeleteTimerQueueTimer(), without + passing a completion event. */ + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* let's use the process' default timer queue. We assume the default timer + queue has been created with a previous call to CreateTimerQueueTimer() or + SetTimerQueueTimer(), otherwise this call wouldn't make much sense. */ + if(!(TimerQueue = DefaultTimerQueue)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + } + + if(Timer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* delete the timer */ + Status = RtlDeleteTimer(TimerQueue, Timer, NULL); + + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +ChangeTimerQueueTimer(HANDLE TimerQueue, + HANDLE Timer, + ULONG DueTime, + ULONG Period) +{ + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* let's use the process' default timer queue. We assume the default timer + queue has been created with a previous call to CreateTimerQueueTimer() or + SetTimerQueueTimer(), otherwise this call wouldn't make much sense. */ + if(!(TimerQueue = DefaultTimerQueue)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + } + + if(Timer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* update the timer */ + Status = RtlUpdateTimer(TimerQueue, Timer, DueTime, Period); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +HANDLE +STDCALL +CreateTimerQueue(VOID) +{ + HANDLE Handle; + NTSTATUS Status; + + /* create the timer queue */ + Status = RtlCreateTimerQueue(&Handle); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return NULL; + } + + return Handle; +} + +/* + * @implemented + */ +BOOL +STDCALL +CreateTimerQueueTimer(PHANDLE phNewTimer, + HANDLE TimerQueue, + WAITORTIMERCALLBACK Callback, + PVOID Parameter, + DWORD DueTime, + DWORD Period, + ULONG Flags) +{ + NTSTATUS Status; + + /* windows seems not to test this parameter at all, so we'll try to clear it here + so we don't crash somewhere inside ntdll */ + *phNewTimer = NULL; + + if(TimerQueue == NULL) + { + /* the default timer queue is requested, try to create it if it hasn't been already */ + if(!(TimerQueue = DefaultTimerQueue)) + { + if(!IntCreateDefaultTimerQueue()) + { + /* IntCreateDefaultTimerQueue() set the last error code already, just fail */ + return FALSE; + } + TimerQueue = DefaultTimerQueue; + } + } + + /* !!! Win doesn't even check if Callback == NULL, so we don't, too! That'll + raise a nice exception later... */ + + /* create the timer */ + Status = RtlCreateTimer(TimerQueue, phNewTimer, Callback, Parameter, DueTime, + Period, Flags); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +DeleteTimerQueue(HANDLE TimerQueue) +{ + NTSTATUS Status; + + /* We don't allow the user to delete the default timer queue */ + if(TimerQueue == NULL) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + /* delete the timer queue */ + Status = RtlDeleteTimerQueue(TimerQueue); + return NT_SUCCESS(Status); +} + +/* + * @implemented + */ +BOOL +STDCALL +DeleteTimerQueueEx(HANDLE TimerQueue, + HANDLE CompletionEvent) +{ + NTSTATUS Status; + + /* We don't allow the user to delete the default timer queue */ + if(TimerQueue == NULL) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + /* delete the queue */ + Status = RtlDeleteTimerQueueEx(TimerQueue, CompletionEvent); + + if((CompletionEvent != INVALID_HANDLE_VALUE && Status == STATUS_PENDING) || + !NT_SUCCESS(Status)) + { + /* In case CompletionEvent == NULL, RtlDeleteTimerQueueEx() returns before + all callback routines returned. We set the last error code to STATUS_PENDING + and return FALSE. In case CompletionEvent == INVALID_HANDLE_VALUE we only + can get here if another error occured. In case CompletionEvent is something + else, we get here and fail, even though it isn't really an error (if Status == STATUS_PENDING). + We also handle all other failures the same way. */ + + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +DeleteTimerQueueTimer(HANDLE TimerQueue, + HANDLE Timer, + HANDLE CompletionEvent) +{ + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* let's use the process' default timer queue. We assume the default timer + queue has been created with a previous call to CreateTimerQueueTimer() or + SetTimerQueueTimer(), otherwise this call wouldn't make much sense. */ + if(!(TimerQueue = DefaultTimerQueue)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + } + + if(Timer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* delete the timer */ + Status = RtlDeleteTimer(TimerQueue, Timer, CompletionEvent); + + if((CompletionEvent != INVALID_HANDLE_VALUE && Status == STATUS_PENDING) || + !NT_SUCCESS(Status)) + { + /* In case CompletionEvent == NULL, RtlDeleteTimer() returns before + the callback routine returned. We set the last error code to STATUS_PENDING + and return FALSE. In case CompletionEvent == INVALID_HANDLE_VALUE we only + can get here if another error occured. In case CompletionEvent is something + else, we get here and fail, even though it isn't really an error (if Status == STATUS_PENDING). + We also handle all other failures the same way. */ + + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +HANDLE +STDCALL +SetTimerQueueTimer(HANDLE TimerQueue, + WAITORTIMERCALLBACK Callback, + PVOID Parameter, + DWORD DueTime, + DWORD Period, + BOOL PreferIo) +{ + /* Since this function is not documented in PSDK and apparently does nothing + but create a timer, we just do the same as CreateTimerQueueTimer(). Unfortunately + I don't really know what PreferIo is supposed to be, it propably just affects the + Flags parameter of CreateTimerQueueTimer(). Looking at the PSDK documentation of + CreateTimerQueueTimer() there's only one flag (WT_EXECUTEINIOTHREAD) that causes + the callback function queued to an I/O worker thread. I guess it uses this flag + if PreferIo == TRUE, otherwise let's just use WT_EXECUTEDEFAULT. We should + test this though, this is only guess work and I'm too lazy to do further + investigation. */ + + HANDLE Timer; + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* the default timer queue is requested, try to create it if it hasn't been already */ + if(!(TimerQueue = DefaultTimerQueue)) + { + if(!IntCreateDefaultTimerQueue()) + { + /* IntCreateDefaultTimerQueue() set the last error code already, just fail */ + return FALSE; + } + TimerQueue = DefaultTimerQueue; + } + } + + /* create the timer */ + Status = RtlCreateTimer(TimerQueue, &Timer, Callback, Parameter, DueTime, + Period, (PreferIo ? WT_EXECUTEINIOTHREAD : WT_EXECUTEDEFAULT)); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return NULL; + } + + return Timer; +} + +/* EOF */ diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index ab3eb203f25..eabbc65de8a 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.123 2004/07/03 17:13:09 hbirr Exp $ +; $Id: ntdll.def,v 1.124 2004/07/08 00:40:30 weiden Exp $ ; ; ReactOS Operating System ; @@ -354,6 +354,8 @@ RtlCreateProcessParameters@40 RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor@8 ;RtlCreateTagHeap +RtlCreateTimer@28 +RtlCreateTimerQueue@4 RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz@8 RtlCreateUserProcess@40 @@ -377,6 +379,9 @@ RtlDeleteRange@24 RtlDeleteRegistryValue@12 RtlDeleteResource@4 ;RtlDeleteSecurityObject +RtlDeleteTimer@12 +RtlDeleteTimerQueue@4 +RtlDeleteTimerQueueEx@8 RtlDestroyAtomTable@4 RtlDestroyEnvironment@4 RtlDestroyHandleTable@4 @@ -623,6 +628,7 @@ RtlUpcaseUnicodeStringToOemString@12 RtlUpcaseUnicodeToCustomCPN@24 RtlUpcaseUnicodeToMultiByteN@20 RtlUpcaseUnicodeToOemN@20 +RtlUpdateTimer@16 RtlUpperChar@4 RtlUpperString@8 ;RtlUsageHeap diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index a3cb299df88..ebfbc5a1778 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.113 2004/07/03 17:13:09 hbirr Exp $ +; $Id: ntdll.edf,v 1.114 2004/07/08 00:40:30 weiden Exp $ ; ; ReactOS Operating System ; @@ -354,6 +354,8 @@ RtlCreateProcessParameters=RtlCreateProcessParameters@40 RtlCreateRegistryKey=RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor=RtlCreateSecurityDescriptor@8 ;RtlCreateTagHeap +RtlCreateTimer=RtlCreateTimer@28 +RtlCreateTimerQueue=RtlCreateTimerQueue@4 RtlCreateUnicodeString=RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz=RtlCreateUnicodeStringFromAsciiz@8 RtlCreateUserProcess=RtlCreateUserProcess@40 @@ -377,6 +379,9 @@ RtlDeleteRange=RtlDeleteRange@24 RtlDeleteRegistryValue=RtlDeleteRegistryValue@12 RtlDeleteResource=RtlDeleteResource@4 ;RtlDeleteSecurityObject +RtlDeleteTimer=RtlDeleteTimer@12 +RtlDeleteTimerQueue=RtlDeleteTimerQueue@4 +RtlDeleteTimerQueueEx=RtlDeleteTimerQueueEx@8 RtlDestroyAtomTable=RtlDestroyAtomTable@4 RtlDestroyEnvironment=RtlDestroyEnvironment@4 RtlDestroyHandleTable=RtlDestroyHandleTable@4 @@ -625,6 +630,7 @@ RtlUpcaseUnicodeStringToOemString=RtlUpcaseUnicodeStringToOemString@12 RtlUpcaseUnicodeToCustomCPN=RtlUpcaseUnicodeToCustomCPN@24 RtlUpcaseUnicodeToMultiByteN=RtlUpcaseUnicodeToMultiByteN@20 RtlUpcaseUnicodeToOemN=RtlUpcaseUnicodeToOemN@20 +RtlUpdateTimer=RtlUpdateTimer@16 RtlUpperChar=RtlUpperChar@4 RtlUpperString=RtlUpperString@8 ;RtlUsageHeap diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index e8d80ccb614..58585e0afd4 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.105 2004/07/03 17:40:23 navaraf Exp $ +# $Id: makefile,v 1.106 2004/07/08 00:40:31 weiden Exp $ PATH_TO_TOP = ../.. @@ -83,6 +83,7 @@ RTL_OBJECTS = \ rtl/resource.o \ rtl/teb.o \ rtl/thread.o \ + rtl/timerqueue.o \ rtl/libsupp.o STDIO_OBJECTS = \ diff --git a/reactos/lib/ntdll/rtl/timerqueue.c b/reactos/lib/ntdll/rtl/timerqueue.c new file mode 100644 index 00000000000..74875dc8c2b --- /dev/null +++ b/reactos/lib/ntdll/rtl/timerqueue.c @@ -0,0 +1,119 @@ +/* + * ReactOS kernel + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: timerqueue.c,v 1.1 2004/07/08 00:40:31 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Timer Queue implementation + * FILE: lib/ntdll/rtl/timerqueue.c + */ + +/* INCLUDES ****************************************************************/ + +#include + +#define NDEBUG +#include + +typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlCreateTimer(HANDLE TimerQueue, + PHANDLE phNewTimer, + WAITORTIMERCALLBACKFUNC Callback, + PVOID Parameter, + DWORD DueTime, + DWORD Period, + ULONG Flags) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlCreateTimerQueue(PHANDLE TimerQueue) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlDeleteTimer(HANDLE TimerQueue, + HANDLE Timer, + HANDLE CompletionEvent) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlDeleteTimerQueue(HANDLE TimerQueue) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlDeleteTimerQueueEx(HANDLE TimerQueue, + HANDLE CompletionEvent) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlUpdateTimer(HANDLE TimerQueue, + HANDLE Timer, + ULONG DueTime, + ULONG Period) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + +/* EOF */ From 76cd746a0f914b5b179b74c5cfe7baeede75b91e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Jul 2004 00:46:22 +0000 Subject: [PATCH 220/356] Fixed handling of NULL arguments in ChangeDisplaySettings(Ex)(). Patch by blight. svn path=/trunk/; revision=10030 --- reactos/lib/user32/misc/display.c | 36 ++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/reactos/lib/user32/misc/display.c b/reactos/lib/user32/misc/display.c index cbbe12e2b2e..3f40870a22f 100644 --- a/reactos/lib/user32/misc/display.c +++ b/reactos/lib/user32/misc/display.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: display.c,v 1.9 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: display.c,v 1.10 2004/07/08 00:46:22 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/dde.c @@ -241,19 +241,30 @@ ChangeDisplaySettingsExA( { LONG rc; UNICODE_STRING DeviceName; + PUNICODE_STRING pDeviceName = &DeviceName; DEVMODEW DevModeW; + LPDEVMODEW pDevModeW = &DevModeW; - if ( !RtlCreateUnicodeStringFromAsciiz ( &DeviceName, (PCSZ)lpszDeviceName ) ) + if (lpszDeviceName != NULL) { - SetLastError ( ERROR_OUTOFMEMORY ); - return DISP_CHANGE_BADPARAM; /* FIXME what to return? */ + if ( !RtlCreateUnicodeStringFromAsciiz ( pDeviceName, (PCSZ)lpszDeviceName ) ) + { + SetLastError ( ERROR_OUTOFMEMORY ); + return DISP_CHANGE_BADPARAM; /* FIXME what to return? */ + } } + else + pDeviceName = NULL; - RosRtlDevModeA2W ( &DevModeW, lpDevMode ); + if (lpDevMode != NULL) + RosRtlDevModeA2W ( pDevModeW, lpDevMode ); + else + pDevModeW = NULL; - rc = NtUserChangeDisplaySettings ( &DeviceName, &DevModeW, hwnd, dwflags, lParam ); + rc = NtUserChangeDisplaySettings ( pDeviceName, pDevModeW, hwnd, dwflags, lParam ); - RtlFreeUnicodeString ( &DeviceName ); + if (lpszDeviceName != NULL) + RtlFreeUnicodeString ( &DeviceName ); return rc; } @@ -286,12 +297,17 @@ ChangeDisplaySettingsExW( { LONG rc; UNICODE_STRING DeviceName; + PUNICODE_STRING pDeviceName = &DeviceName; - RtlInitUnicodeString ( &DeviceName, lpszDeviceName ); + if (lpszDeviceName != NULL) + RtlInitUnicodeString ( pDeviceName, lpszDeviceName ); + else + pDeviceName = NULL; - rc = NtUserChangeDisplaySettings ( &DeviceName, lpDevMode, hwnd, dwflags, lParam ); + rc = NtUserChangeDisplaySettings ( pDeviceName, lpDevMode, hwnd, dwflags, lParam ); - RtlFreeUnicodeString ( &DeviceName ); + if (lpszDeviceName != NULL) + RtlFreeUnicodeString ( pDeviceName ); return rc; } From aa11660dd0ac8675c24f61048401c9e4b0545c3a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Jul 2004 00:48:12 +0000 Subject: [PATCH 221/356] fixed debug output svn path=/trunk/; revision=10031 --- reactos/lib/ntdll/rtl/timerqueue.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/lib/ntdll/rtl/timerqueue.c b/reactos/lib/ntdll/rtl/timerqueue.c index 74875dc8c2b..91ffc39bfbb 100644 --- a/reactos/lib/ntdll/rtl/timerqueue.c +++ b/reactos/lib/ntdll/rtl/timerqueue.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: timerqueue.c,v 1.1 2004/07/08 00:40:31 weiden Exp $ +/* $Id: timerqueue.c,v 1.2 2004/07/08 00:48:12 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -58,7 +58,7 @@ NTSTATUS STDCALL RtlCreateTimerQueue(PHANDLE TimerQueue) { - DPRINT1("RtlCreateTimer: stub\n"); + DPRINT1("RtlCreateTimerQueue: stub\n"); return STATUS_NOT_IMPLEMENTED; } @@ -72,7 +72,7 @@ RtlDeleteTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent) { - DPRINT1("RtlCreateTimer: stub\n"); + DPRINT1("RtlDeleteTimer: stub\n"); return STATUS_NOT_IMPLEMENTED; } @@ -84,7 +84,7 @@ NTSTATUS STDCALL RtlDeleteTimerQueue(HANDLE TimerQueue) { - DPRINT1("RtlCreateTimer: stub\n"); + DPRINT1("RtlDeleteTimerQueue: stub\n"); return STATUS_NOT_IMPLEMENTED; } @@ -97,7 +97,7 @@ STDCALL RtlDeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent) { - DPRINT1("RtlCreateTimer: stub\n"); + DPRINT1("RtlDeleteTimerQueueEx: stub\n"); return STATUS_NOT_IMPLEMENTED; } @@ -112,7 +112,7 @@ RtlUpdateTimer(HANDLE TimerQueue, ULONG DueTime, ULONG Period) { - DPRINT1("RtlCreateTimer: stub\n"); + DPRINT1("RtlUpdateTimer: stub\n"); return STATUS_NOT_IMPLEMENTED; } From 494edc04e53ca256a7744db220ecaf1f5875ebc6 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Thu, 8 Jul 2004 06:36:04 +0000 Subject: [PATCH 222/356] Fixed for TCPIP Regularized TCPSendData and TCPReceiveData parameters and calling. Added number of bytes IoStatus for TDI_SEND_DATAGRAM and TDI_SEND as specified in the OSR entry for TDI_SEND_DATAGRAM. Fixed IRQL in packet send event. We now use KeRaiseIrql to make sure we're in DISPATCH_LEVEL. Fixed socket state callback for new afd. Now fully based on io completion. svn path=/trunk/; revision=10032 --- reactos/drivers/net/tcpip/include/rawip.h | 3 +- reactos/drivers/net/tcpip/include/tcp.h | 5 +- reactos/drivers/net/tcpip/include/titypes.h | 66 ++--- reactos/drivers/net/tcpip/include/udp.h | 3 +- reactos/drivers/net/tcpip/tcpip/address.c | 20 +- reactos/drivers/net/tcpip/tcpip/dispatch.c | 100 +++++--- reactos/drivers/net/tcpip/tcpip/fileobjs.c | 6 +- reactos/drivers/net/tcpip/tcpip/main.c | 12 +- .../drivers/net/tcpip/transport/rawip/rawip.c | 5 +- .../drivers/net/tcpip/transport/tcp/event.c | 233 +++++++----------- reactos/drivers/net/tcpip/transport/tcp/tcp.c | 108 ++++++-- reactos/drivers/net/tcpip/transport/udp/udp.c | 9 +- 12 files changed, 304 insertions(+), 266 deletions(-) diff --git a/reactos/drivers/net/tcpip/include/rawip.h b/reactos/drivers/net/tcpip/include/rawip.h index fbd0961d9fa..c3599a5b7fd 100644 --- a/reactos/drivers/net/tcpip/include/rawip.h +++ b/reactos/drivers/net/tcpip/include/rawip.h @@ -11,7 +11,8 @@ NTSTATUS RawIPSendDatagram( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize); + ULONG DataSize, + PULONG DataUsed); VOID RawIPReceive( PNET_TABLE_ENTRY NTE, diff --git a/reactos/drivers/net/tcpip/include/tcp.h b/reactos/drivers/net/tcpip/include/tcp.h index c71391ba8ae..d3f876926b8 100644 --- a/reactos/drivers/net/tcpip/include/tcp.h +++ b/reactos/drivers/net/tcpip/include/tcp.h @@ -104,9 +104,10 @@ NTSTATUS TCPReceiveData( NTSTATUS TCPSendData( PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize); + ULONG DataSize, + ULONG Flags, + PULONG DataUsed); NTSTATUS TCPStartup( VOID); diff --git a/reactos/drivers/net/tcpip/include/titypes.h b/reactos/drivers/net/tcpip/include/titypes.h index 46955a231a9..ced8385c559 100644 --- a/reactos/drivers/net/tcpip/include/titypes.h +++ b/reactos/drivers/net/tcpip/include/titypes.h @@ -100,7 +100,8 @@ typedef NTSTATUS (*DATAGRAM_SEND_ROUTINE)( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize); + ULONG DataSize, + PULONG DataUsed); /* Datagram completion handler prototype */ typedef VOID (*DATAGRAM_COMPLETION_ROUTINE)( @@ -295,54 +296,31 @@ typedef struct _TCP_SEGMENT { ULONG BytesDelivered; /* Number of bytes already delivered to the client */ } TCP_SEGMENT, *PTCP_SEGMENT; +typedef struct _TDI_BUCKET { + LIST_ENTRY Entry; + TDI_REQUEST Request; +} TDI_BUCKET, *PTDI_BUCKET; /* Transport connection context structure A.K.A. Transmission Control Block (TCB) in TCP terminology. The FileObject->FsContext2 field holds a pointer to this structure */ typedef struct _CONNECTION_ENDPOINT { - LIST_ENTRY ListEntry; /* Entry on list */ - KSPIN_LOCK Lock; /* Spin lock to protect this structure */ - ULONG RefCount; /* Number of references to this object */ - PVOID ClientContext; /* Pointer to client context information */ - PADDRESS_FILE AddressFile; /* Associated address file object (NULL if none) */ - PVOID SocketContext; /* Context for lower layer */ - -#if 0 - PIP_ADDRESS LocalAddress; /* Pointer to local IP address */ - USHORT LocalPort; /* Local port number (network byte order) */ - - PIP_ADDRESS RemoteAddress; /* Pointer to remote IP address */ - USHORT RemotePort; /* Remote port number (network byte order) */ - - CONNECTION_STATE State; /* Connection state */ - /* Send sequence variables */ - ULONG SendUnacknowledged; /* Highest sequence number that is acknowledged */ - ULONG SendNext; /* Sequence number of last data block sent */ - ULONG SendWindow; /* Maximum allowed number of octets in a segment */ - ULONG SendUrgentPointer; /* Sequence number of start of urgent data */ - ULONG SendWL1; /* Sequence number used for last window update */ - ULONG SendWL2; /* Acknowledgment number used for last window update */ - ULONG SendISS; /* Initial send sequence number */ - - /* Receive sequence variables */ - ULONG ReceiveNext; /* Next sequence number expected and start of receive window */ - ULONG ReceiveWindow; /* Maximum allowed number of octets in a segment */ - ULONG ReceiveUrgentPointer; /* Sequence number of start of urgent data */ - ULONG ReceiveIRS; /* Initial receive sequence number */ - ULONG ReceiveDelivered; /* Next sequence number to be delivered to the client */ - - /* Statistics for computing the retransmission timeout */ - ULONG TimestampSend; /* Timestamp when sending a segment */ - ULONG TimestampAck; /* Timestamp when receiving acknowledgment */ -#endif - - /* Requests */ - PTDI_REQUEST ListenRequest; /* Queued listen request */ - LIST_ENTRY ReceiveRequests; /* Queued receive requests */ - - /* Queues */ - LIST_ENTRY ReceivedSegments;/* Segments that are received */ - + LIST_ENTRY ListEntry; /* Entry on list */ + KSPIN_LOCK Lock; /* Spin lock to protect this structure */ + ULONG RefCount; /* Number of references to this object */ + PVOID ClientContext; /* Pointer to client context information */ + PADDRESS_FILE AddressFile; /* Associated address file object (NULL if none) */ + PVOID SocketContext; /* Context for lower layer */ + + UINT State; /* Socket state W.R.T. oskit */ + + /* Requests */ + LIST_ENTRY ConnectRequest; /* Queued connect rqueusts */ + LIST_ENTRY ListenRequest; /* Queued listen requests */ + LIST_ENTRY ReceiveRequest; /* Queued receive requests */ + + /* Queues */ + LIST_ENTRY ReceivedSegments;/* Segments that are received */ } CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT; diff --git a/reactos/drivers/net/tcpip/include/udp.h b/reactos/drivers/net/tcpip/include/udp.h index 02464046c3a..532324f6013 100644 --- a/reactos/drivers/net/tcpip/include/udp.h +++ b/reactos/drivers/net/tcpip/include/udp.h @@ -42,7 +42,8 @@ NTSTATUS UDPSendDatagram( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize); + ULONG DataSize, + PULONG DataUsed); NTSTATUS UDPReceiveDatagram( PTDI_REQUEST Request, diff --git a/reactos/drivers/net/tcpip/tcpip/address.c b/reactos/drivers/net/tcpip/tcpip/address.c index 3443675e974..cafb98f13e4 100644 --- a/reactos/drivers/net/tcpip/tcpip/address.c +++ b/reactos/drivers/net/tcpip/tcpip/address.c @@ -210,11 +210,22 @@ NTSTATUS AddrBuildAddress( PTDI_ADDRESS_IP ValidAddr; PIP_ADDRESS IPAddress; - if (TdiAddress->AddressType != TDI_ADDRESS_TYPE_IP) - return STATUS_INVALID_ADDRESS; + TI_DbgPrint(MID_TRACE,("Address in:\n")); + OskitDumpBuffer( TdiAddress, sizeof(*TdiAddress) ); - if (TdiAddress->AddressLength != TDI_ADDRESS_LENGTH_IP) + if (TdiAddress->AddressType != TDI_ADDRESS_TYPE_IP) { + TI_DbgPrint + (MID_TRACE,("AddressType %x, Not valid\n", + TdiAddress->AddressType)); return STATUS_INVALID_ADDRESS; + } + if (TdiAddress->AddressLength < TDI_ADDRESS_LENGTH_IP) { + TI_DbgPrint + (MID_TRACE,("AddressLength %x, Not valid (expected %x)\n", + TdiAddress->AddressLength, TDI_ADDRESS_LENGTH_IP)); + return STATUS_INVALID_ADDRESS; + } + ValidAddr = (PTDI_ADDRESS_IP)TdiAddress->Address; @@ -226,6 +237,9 @@ NTSTATUS AddrBuildAddress( *Address = IPAddress; *Port = ValidAddr->sin_port; + TI_DbgPrint(MID_TRACE,("Address out:\n")); + OskitDumpBuffer( IPAddress, sizeof(*IPAddress) ); + return STATUS_SUCCESS; } diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index fe1ec1e7fa5..7473e0c01fa 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -187,9 +187,10 @@ VOID DispDataRequestComplete( PTRANSPORT_CONTEXT TranContext; KIRQL OldIrql; - TI_DbgPrint(DEBUG_IRP, ("Called.\n")); + TI_DbgPrint(DEBUG_IRP, ("Called for irp %x (%x, %d).\n", + Context, Status, Count)); - Irp = (PIRP)Context; + Irp = Context; IrpSp = IoGetCurrentIrpStackLocation(Irp); TranContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext; @@ -218,6 +219,10 @@ VOID DispDataRequestComplete( Irp->IoStatus.Status = Status; Irp->IoStatus.Information = Count; + TI_DbgPrint(MID_TRACE, ("Irp->IoStatus.Status = %x\n", + Irp->IoStatus.Status)); + TI_DbgPrint(MID_TRACE, ("Irp->IoStatus.Information = %d\n", + Irp->IoStatus.Information)); TI_DbgPrint(DEBUG_IRP, ("Completing IRP at (0x%X).\n", Irp)); IRPFinish(Irp, STATUS_SUCCESS); @@ -687,6 +692,7 @@ NTSTATUS DispTdiReceive( IrpSp->FileObject->FsContext, Irp, (PDRIVER_CANCEL)DispCancelRequest); + TI_DbgPrint(MID_TRACE,("TCPIP<<< Got an MDL: %x\n", Irp->MdlAddress)); if (NT_SUCCESS(Status)) { Status = TCPReceiveData( @@ -786,46 +792,63 @@ NTSTATUS DispTdiSend( * Status of operation */ { - PIO_STACK_LOCATION IrpSp; - TDI_REQUEST Request; - PTDI_REQUEST_KERNEL_SEND SendInfo; - PTRANSPORT_CONTEXT TranContext; - NTSTATUS Status; + PIO_STACK_LOCATION IrpSp; + PTDI_REQUEST_KERNEL_RECEIVE ReceiveInfo; + PTRANSPORT_CONTEXT TranContext; + TDI_REQUEST Request; + NTSTATUS Status; + ULONG BytesReceived; - TI_DbgPrint(DEBUG_IRP, ("Called.\n")); + TI_DbgPrint(DEBUG_IRP, ("Called.\n")); - IrpSp = IoGetCurrentIrpStackLocation(Irp); - SendInfo = (PTDI_REQUEST_KERNEL_SEND)&(IrpSp->Parameters); - TranContext = IrpSp->FileObject->FsContext; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + ReceiveInfo = (PTDI_REQUEST_KERNEL_RECEIVE)&(IrpSp->Parameters); - /* Initialize a send request */ - Request.Handle.AddressHandle = TranContext->Handle.AddressHandle; - Request.RequestNotifyObject = DispDataRequestComplete; - Request.RequestContext = Irp; - - Status = DispPrepareIrpForCancel( - IrpSp->FileObject->FsContext, - Irp, - (PDRIVER_CANCEL)DispCancelRequest); - if (NT_SUCCESS(Status)) { - - /* FIXME: DgramInfo->SendDatagramInformation->RemoteAddress - must be of type PTDI_ADDRESS_IP */ - - Status = (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send)( - &Request, NULL, - (PNDIS_BUFFER)Irp->MdlAddress, SendInfo->SendLength); - if (Status != STATUS_PENDING) { - DispDataRequestComplete(Irp, Status, 0); - /* Return STATUS_PENDING because DispPrepareIrpForCancel - marks Irp as pending */ - Status = STATUS_PENDING; - } + TranContext = IrpSp->FileObject->FsContext; + if (TranContext == NULL) + { + TI_DbgPrint(MID_TRACE, ("Bad transport context.\n")); + return STATUS_INVALID_CONNECTION; } - TI_DbgPrint(DEBUG_IRP, ("Leaving.\n")); + if (TranContext->Handle.ConnectionContext == NULL) + { + TI_DbgPrint(MID_TRACE, ("No connection endpoint file object.\n")); + return STATUS_INVALID_CONNECTION; + } - return Status; + /* Initialize a receive request */ + Request.Handle.ConnectionContext = TranContext->Handle.ConnectionContext; + Request.RequestNotifyObject = DispDataRequestComplete; + Request.RequestContext = Irp; + Status = DispPrepareIrpForCancel( + IrpSp->FileObject->FsContext, + Irp, + (PDRIVER_CANCEL)DispCancelRequest); + TI_DbgPrint(MID_TRACE,("TCPIP<<< Got an MDL: %x\n", Irp->MdlAddress)); + if (NT_SUCCESS(Status)) + { + TI_DbgPrint(MID_TRACE,("About to TCPSendData\n")); + Status = TCPSendData( + &Request, + (PNDIS_BUFFER)Irp->MdlAddress, + ReceiveInfo->ReceiveLength, + ReceiveInfo->ReceiveFlags, + &BytesReceived); + if (Status != STATUS_PENDING) + { + DispDataRequestComplete(Irp, Status, BytesReceived); + } + } + + if (Status != STATUS_PENDING) + { + IrpSp->Control &= ~SL_PENDING_RETURNED; + } + + TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status)); + + return Status; } @@ -867,9 +890,10 @@ NTSTATUS DispTdiSendDatagram( Status = (*((PADDRESS_FILE)Request.Handle.AddressHandle)->Send)( &Request, DgramInfo->SendDatagramInformation, - (PNDIS_BUFFER)Irp->MdlAddress, DgramInfo->SendLength); + (PNDIS_BUFFER)Irp->MdlAddress, DgramInfo->SendLength, + &Irp->IoStatus.Information); if (Status != STATUS_PENDING) { - DispDataRequestComplete(Irp, Status, 0); + DispDataRequestComplete(Irp, Status, Irp->IoStatus.Information); /* Return STATUS_PENDING because DispPrepareIrpForCancel marks Irp as pending */ Status = STATUS_PENDING; diff --git a/reactos/drivers/net/tcpip/tcpip/fileobjs.c b/reactos/drivers/net/tcpip/tcpip/fileobjs.c index a482a62152f..0386d5823ab 100644 --- a/reactos/drivers/net/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/net/tcpip/tcpip/fileobjs.c @@ -456,6 +456,9 @@ NTSTATUS FileOpenConnection( /* Initialize spin lock that protects the connection endpoint file object */ KeInitializeSpinLock(&Connection->Lock); + InitializeListHead(&Connection->ConnectRequest); + InitializeListHead(&Connection->ListenRequest); + InitializeListHead(&Connection->ReceiveRequest); /* Reference the object */ Connection->RefCount = 1; @@ -469,9 +472,6 @@ NTSTATUS FileOpenConnection( IPPROTO_TCP ); DbgPrint("STATUS from OSKITTCP was %08x\n", Status); - /* Initialize receive requests queue */ - InitializeListHead(&Connection->ReceiveRequests); - /* Initialize received segments queue */ InitializeListHead(&Connection->ReceivedSegments); diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 3e906921d45..e7d4ee3f5de 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -213,7 +213,14 @@ CP (Address->TAAddressCount != 1) || (Address->Address[0].AddressLength < TDI_ADDRESS_LENGTH_IP) || (Address->Address[0].AddressType != TDI_ADDRESS_TYPE_IP)) { - TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n")); + TI_DbgPrint(MIN_TRACE, ("Parameters are invalid:\n")); + TI_DbgPrint(MIN_TRACE, ("AddressCount: %d\n", Address->TAAddressCount)); + if( Address->TAAddressCount == 1 ) { + TI_DbgPrint(MIN_TRACE, ("AddressLength: %\n", + Address->Address[0].AddressLength)); + TI_DbgPrint(MIN_TRACE, ("AddressType: %\n", + Address->Address[0].AddressType)); + } ExFreePool(Context); return STATUS_INVALID_PARAMETER; } @@ -578,11 +585,12 @@ TiDispatch( NTSTATUS Status; PIO_STACK_LOCATION IrpSp; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + TI_DbgPrint(DEBUG_IRP, ("Called. IRP is at (0x%X).\n", Irp)); Irp->IoStatus.Information = 0; - IrpSp = IoGetCurrentIrpStackLocation(Irp); #ifdef _MSC_VER Status = TdiMapUserRequest(DeviceObject, Irp, IrpSp); if (NT_SUCCESS(Status)) { diff --git a/reactos/drivers/net/tcpip/transport/rawip/rawip.c b/reactos/drivers/net/tcpip/transport/rawip/rawip.c index cdb75f61f96..d3e23afabb5 100644 --- a/reactos/drivers/net/tcpip/transport/rawip/rawip.c +++ b/reactos/drivers/net/tcpip/transport/rawip/rawip.c @@ -84,7 +84,8 @@ NTSTATUS RawIPSendDatagram( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize) + ULONG DataSize, + PULONG DataUsed ) /* * FUNCTION: Sends a raw IP datagram to a remote address * ARGUMENTS: @@ -110,6 +111,8 @@ NTSTATUS RawIPSendDatagram( TI_DbgPrint(MID_TRACE,("Packet.NdisPacket %x\n", Packet.NdisPacket)); + *DataUsed = BufferLen; + if( Status == NDIS_STATUS_SUCCESS ) Status = BuildRawIPPacket( &Packet, BufferLen, diff --git a/reactos/drivers/net/tcpip/transport/tcp/event.c b/reactos/drivers/net/tcpip/transport/tcp/event.c index 4f74debad59..a8ca6ff7c3f 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/event.c +++ b/reactos/drivers/net/tcpip/transport/tcp/event.c @@ -23,150 +23,93 @@ extern ULONG TCP_IPIdentification; -void TCPRecvNotify( PCONNECTION_ENDPOINT Connection, UINT Flags ) { - int error = 0; - NTSTATUS Status = 0; - CHAR DataBuffer[1024]; - UINT BytesRead = 0, BytesTaken = 0; - PTDI_IND_RECEIVE ReceiveHandler; - PTDI_IND_DISCONNECT DisconnectHandler; - PVOID HandlerContext; - SOCKADDR Addr; +typedef VOID +(*PTCP_COMPLETION_ROUTINE)( PVOID Context, NTSTATUS Status, ULONG Count ); - TI_DbgPrint(MID_TRACE,("XX> Called\n")); - - do { - error = OskitTCPRecv( Connection->SocketContext, - &Addr, - DataBuffer, - 1024, - &BytesRead, - Flags | OSK_MSG_DONTWAIT | OSK_MSG_PEEK ); +int TCPSocketState(void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_UINT NewState ) { + PCONNECTION_ENDPOINT Connection = WhichConnection; + PTCP_COMPLETION_ROUTINE Complete; + PTDI_BUCKET Bucket; + PLIST_ENTRY Entry; - switch( error ) { - case 0: - ReceiveHandler = Connection->AddressFile->ReceiveHandler; - HandlerContext = Connection->AddressFile->ReceiveHandlerContext; - - TI_DbgPrint(MID_TRACE,("Received %d bytes\n", BytesRead)); - - if( Connection->AddressFile->RegisteredReceiveHandler ) - Status = ReceiveHandler( HandlerContext, - NULL, - TDI_RECEIVE_NORMAL, - BytesRead, - BytesRead, - &BytesTaken, - DataBuffer, - NULL ); - else - Status = STATUS_UNSUCCESSFUL; - - if( Status == STATUS_SUCCESS ) { - OskitTCPRecv( Connection->SocketContext, - &Addr, - DataBuffer, - BytesTaken, - &BytesRead, - Flags | OSK_MSG_DONTWAIT ); - } - break; + TI_DbgPrint(MID_TRACE,("Called: NewState %x\n", NewState)); - case OSK_ESHUTDOWN: - case OSK_ECONNRESET: - DisconnectHandler = Connection->AddressFile->DisconnectHandler; - HandlerContext = Connection->AddressFile->DisconnectHandlerContext; - - if( Connection->AddressFile->RegisteredDisconnectHandler ) - Status = DisconnectHandler( HandlerContext, - NULL, - 0, - NULL, - 0, - NULL, - (error == OSK_ESHUTDOWN) ? - TDI_DISCONNECT_RELEASE : - TDI_DISCONNECT_ABORT ); - else - Status = STATUS_UNSUCCESSFUL; - break; - - default: - assert( 0 ); - break; - } - } while( error == 0 && BytesRead > 0 && BytesTaken > 0 ); - - TI_DbgPrint(MID_TRACE,("XX> Leaving\n")); -} - -void TCPCloseNotify( PCONNECTION_ENDPOINT Connection ) { - NTSTATUS Status; - PTDI_IND_DISCONNECT DisconnectHandler; - PVOID HandlerContext; - - DisconnectHandler = Connection->AddressFile->DisconnectHandler; - HandlerContext = Connection->AddressFile->DisconnectHandlerContext; - - /* XXX Distinguish TDI_DISCONNECT_RELEASE from TDI_DISCONNECT_ABORT */ - if( Connection->AddressFile->RegisteredDisconnectHandler ) - Status = DisconnectHandler( HandlerContext, - NULL, - 0, - NULL, - 0, - NULL, - TDI_DISCONNECT_ABORT ); - else - Status = STATUS_UNSUCCESSFUL; - - return Status; -} - -char *FlagNames[] = { "SEL_CONNECT", - "SEL_FIN", - "SEL_ACCEPT", - "SEL_OOB", - "SEL_READ", - "SEL_WRITE", - 0 }; -int FlagValues[] = { SEL_CONNECT, - SEL_FIN, - SEL_ACCEPT, - SEL_OOB, - SEL_READ, - SEL_WRITE, - 0 }; - -void TCPSocketState( void *ClientData, - void *WhichSocket, - void *WhichConnection, - OSK_UINT Flags, - OSK_UINT SocketState ) { - int i; - PCONNECTION_ENDPOINT Connection = - (PCONNECTION_ENDPOINT)WhichConnection; - - TI_DbgPrint(MID_TRACE,("TCPSocketState: (socket %x) %x %x\n", - WhichSocket, Flags, SocketState)); - - for( i = 0; FlagValues[i]; i++ ) { - if( Flags & FlagValues[i] ) - TI_DbgPrint(MID_TRACE,("Flag %s\n", FlagNames[i])); + if( !Connection ) { + TI_DbgPrint(MID_TRACE,("Socket closing.\n")); + return 0; } - if( Flags & SEL_CONNECT ) - /* TCPConnectNotify( Connection ); */ ; - if( Flags & SEL_FIN ) - TCPCloseNotify( Connection ); - if( Flags & SEL_ACCEPT ) - /* TCPAcceptNotify( Connection ); */ ; - if( Flags & SEL_OOB ) - TCPRecvNotify( Connection, MSG_OOB ); - if( Flags & SEL_WRITE ) - /* TCPSendNotify( Connection ); */ ; - if( Flags & SEL_READ ) - TCPRecvNotify( Connection, 0 ); + if( (NewState & SEL_CONNECT) && + !(Connection->State & SEL_CONNECT) ) { + while( !IsListEmpty( &Connection->ConnectRequest ) ) { + Connection->State |= SEL_CONNECT; + Entry = RemoveHeadList( &Connection->ConnectRequest ); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; + TI_DbgPrint(MID_TRACE, + ("Completing Connect Request %x\n", Bucket->Request)); + Complete( Bucket->Request.RequestContext, STATUS_SUCCESS, 0 ); + /* Frees the bucket allocated in TCPConnect */ + ExFreePool( Bucket ); + } + } else if( NewState & SEL_READ ) { + while( !IsListEmpty( &Connection->ReceiveRequest ) ) { + PIRP Irp; + OSK_UINT RecvLen = 0, Received = 0; + OSK_PCHAR RecvBuffer = 0; + PMDL Mdl; + NTSTATUS Status; + + Entry = RemoveHeadList( &Connection->ReceiveRequest ); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; + + TI_DbgPrint(MID_TRACE, + ("Readable, Completing read request %x\n", + Bucket->Request)); + + Irp = Bucket->Request.RequestContext; + Mdl = Irp->MdlAddress; + + TI_DbgPrint(MID_TRACE, + ("Getting the user buffer from %x\n", Mdl)); + + NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen ); + + TI_DbgPrint(MID_TRACE, + ("Reading %d bytes to %x\n", RecvLen, RecvBuffer)); + + Status = TCPTranslateError + ( OskitTCPRecv( Connection->SocketContext, + RecvBuffer, + RecvLen, + &Received, + 0 ) ); + + TI_DbgPrint(MID_TRACE,("TCP Bytes: %d\n", Received)); + + if( Status == STATUS_SUCCESS && Received != 0 ) { + TI_DbgPrint(MID_TRACE,("Received %d bytes with status %x\n", + Received, Status)); + + TI_DbgPrint(MID_TRACE, + ("Completing Receive Request: %x\n", + Bucket->Request)); + + Complete( Bucket->Request.RequestContext, + STATUS_SUCCESS, + Received ); + } else { + InsertHeadList( &Connection->ReceiveRequest, + &Bucket->Entry ); + } + } + } + + return 0; } void TCPPacketSendComplete( PVOID Context, @@ -294,6 +237,12 @@ int TCPPacketSend(void *ClientData, &RemoteAddress.Address.IPv4Address, &RemotePort ); + DbgPrint("OSKIT SENDING PACKET *** %x:%d -> %x:%d\n", + LocalAddress.Address.IPv4Address, + LocalPort, + RemoteAddress.Address.IPv4Address, + RemotePort); + NCE = RouterGetRoute( &RemoteAddress, NULL ); if( !NCE ) return OSK_EADDRNOTAVAIL; @@ -302,8 +251,7 @@ int TCPPacketSend(void *ClientData, ADE_UNICAST, &LocalAddress.Address.IPv4Address ); - if( Connection ) - KeAcquireSpinLock( &Connection->Lock, &OldIrql ); + KeRaiseIrql( DISPATCH_LEVEL, &OldIrql ); NdisStatus = AllocatePacketWithBuffer( &SendRequest->PacketToSend, data, len ); @@ -333,8 +281,7 @@ int TCPPacketSend(void *ClientData, DbgPrint("Transmit called without connection.\n"); end: - if( Connection ) - KeReleaseSpinLock( &Connection->Lock, OldIrql ); + KeLowerIrql( OldIrql ); if( !NT_SUCCESS(NdisStatus) ) return OSK_EINVAL; else return 0; diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index da778a0641a..71745bfef3e 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -52,11 +52,10 @@ VOID TCPReceive(PNET_TABLE_ENTRY NTE, PIP_PACKET IPPacket) } /* event.c */ -void TCPSocketState( void *ClientData, - void *WhichSocket, - void *WhichConnection, - OSK_UINT SelFlags, - OSK_UINT SocketState ); +int TCPSocketState( void *ClientData, + void *WhichSocket, + void *WhichConnection, + OSK_UINT NewState ); int TCPPacketSend( void *ClientData, void *WhichSocket, @@ -67,7 +66,7 @@ int TCPPacketSend( void *ClientData, OSKITTCP_EVENT_HANDLERS EventHandlers = { NULL, /* Client Data */ TCPSocketState, /* SocketState */ - TCPPacketSend, /* PacketSend */ + TCPPacketSend, /* PacketSend */ }; NTSTATUS TCPStartup(VOID) @@ -129,6 +128,8 @@ NTSTATUS TCPTranslateError( int OskitError ) { case OSK_EAFNOSUPPORT: Status = STATUS_INVALID_CONNECTION; break; case OSK_ECONNREFUSED: case OSK_ECONNRESET: Status = STATUS_REMOTE_NOT_LISTENING; break; + case OSK_EINPROGRESS: + case OSK_EAGAIN: Status = STATUS_PENDING; break; default: Status = STATUS_INVALID_CONNECTION; break; } @@ -143,20 +144,30 @@ NTSTATUS TCPConnect KIRQL OldIrql; NTSTATUS Status; SOCKADDR_IN AddressToConnect; - PCONNECTION_ENDPOINT Connection; - - Connection = Request->Handle.ConnectionContext; - - KeAcquireSpinLock(&Connection->Lock, &OldIrql); - + PCONNECTION_ENDPOINT Connection = Request->Handle.ConnectionContext; PIP_ADDRESS RemoteAddress; USHORT RemotePort; + PTDI_BUCKET Bucket; - Status = AddrBuildAddress( - (PTA_ADDRESS)(&((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress)-> - Address[0]), - &RemoteAddress, - &RemotePort); + DbgPrint("TCPConnect: Called\n"); + + Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) ); + if( !Bucket ) return STATUS_NO_MEMORY; + + KeAcquireSpinLock(&Connection->Lock, &OldIrql); + + /* Freed in TCPSocketState */ + Bucket->Request = *Request; + InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry ); + + Status = AddrBuildAddress + ((PTA_ADDRESS)ConnInfo->RemoteAddress, + &RemoteAddress, + &RemotePort); + + DbgPrint("Connecting to address %x:%x\n", + RemoteAddress->Address.IPv4Address, + RemotePort); if (!NT_SUCCESS(Status)) { TI_DbgPrint(MID_TRACE, ("Could not AddrBuildAddress in TCPConnect\n")); @@ -171,11 +182,16 @@ NTSTATUS TCPConnect sizeof(AddressToConnect.sin_addr) ); AddressToConnect.sin_port = RemotePort; KeReleaseSpinLock(&Connection->Lock, OldIrql); + + Status = OskitTCPConnect(Connection->SocketContext, + Connection, + &AddressToConnect, + sizeof(AddressToConnect)); - return TCPTranslateError( OskitTCPConnect(Connection->SocketContext, - Connection, - &AddressToConnect, - sizeof(AddressToConnect)) ); + if( Status == OSK_EINPROGRESS || Status == STATUS_SUCCESS ) + return STATUS_PENDING; + else + return Status; } NTSTATUS TCPClose @@ -209,38 +225,76 @@ NTSTATUS TCPReceiveData ULONG ReceiveLength, ULONG ReceiveFlags, PULONG BytesReceived ) { + KIRQL OldIrql; PCONNECTION_ENDPOINT Connection; PCHAR DataBuffer; UINT DataLen, Received = 0; + NTSTATUS Status; + PTDI_BUCKET Bucket; Connection = Request->Handle.ConnectionContext; + KeAcquireSpinLock(&Connection->Lock, &OldIrql); + NdisQueryBuffer( Buffer, &DataBuffer, &DataLen ); - return TCPTranslateError + TI_DbgPrint(MID_TRACE,("TCP>|< Got an MDL %x (%x:%d)\n", Buffer, DataBuffer, DataLen)); + + Status = TCPTranslateError ( OskitTCPRecv ( Connection->SocketContext, DataBuffer, DataLen, &Received, ReceiveFlags ) ); + + /* Keep this request around ... there was no data yet */ + if( Status == STATUS_PENDING || Received == 0 ) { + /* Freed in TCPSocketState */ + Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) ); + if( !Bucket ) return STATUS_NO_MEMORY; + + Bucket->Request = *Request; + InsertHeadList( &Connection->ReceiveRequest, &Bucket->Entry ); + Status = STATUS_PENDING; + } + + KeReleaseSpinLock(&Connection->Lock, OldIrql); + + TI_DbgPrint(MID_TRACE,("Status %x\n", Status)); + + return Status; } NTSTATUS TCPSendData ( PTDI_REQUEST Request, - PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize ) { + ULONG DataSize, + ULONG Flags, + PULONG DataUsed ) { + KIRQL OldIrql; + NTSTATUS Status; PCONNECTION_ENDPOINT Connection; PCHAR BufferData; ULONG PacketSize; int error; + Connection = Request->Handle.ConnectionContext; + + KeAcquireSpinLock(&Connection->Lock, &OldIrql); + NdisQueryBuffer( Buffer, &BufferData, &PacketSize ); - Connection = Request->Handle.ConnectionContext; - return OskitTCPSend( Connection->SocketContext, - BufferData, PacketSize, 0 ); + TI_DbgPrint(MID_TRACE,("Connection = %x\n", Connection)); + TI_DbgPrint(MID_TRACE,("Connection->SocketContext = %x\n", + Connection->SocketContext)); + + Status = OskitTCPSend( Connection->SocketContext, + BufferData, PacketSize, (OSK_UINT *)DataUsed, 0 ); + + KeReleaseSpinLock(&Connection->Lock, OldIrql); + + return Status; } NTSTATUS TCPTimeout(VOID) { diff --git a/reactos/drivers/net/tcpip/transport/udp/udp.c b/reactos/drivers/net/tcpip/transport/udp/udp.c index 768d02f0109..5415aa32f24 100644 --- a/reactos/drivers/net/tcpip/transport/udp/udp.c +++ b/reactos/drivers/net/tcpip/transport/udp/udp.c @@ -168,7 +168,8 @@ NTSTATUS UDPSendDatagram( PTDI_REQUEST Request, PTDI_CONNECTION_INFORMATION ConnInfo, PNDIS_BUFFER Buffer, - ULONG DataSize) + ULONG DataSize, + PULONG DataUsed ) /* * FUNCTION: Sends an UDP datagram to a remote address * ARGUMENTS: @@ -183,6 +184,12 @@ NTSTATUS UDPSendDatagram( PDATAGRAM_SEND_REQUEST SendRequest; PADDRESS_FILE AddrFile = (PADDRESS_FILE)Request->Handle.AddressHandle; + PCHAR BufferData; + UINT BufferLen; + + NdisQueryBuffer( Buffer, &BufferData, &BufferLen ); + + *DataUsed = BufferLen; BuildUDPPacket( SendRequest, (PIP_ADDRESS)&AddrFile->ADE->Address->Address. From aa565ab06283d6b3c5088383ea9e4ab0df9a6b97 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Thu, 8 Jul 2004 06:39:30 +0000 Subject: [PATCH 223/356] Fixed OskitTCPSend prototype. sleep: removed blocking. not needed anymore. Made socket non-blocking with respect to oskit. removed unneeded panic in sbflush. removed unneeded stats keeping. This info is better kept by tcpip.sys svn path=/trunk/; revision=10033 --- .../drivers/lib/oskittcp/include/oskittcp.h | 11 +++++-- .../drivers/lib/oskittcp/oskittcp/interface.c | 33 ++++++------------- reactos/drivers/lib/oskittcp/oskittcp/sleep.c | 20 ++++++----- .../drivers/lib/oskittcp/oskittcp/tcp_input.c | 16 +++++---- .../lib/oskittcp/oskittcp/tcp_usrreq.c | 2 -- .../lib/oskittcp/oskittcp/uipc_socket.c | 4 ++- .../lib/oskittcp/oskittcp/uipc_socket2.c | 2 ++ 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/reactos/drivers/lib/oskittcp/include/oskittcp.h b/reactos/drivers/lib/oskittcp/include/oskittcp.h index ee4f7ea151a..3d07a09cc23 100644 --- a/reactos/drivers/lib/oskittcp/include/oskittcp.h +++ b/reactos/drivers/lib/oskittcp/include/oskittcp.h @@ -50,12 +50,12 @@ struct connect_args { #define SEL_ERROR 256 #define SEL_FINOUT 512 -typedef void (*OSKITTCP_SOCKET_STATE) +typedef int (*OSKITTCP_SOCKET_STATE) ( void *ClientData, void *WhichSocket, void *WhichConnection, - OSK_UINT SelFlags, - OSK_UINT SocketState ); + OSK_UINT NewState ); + typedef int (*OSKITTCP_SEND_PACKET) ( void *ClientData, void *WhichSocket, @@ -86,6 +86,11 @@ extern int OskitTCPReceive( void *socket, OSK_UINT Len, OSK_UINT *OutLen, OSK_UINT Flags ); +extern int OskitTCPSend( void *socket, + OSK_PCHAR Data, + OSK_UINT Len, + OSK_UINT *OutLen, + OSK_UINT Flags ); #undef errno #define malloc(x,...) fbsd_malloc(x,__FILE__,__LINE__) diff --git a/reactos/drivers/lib/oskittcp/oskittcp/interface.c b/reactos/drivers/lib/oskittcp/oskittcp/interface.c index 3d7ee049a45..b4fc0baea62 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/interface.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/interface.c @@ -1,3 +1,4 @@ + #include #include #include @@ -79,13 +80,13 @@ int OskitTCPSocket( void *context, int error = socreate(domain, &so, type, proto); if( !error ) { so->so_connection = context; + so->so_state = SS_NBIO; *aso = so; } return error; } int OskitTCPRecv( void *connection, - void *Addr, OSK_PCHAR Data, OSK_UINT Len, OSK_UINT *OutLen, @@ -118,9 +119,6 @@ int OskitTCPRecv( void *connection, OskitDumpBuffer( m.m_data, uio.uio_resid ); } - if( paddr ) - memcpy( Addr, paddr, min(sizeof(struct sockaddr),paddr->m_len) ); - *OutLen = uio.uio_resid; return error; } @@ -186,22 +184,6 @@ NTSTATUS OskitTCPConnect( PVOID socket, PVOID connection, goto done; } - s = splnet(); - - while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) { - error = tsleep((caddr_t)&so->so_timeo, PSOCK | PCATCH, - "connect", 0); - if (error) - break; - } - - if (error == 0) { - error = so->so_error; - so->so_error = 0; - } - - splx(s); - bad: so->so_state &= ~SS_ISCONNECTING; @@ -219,12 +201,17 @@ DWORD OskitTCPClose( void *socket ) { soclose( so ); } -DWORD OskitTCPSend( void *socket, OSK_PCHAR Data, OSK_UINT Len, int flags ) { - OskitDumpBuffer( Data, Len ); +int OskitTCPSend( void *socket, OSK_PCHAR Data, OSK_UINT Len, + OSK_UINT *OutLen, OSK_UINT flags ) { struct mbuf mb; + struct uio uio = { 0 }; + int error = 0; + OskitDumpBuffer( Data, Len ); mb.m_data = Data; mb.m_len = Len; - return sosend( socket, NULL, NULL, (struct mbuf *)&mb, NULL, 0 ); + error = sosend( socket, NULL, &uio, (struct mbuf *)&mb, NULL, 0 ); + *OutLen = uio.uio_resid; + return error; } void *OskitTCPAccept( void *socket, diff --git a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c index f56fa322af4..615b8e79bb3 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/sleep.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/sleep.c @@ -64,25 +64,29 @@ void wakeup( struct socket *so, struct selinfo *si, void *token ) { KEVENT Event; PLIST_ENTRY Entry; PSLEEPING_THREAD SleepingThread; + UINT flags = 0; OS_DbgPrint (OSK_MID_TRACE,("XXX Bytes to receive: %d\n", so->so_rcv.sb_cc)); - if( so->so_rcv.sb_cc && si ) - si->si_flags |= SEL_READ; + if( so->so_state & SS_ISCONNECTED ) { + OS_DbgPrint(OSK_MID_TRACE,("Socket connected!\n")); + flags |= SEL_CONNECT; + } + if( so->so_rcv.sb_cc && si ) { + OS_DbgPrint(OSK_MID_TRACE,("Socket readable\n")); + flags |= SEL_READ; + } OS_DbgPrint(OSK_MID_TRACE,("Wakeup %x (socket %x, si_flags %x, state %x)!\n", token, so, si ? si->si_flags : 0, so->so_state)); - if( OtcpEvent.SocketState ) { - OS_DbgPrint(OSK_MID_TRACE,("Calling client's socket state fn\n")); + if( OtcpEvent.SocketState ) OtcpEvent.SocketState( OtcpEvent.ClientData, so, - so->so_connection, - si ? si->si_flags : 0, - so->so_state ); - } + so ? so->so_connection : 0, + flags ); ExAcquireFastMutex( &SleepingThreadsLock ); Entry = SleepingThreadsList.Flink; diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c index 0ab79a24d37..fbded676bb3 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_input.c @@ -121,10 +121,11 @@ tcp_reass(tp, ti, m) * Find a segment which begins after this one does. */ for (q = tp->seg_next; q != (struct tcpiphdr *)tp; - q = (struct tcpiphdr *)q->ti_next) - if (SEQ_GT(q->ti_seq, ti->ti_seq)) - break; - + q = (struct tcpiphdr *)q->ti_next) { + printf("Finding segment: %x\n", q); + if (SEQ_GT(q->ti_seq, ti->ti_seq)) + break; + } /* * If there is a preceding segment, it may provide some of * our data already. If so, drop the data from the incoming @@ -760,7 +761,7 @@ findpcb: */ tp->rcv_adv += min(tp->rcv_wnd, TCP_MAXWIN); tcpstat.tcps_connects++; - soisconnected(so); + //soisconnected(so); tp->t_timer[TCPT_KEEP] = tcp_keepinit; dropsocket = 0; /* committed to socket */ tcpstat.tcps_accepts++; @@ -853,7 +854,7 @@ findpcb: goto dropwithreset; } tcpstat.tcps_connects++; - soisconnected(so); + //soisconnected(so); /* Do window scaling on this connection? */ if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == (TF_RCVD_SCALE|TF_REQ_SCALE)) { @@ -890,6 +891,7 @@ findpcb: ("Socket %x entered ESTABLISHED state\n", so)); tp->t_state = TCPS_ESTABLISHED; + soisconnected(so); tp->t_timer[TCPT_KEEP] = tcp_keepidle; socwakeup(so); } @@ -1220,7 +1222,7 @@ trimthenstep6: goto dropwithreset; tcpstat.tcps_connects++; - soisconnected(so); + //soisconnected(so); /* Do window scaling? */ if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) == (TF_RCVD_SCALE|TF_REQ_SCALE)) { diff --git a/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c b/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c index ac61c4eb609..c780f43452d 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/tcp_usrreq.c @@ -452,7 +452,6 @@ tcp_connect(tp, nam) in_pcbrehash(inp); - tp->t_template = tcp_template(tp); if (tp->t_template == 0) { @@ -478,7 +477,6 @@ tcp_connect(tp, nam) tcp_sendseqinit(tp); - /* * Generate a CC value for this connection and * check whether CC or CCnew should be used. diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c index c7ae553c3c8..b90b95bdf5f 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c @@ -74,6 +74,8 @@ socreate(dom, aso, type, proto) register struct socket *so; register int error; + printf("socreate(%d,%x,%d,%d)\n", dom, aso, type, proto); + if (proto) prp = pffindproto(dom, proto, type); else @@ -352,7 +354,7 @@ sosend(so, addr, uio, top, control, flags) dontroute = (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && (so->so_proto->pr_flags & PR_ATOMIC); - p->p_stats->p_ru.ru_msgsnd++; + /* p->p_stats->p_ru.ru_msgsnd++; */ if (control) clen = control->m_len; #define snderr(errno) { error = errno; splx(s); goto release; } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c index 6c0f86f8f60..ec24f57dfb1 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket2.c @@ -742,8 +742,10 @@ sbflush(sb) panic("sbflush"); while (sb->sb_mbcnt) sbdrop(sb, (int)sb->sb_cc); +#if 0 if (sb->sb_cc || sb->sb_mb) panic("sbflush 2"); +#endif } /* From cf7372bf5a4a13c1fdbfd39ae4e5484f53d7979e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Jul 2004 10:32:18 +0000 Subject: [PATCH 224/356] added a very basic timer queue test program svn path=/trunk/; revision=10034 --- reactos/apps/tests/tmrqueue/.cvsignore | 6 + reactos/apps/tests/tmrqueue/makefile | 23 ++ reactos/apps/tests/tmrqueue/tmrqueue.c | 365 +++++++++++++++++++++++++ 3 files changed, 394 insertions(+) create mode 100644 reactos/apps/tests/tmrqueue/.cvsignore create mode 100644 reactos/apps/tests/tmrqueue/makefile create mode 100644 reactos/apps/tests/tmrqueue/tmrqueue.c diff --git a/reactos/apps/tests/tmrqueue/.cvsignore b/reactos/apps/tests/tmrqueue/.cvsignore new file mode 100644 index 00000000000..d63774a7353 --- /dev/null +++ b/reactos/apps/tests/tmrqueue/.cvsignore @@ -0,0 +1,6 @@ +*.o +*.d +*.exe +*.coff +*.sym +*.map diff --git a/reactos/apps/tests/tmrqueue/makefile b/reactos/apps/tests/tmrqueue/makefile new file mode 100644 index 00000000000..58a97d29b1a --- /dev/null +++ b/reactos/apps/tests/tmrqueue/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/07/08 10:32:18 weiden Exp $ + +PATH_TO_TOP = ../../.. + +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 diff --git a/reactos/apps/tests/tmrqueue/tmrqueue.c b/reactos/apps/tests/tmrqueue/tmrqueue.c new file mode 100644 index 00000000000..5dd2df7f005 --- /dev/null +++ b/reactos/apps/tests/tmrqueue/tmrqueue.c @@ -0,0 +1,365 @@ +#include +#include +#include + +#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; +} From 3e78fd61283fbc17a5952b974be9b3c53b4c130e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 8 Jul 2004 12:55:01 +0000 Subject: [PATCH 225/356] - Honor the "Extended" bit in SetKeyState. svn path=/trunk/; revision=10035 --- reactos/subsys/win32k/ntuser/keyboard.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 02a633e32cd..6215ca72ec1 100644 --- a/reactos/subsys/win32k/ntuser/keyboard.c +++ b/reactos/subsys/win32k/ntuser/keyboard.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: keyboard.c,v 1.30 2004/07/04 17:08:40 navaraf Exp $ +/* $Id: keyboard.c,v 1.31 2004/07/08 12:55:01 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -89,6 +89,13 @@ static VOID STDCALL SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) { if (down) QueueKeyStateTable[vk] ^= KS_LOCK_BIT; } + if (ext && vk == VK_LSHIFT) + vk = VK_RSHIFT; + if (ext && vk == VK_LCONTROL) + vk = VK_RCONTROL; + if (ext && vk == VK_LMENU) + vk = VK_RMENU; + if (down) QueueKeyStateTable[vk] |= KS_DOWN_BIT; else From 29ced92e4bd0cd6672b22495da01a3c9b6297661 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 8 Jul 2004 14:36:18 +0000 Subject: [PATCH 226/356] Fix RegisterLogonProcess(). svn path=/trunk/; revision=10036 --- reactos/include/funcs.h | 4 +-- reactos/lib/user32/misc/misc.c | 11 ++++--- reactos/subsys/win32k/ntuser/misc.c | 47 ++++++++++++++++------------- reactos/w32api/include/winuser.h | 1 + 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index 763a63f156c..de16fc11001 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -4604,8 +4604,8 @@ RegisterSystemThread( BOOL STDCALL RegisterLogonProcess( - HANDLE hprocess, - BOOL x + DWORD dwPprocessId, + BOOL bRegister ); WINBOOL diff --git a/reactos/lib/user32/misc/misc.c b/reactos/lib/user32/misc/misc.c index 9f3393287f6..1ad07afabed 100644 --- a/reactos/lib/user32/misc/misc.c +++ b/reactos/lib/user32/misc/misc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: misc.c,v 1.5 2004/05/28 21:33:41 gvg Exp $ +/* $Id: misc.c,v 1.6 2004/07/08 14:35:10 ekohl Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/misc.c @@ -59,17 +59,20 @@ PrivateCsrssManualGuiCheck(LONG Check) VOID STDCALL -PrivateCsrssInitialized() +PrivateCsrssInitialized(VOID) { NtUserCallNoParam(NOPARAM_ROUTINE_CSRSS_INITIALIZED); } + /* * @implemented */ BOOL STDCALL -RegisterLogonProcess ( HANDLE hprocess, BOOL x ) +RegisterLogonProcess(DWORD dwProcessId, BOOL bRegister) { - return NtUserRegisterLogonProcess(hprocess, x); + return NtUserCallTwoParam(dwProcessId, + (DWORD)bRegister, + TWOPARAM_ROUTINE_REGISTERLOGONPROC); } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index edab9193f2c..e786c0be3fa 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.81 2004/07/03 13:55:36 navaraf Exp $ +/* $Id: misc.c,v 1.82 2004/07/08 14:36:18 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,39 +37,44 @@ PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue() { } BOOL FASTCALL -IntRegisterLogonProcess(HANDLE hProcess, BOOL x) +IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister) { PEPROCESS Process; NTSTATUS Status; - - if(LogonProcess != NULL && LogonProcess != PsGetWin32Process()) + + Status = PsLookupProcessByProcessId((PVOID)dwProcessId, + &Process); + if (!NT_SUCCESS(Status)) { - SetLastWin32Error(ERROR_ACCESS_DENIED); + SetLastWin32Error(RtlNtStatusToDosError(Status)); return FALSE; } - - if(hProcess) + + if (bRegister) { - Status = ObReferenceObjectByHandle(hProcess, - PROCESS_QUERY_INFORMATION, - PsProcessType, - ExGetPreviousMode(), - (PVOID*)&Process, - NULL); - if(!NT_SUCCESS(Status)) + /* Register the logon process */ + if (LogonProcess != NULL) { - SetLastNtError(Status); - return 0; + ObDereferenceObject(Process); + return FALSE; } - + LogonProcess = Process->Win32Process; - ObDereferenceObject(Process); } else { - /* deregister the logon process */ + /* Deregister the logon process */ + if (LogonProcess != Process->Win32Process) + { + ObDereferenceObject(Process); + return FALSE; + } + LogonProcess = NULL; } + + ObDereferenceObject(Process); + return TRUE; } @@ -489,7 +494,7 @@ NtUserCallTwoParam( } case TWOPARAM_ROUTINE_REGISTERLOGONPROC: - return (DWORD)IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2); + return (DWORD)IntRegisterLogonProcess(Param1, (BOOL)Param2); } DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n", @@ -532,7 +537,7 @@ NtUserCallHwndLock( /* FIXME */ break; - case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW: + case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW: Ret = IntSetForegroundWindow(Window); break; diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index bb7c528ad53..c8a02f99f1e 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -3704,6 +3704,7 @@ HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE,LPVOID,DWORD); HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE,LPVOID,DWORD); #endif BOOL WINAPI RegisterHotKey(HWND,int,UINT,UINT); +BOOL WINAPI RegisterLogonProcess(DWORD,BOOL); #if (_WIN32_WINNT >= 0x0501) BOOL WINAPI RegisterRawInputDevices(PCRAWINPUTDEVICE,UINT,UINT); #endif From 5b95f50fd4b3f91bbca75f93fb80c23d3d81671f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 8 Jul 2004 14:41:38 +0000 Subject: [PATCH 227/356] Register the logon process. svn path=/trunk/; revision=10037 --- reactos/subsys/system/winlogon/winlogon.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 8b2cec9342b..9a3b4f4f891 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.31 2004/07/03 17:40:24 navaraf Exp $ +/* $Id: winlogon.c,v 1.32 2004/07/08 14:41:38 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -565,7 +565,7 @@ WinMain(HINSTANCE hInstance, } WLSession->LogonStatus = LOGON_INITIALIZING; -#if START_LSASS + if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE)) { DbgPrint("WL: Could not register logon process\n"); @@ -573,7 +573,6 @@ WinMain(HINSTANCE hInstance, ExitProcess(0); return 0; } -#endif if(!WlxCreateWindowStationAndDesktops(WLSession)) { From 4a76a3915bcbd479d8080d6c731db20e743f83e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Thu, 8 Jul 2004 22:05:48 +0000 Subject: [PATCH 228/356] Fix lib/rosrtl compilation svn path=/trunk/; revision=10039 --- reactos/include/ntdll/rtl.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/include/ntdll/rtl.h b/reactos/include/ntdll/rtl.h index e61f005d1cc..7d9895e9a63 100644 --- a/reactos/include/ntdll/rtl.h +++ b/reactos/include/ntdll/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.44 2004/07/08 00:40:30 weiden Exp $ +/* $Id: rtl.h,v 1.45 2004/07/08 22:05:48 gvg Exp $ * */ @@ -618,7 +618,11 @@ RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash, /* Timer Queue functions */ +#ifdef __USE_W32API +#include +#else /* __USE_W32API */ typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); +#endif /* __USE_W32API */ NTSTATUS STDCALL From 1ef595367943b98798d931d6649caec0583be925 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 9 Jul 2004 15:53:34 +0000 Subject: [PATCH 229/356] set the control focus when clicking on it svn path=/trunk/; revision=10047 --- reactos/subsys/system/regedit/hexedit.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/system/regedit/hexedit.c b/reactos/subsys/system/regedit/hexedit.c index 332a937e372..edec6af814f 100644 --- a/reactos/subsys/system/regedit/hexedit.c +++ b/reactos/subsys/system/regedit/hexedit.c @@ -748,10 +748,12 @@ HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt) POINT EditPos; DWORD Hit = HEXEDIT_HitRegionTest(hed, Pt); + SetFocus(hed->hWndSelf); + hed->Position = HEXEDIT_PositionFromPoint(hed, Pt, Hit, &EditPos, &NewField); hed->EditingField = NewField; hed->CaretCol = EditPos.x; - hed->CaretLine = EditPos.y; + hed->CaretLine = EditPos.y; HEXEDIT_MoveCaret(hed, TRUE); From b00489100f3e5e45e3e911b9ae3128073227f2e0 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:04:05 +0000 Subject: [PATCH 230/356] - Added ordinal numbers. svn path=/trunk/; revision=10048 --- reactos/lib/ws2_32/ws2_32.edf | 229 +++++++++++++++++----------------- 1 file changed, 114 insertions(+), 115 deletions(-) diff --git a/reactos/lib/ws2_32/ws2_32.edf b/reactos/lib/ws2_32/ws2_32.edf index 5cfe339aeb0..b32f69db26c 100644 --- a/reactos/lib/ws2_32/ws2_32.edf +++ b/reactos/lib/ws2_32/ws2_32.edf @@ -3,120 +3,119 @@ LIBRARY ws2_32.dll EXPORTS -WEP=WEP@0 -WPUCompleteOverlappedRequest=WPUCompleteOverlappedRequest@20 -WSAAccept=WSAAccept@20 -WSAAddressToStringA=WSAAddressToStringA@20 -WSAAddressToStringW=WSAAddressToStringW@20 -WSAAsyncGetHostByAddr=WSAAsyncGetHostByAddr@28 -WSAAsyncGetHostByName=WSAAsyncGetHostByName@20 -WSAAsyncGetProtoByName=WSAAsyncGetProtoByName@20 -WSAAsyncGetProtoByNumber=WSAAsyncGetProtoByNumber@20 -WSAAsyncGetServByName=WSAAsyncGetServByName@24 -WSAAsyncGetServByPort=WSAAsyncGetServByPort@24 -WSAAsyncSelect=WSAAsyncSelect@16 -WSACancelAsyncRequest=WSACancelAsyncRequest@4 -WSACancelBlockingCall=WSACancelBlockingCall@0 -WSACleanup=WSACleanup@0 -WSACloseEvent=WSACloseEvent@4 -WSAConnect=WSAConnect@28 -WSACreateEvent=WSACreateEvent@0 -WSADuplicateSocketA=WSADuplicateSocketA@12 -WSADuplicateSocketW=WSADuplicateSocketW@12 -WSAEnumNameSpaceProvidersA=WSAEnumNameSpaceProvidersA@8 -WSAEnumNameSpaceProvidersW=WSAEnumNameSpaceProvidersW@8 -WSAEnumNetworkEvents=WSAEnumNetworkEvents@12 -WSAEnumProtocolsA=WSAEnumProtocolsA@12 -WSAEnumProtocolsW=WSAEnumProtocolsW@12 -WSAEventSelect=WSAEventSelect@12 -WSAGetLastError=WSAGetLastError@0 -WSAGetOverlappedResult=WSAGetOverlappedResult@20 -WSAGetQOSByName=WSAGetQOSByName@12 -WSAGetServiceClassInfoA=WSAGetServiceClassInfoA@16 -WSAGetServiceClassInfoW=WSAGetServiceClassInfoW@16 -WSAGetServiceClassNameByClassIdA=WSAGetServiceClassNameByClassIdA@12 -WSAGetServiceClassNameByClassIdW=WSAGetServiceClassNameByClassIdW@12 -WSAHtonl=WSAHtonl@12 -WSAHtons=WSAHtons@12 -WSAInstallServiceClassA=WSAInstallServiceClassA@4 -WSAInstallServiceClassW=WSAInstallServiceClassW@4 -WSAIoctl=WSAIoctl@36 -WSAIsBlocking=WSAIsBlocking@0 -WSAJoinLeaf=WSAJoinLeaf@32 -WSALookupServiceBeginA=WSALookupServiceBeginA@12 -WSALookupServiceBeginW=WSALookupServiceBeginW@12 -WSALookupServiceEnd=WSALookupServiceEnd@4 -WSALookupServiceNextA=WSALookupServiceNextA@16 -WSALookupServiceNextW=WSALookupServiceNextW@16 -WSANtohl=WSANtohl@12 -WSANtohs=WSANtohs@12 -WSAProviderConfigChange=WSAProviderConfigChange@12 -WSARecv=WSARecv@28 -WSARecvDisconnect=WSARecvDisconnect@8 -WSARecvFrom=WSARecvFrom@36 -WSARemoveServiceClass=WSARemoveServiceClass@4 -WSAResetEvent=WSAResetEvent@4 -WSASend=WSASend@28 -WSASendDisconnect=WSASendDisconnect@8 -WSASendTo=WSASendTo@36 -WSASetBlockingHook=WSASetBlockingHook@4 -WSASetEvent=WSASetEvent@4 -WSASetLastError=WSASetLastError@4 -WSASetServiceA=WSASetServiceA@12 -WSASetServiceW=WSASetServiceW@12 -WSASocketA=WSASocketA@24 -WSASocketW=WSASocketW@24 -WSAStartup=WSAStartup@8 -WSAStringToAddressA=WSAStringToAddressA@20 -WSAStringToAddressW=WSAStringToAddressW@20 -WSAUnhookBlockingHook=WSAUnhookBlockingHook@0 -WSAWaitForMultipleEvents=WSAWaitForMultipleEvents@20 -WSApSetPostRoutine=WSApSetPostRoutine@4 -WSCDeinstallProvider=WSCDeinstallProvider@8 -WSCEnableNSProvider=WSCEnableNSProvider@8 -WSCEnumProtocols=WSCEnumProtocols@16 -WSCGetProviderPath=WSCGetProviderPath@16 -WSCInstallNameSpace=WSCInstallNameSpace@20 -WSCInstallProvider=WSCInstallProvider@20 -WSCUnInstallNameSpace=WSCUnInstallNameSpace@4 -WSCWriteNameSpaceOrder=WSCWriteNameSpaceOrder@8 -WSCWriteProviderOrder=WSCWriteProviderOrder@8 -__WSAFDIsSet=__WSAFDIsSet@8 -accept=accept@12 -bind=bind@12 -closesocket=closesocket@4 -connect=connect@12 -gethostbyaddr=gethostbyaddr@12 -gethostbyname=gethostbyname@4 -gethostname=gethostname@8 -getpeername=getpeername@12 -getprotobyname=getprotobyname@4 -getprotobynumber=getprotobynumber@4 -getservbyname=getservbyname@8 -getservbyport=getservbyport@8 -getsockname=getsockname@12 -getsockopt=getsockopt@20 -htonl=htonl@4 -htons=htons@4 -inet_addr=inet_addr@4 -inet_ntoa=inet_ntoa@4 -ioctlsocket=ioctlsocket@12 -listen=listen@8 -ntohl=ntohl@4 -ntohs=ntohs@4 -recv=recv@16 -recvfrom=recvfrom@24 -select=select@20 -send=send@16 -sendto=sendto@24 -setsockopt=setsockopt@20 -shutdown=shutdown@8 -socket=socket@12 -WSANSPIoctl=WSANSPIoctl@32 -WSCUpdateProvider=WSCUpdateProvider@20 -WSCWriteNameSpaceOrder=WSCWriteNameSpaceOrder@8 -freeaddrinfo=freeaddrinfo@4 -getaddrinfo=getaddrinfo@16 -getnameinfo=getnameinfo@28 +WEP=WEP@0 @500 +WPUCompleteOverlappedRequest=WPUCompleteOverlappedRequest@20 @25 +WSAAccept=WSAAccept@20 @26 +WSAAddressToStringA=WSAAddressToStringA@20 @27 +WSAAddressToStringW=WSAAddressToStringW@20 @28 +WSAAsyncGetHostByAddr=WSAAsyncGetHostByAddr@28 @102 +WSAAsyncGetHostByName=WSAAsyncGetHostByName@20 @103 +WSAAsyncGetProtoByName=WSAAsyncGetProtoByName@20 @105 +WSAAsyncGetProtoByNumber=WSAAsyncGetProtoByNumber@20 @104 +WSAAsyncGetServByName=WSAAsyncGetServByName@24 @107 +WSAAsyncGetServByPort=WSAAsyncGetServByPort@24 @106 +WSAAsyncSelect=WSAAsyncSelect@16 @101 +WSACancelAsyncRequest=WSACancelAsyncRequest@4 @108 +WSACancelBlockingCall=WSACancelBlockingCall@0 @113 +WSACleanup=WSACleanup@0 @116 +WSACloseEvent=WSACloseEvent@4 @29 +WSAConnect=WSAConnect@28 @30 +WSACreateEvent=WSACreateEvent@0 @31 +WSADuplicateSocketA=WSADuplicateSocketA@12 @32 +WSADuplicateSocketW=WSADuplicateSocketW@12 @33 +WSAEnumNameSpaceProvidersA=WSAEnumNameSpaceProvidersA@8 @34 +WSAEnumNameSpaceProvidersW=WSAEnumNameSpaceProvidersW@8 @35 +WSAEnumNetworkEvents=WSAEnumNetworkEvents@12 @36 +WSAEnumProtocolsA=WSAEnumProtocolsA@12 @37 +WSAEnumProtocolsW=WSAEnumProtocolsW@12 @38 +WSAEventSelect=WSAEventSelect@12 @39 +WSAGetLastError=WSAGetLastError@0 @111 +WSAGetOverlappedResult=WSAGetOverlappedResult@20 @40 +WSAGetQOSByName=WSAGetQOSByName@12 @41 +WSAGetServiceClassInfoA=WSAGetServiceClassInfoA@16 @42 +WSAGetServiceClassInfoW=WSAGetServiceClassInfoW@16 @43 +WSAGetServiceClassNameByClassIdA=WSAGetServiceClassNameByClassIdA@12 @44 +WSAGetServiceClassNameByClassIdW=WSAGetServiceClassNameByClassIdW@12 @45 +WSAHtonl=WSAHtonl@12 @46 +WSAHtons=WSAHtons@12 @47 +WSAInstallServiceClassA=WSAInstallServiceClassA@4 @48 +WSAInstallServiceClassW=WSAInstallServiceClassW@4 @49 +WSAIoctl=WSAIoctl@36 @50 +WSAIsBlocking=WSAIsBlocking@0 @114 +WSAJoinLeaf=WSAJoinLeaf@32 @58 +WSALookupServiceBeginA=WSALookupServiceBeginA@12 @59 +WSALookupServiceBeginW=WSALookupServiceBeginW@12 @60 +WSALookupServiceEnd=WSALookupServiceEnd@4 @61 +WSALookupServiceNextA=WSALookupServiceNextA@16 @62 +WSALookupServiceNextW=WSALookupServiceNextW@16 @63 +WSANSPIoctl=WSANSPIoctl@32 @64 +WSANtohl=WSANtohl@12 @65 +WSANtohs=WSANtohs@12 @66 +WSAProviderConfigChange=WSAProviderConfigChange@12 @67 +WSARecv=WSARecv@28 @68 +WSARecvDisconnect=WSARecvDisconnect@8 @69 +WSARecvFrom=WSARecvFrom@36 @70 +WSARemoveServiceClass=WSARemoveServiceClass@4 @71 +WSAResetEvent=WSAResetEvent@4 @72 +WSASend=WSASend@28 @73 +WSASendDisconnect=WSASendDisconnect@8 @74 +WSASendTo=WSASendTo@36 @75 +WSASetBlockingHook=WSASetBlockingHook@4 @109 +WSASetEvent=WSASetEvent@4 @76 +WSASetLastError=WSASetLastError@4 @112 +WSASetServiceA=WSASetServiceA@12 @77 +WSASetServiceW=WSASetServiceW@12 @78 +WSASocketA=WSASocketA@24 @79 +WSASocketW=WSASocketW@24 @80 +WSAStartup=WSAStartup@8 @115 +WSAStringToAddressA=WSAStringToAddressA@20 @81 +WSAStringToAddressW=WSAStringToAddressW@20 @82 +WSAUnhookBlockingHook=WSAUnhookBlockingHook@0 @110 +WSAWaitForMultipleEvents=WSAWaitForMultipleEvents@20 @83 +WSApSetPostRoutine=WSApSetPostRoutine@4 @24 +WSCDeinstallProvider=WSCDeinstallProvider@8 @84 +WSCEnableNSProvider=WSCEnableNSProvider@8 @85 +WSCEnumProtocols=WSCEnumProtocols@16 @86 +WSCGetProviderPath=WSCGetProviderPath@16 @87 +WSCInstallNameSpace=WSCInstallNameSpace@20 @88 +WSCInstallProvider=WSCInstallProvider@20 @89 +WSCUnInstallNameSpace=WSCUnInstallNameSpace@4 @90 +WSCUpdateProvider=WSCUpdateProvider@20 @91 +WSCWriteNameSpaceOrder=WSCWriteNameSpaceOrder@8 @92 +WSCWriteProviderOrder=WSCWriteProviderOrder@8 @93 +__WSAFDIsSet=__WSAFDIsSet@8 @151 +accept=accept@12 @1 +bind=bind@12 @2 +closesocket=closesocket@4 @3 +connect=connect@12 @4 +freeaddrinfo=freeaddrinfo@4 @94 +getaddrinfo=getaddrinfo@16 @95 +gethostbyaddr=gethostbyaddr@12 @51 +gethostbyname=gethostbyname@4 @52 +gethostname=gethostname@8 @57 +getnameinfo=getnameinfo@28 @96 +getpeername=getpeername@12 @5 +getprotobyname=getprotobyname@4 @53 +getprotobynumber=getprotobynumber@4 @54 +getservbyname=getservbyname@8 @55 +getservbyport=getservbyport@8 @56 +getsockname=getsockname@12 @6 +getsockopt=getsockopt@20 @7 +htonl=htonl@4 @8 +htons=htons@4 @9 +inet_addr=inet_addr@4 @11 +inet_ntoa=inet_ntoa@4 @12 +ioctlsocket=ioctlsocket@12 @10 +listen=listen@8 @13 +ntohl=ntohl@4 @14 +ntohs=ntohs@4 @15 +recv=recv@16 @16 +recvfrom=recvfrom@24 @17 +select=select@20 @18 +send=send@16 @19 +sendto=sendto@24 @20 +setsockopt=setsockopt@20 @21 +shutdown=shutdown@8 @22 +socket=socket@12 @23 ; EOF From 18168b454a7526b1cb3c208e67162120f9593c21 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:06:40 +0000 Subject: [PATCH 231/356] - Fixed dispatching of nested exceptions. svn path=/trunk/; revision=10049 --- reactos/lib/rtl/i386/exception.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/reactos/lib/rtl/i386/exception.c b/reactos/lib/rtl/i386/exception.c index bb091e72396..e6abf5a5d68 100644 --- a/reactos/lib/rtl/i386/exception.c +++ b/reactos/lib/rtl/i386/exception.c @@ -1,4 +1,4 @@ -/* $Id: exception.c,v 1.3 2004/07/07 16:25:00 navaraf Exp $ +/* $Id: exception.c,v 1.4 2004/07/09 20:06:40 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -90,8 +90,7 @@ ULONG RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context) { - PEXCEPTION_REGISTRATION RegistrationFrame; - DWORD DispatcherContext; + PEXCEPTION_REGISTRATION RegistrationFrame, NestedFrame = NULL, DispatcherContext; DWORD ReturnValue; DPRINT("RtlpDispatchException()\n"); @@ -107,7 +106,6 @@ RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, while ((ULONG_PTR)RegistrationFrame != -1) { EXCEPTION_RECORD ExceptionRecord2; - DWORD Temp = 0; //PVOID RegistrationFrameEnd = (PVOID)RegistrationFrame + 8; // Make sure the registration frame is located within the stack @@ -172,9 +170,10 @@ RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, DPRINT("EBP == 0x%.08x\n", sp[6]); } #endif - if (RegistrationFrame == NULL) + if (RegistrationFrame == NestedFrame) { ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL; // Turn off flag + NestedFrame = NULL; } if (ReturnValue == ExceptionContinueExecution) @@ -207,10 +206,10 @@ RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, { DPRINT("ReturnValue == ExceptionNestedException\n"); - ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND; - if (DispatcherContext > Temp) + ExceptionRecord->ExceptionFlags |= EXCEPTION_NESTED_CALL; + if (NestedFrame < DispatcherContext) { - Temp = DispatcherContext; + NestedFrame = DispatcherContext; } } else /* if (ReturnValue == ExceptionCollidedUnwind) */ From 2915b7de9b1ffdf3fb608c7d5b5d2efefe342429 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:08:05 +0000 Subject: [PATCH 232/356] - Corrected the obtaining of TLS callbacks address. svn path=/trunk/; revision=10050 --- reactos/lib/ntdll/ldr/utils.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 41abc521a40..0ed85b43db0 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.97 2004/07/03 17:40:22 navaraf Exp $ +/* $Id: utils.c,v 1.98 2004/07/09 20:08:05 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -252,7 +252,10 @@ LdrpInitializeTlsForProccess(VOID) TlsData->StartAddressOfRawData = (PVOID)TlsDirectory->StartAddressOfRawData; TlsData->TlsDataSize = TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData; TlsData->TlsZeroSize = TlsDirectory->SizeOfZeroFill; - TlsData->TlsAddressOfCallBacks = *TlsDirectory->AddressOfCallBacks; + if (TlsDirectory->AddressOfCallBacks) + TlsData->TlsAddressOfCallBacks = *(PIMAGE_TLS_CALLBACK)RVA(Module->BaseAddress, TlsDirectory->AddressOfCallBacks); + else + TlsData->TlsAddressOfCallBacks = NULL; TlsData->Module = Module; #if 0 DbgPrint("TLS directory for %wZ\n", &Module->BaseDllName); From a2f7e347924cfffd2bc0d71cd30b520d82a76b6a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:08:48 +0000 Subject: [PATCH 233/356] - Display window icon only if there is any. svn path=/trunk/; revision=10051 --- reactos/lib/user32/windows/nonclient.c | 80 +++++++++++--------------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/reactos/lib/user32/windows/nonclient.c b/reactos/lib/user32/windows/nonclient.c index 75d94006c74..13682738a6c 100644 --- a/reactos/lib/user32/windows/nonclient.c +++ b/reactos/lib/user32/windows/nonclient.c @@ -147,52 +147,38 @@ UserHasMenu(HWND hWnd, ULONG Style) HICON UserGetWindowIcon(HWND hwnd) { - HICON Ret; - - if(SendMessageTimeoutW(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&Ret) && Ret) - { - return Ret; - } - if(SendMessageTimeoutW(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&Ret) && Ret) - { - return Ret; - } - if(SendMessageTimeoutW(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&Ret) && Ret) - { - return Ret; - } - if((Ret = (HICON)GetClassLongW(hwnd, GCL_HICONSM))) - { - return Ret; - } - if((Ret = (HICON)GetClassLongW(hwnd, GCL_HICON))) - { - return Ret; - } - if(SendMessageTimeoutW(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&Ret) && Ret) - { - return Ret; - } - if((Ret = LoadIconW(0, IDI_APPLICATION))) - { - return Ret; - } - - return NULL; + HICON hIcon = 0; + + SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon); + + if (!hIcon) + SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon); + + if (!hIcon) + SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon); + + if (!hIcon) + hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM); + + if (!hIcon) + hIcon = (HICON)GetClassLong(hwnd, GCL_HICON); + + return hIcon; } BOOL UserDrawSysMenuButton(HWND hWnd, HDC hDC, LPRECT Rect, BOOL Down) { - HICON WindowIcon; + HICON WindowIcon; - if((WindowIcon = UserGetWindowIcon(hWnd))) - { - return DrawIconEx(hDC, Rect->left + 2, Rect->top + 2, WindowIcon, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - 0, NULL, DI_NORMAL); - } - return FALSE; + if ((WindowIcon = UserGetWindowIcon(hWnd))) + { + return DrawIconEx(hDC, Rect->left + 2, Rect->top + 2, WindowIcon, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + 0, NULL, DI_NORMAL); + } + + return FALSE; } /* @@ -1223,11 +1209,11 @@ DrawCaption(HWND hWnd, HDC hDC, LPCRECT lprc, UINT uFlags) xx = GetSystemMetrics(SM_CXSIZE) + Padding; /* draw icon background */ PatBlt(MemDC, 0, 0, xx, lprc->bottom - lprc->top, PATCOPY); - // For some reason the icon isn't centered correctly... + /* For some reason the icon isn't centered correctly... */ r.top --; - UserDrawSysMenuButton(hWnd, MemDC, &r, FALSE); + if (UserDrawSysMenuButton(hWnd, MemDC, &r, FALSE)) + r.left += xx; r.top ++; - r.left += xx; } vert[0].x = r.left; @@ -1269,9 +1255,10 @@ DrawCaption(HWND hWnd, HDC hDC, LPCRECT lprc, UINT uFlags) if ((uFlags & DC_ICON) && !(uFlags & DC_GRADIENT) && (Style & WS_SYSMENU) && !(uFlags & DC_SMALLCAP)) { - // For some reason the icon isn't centered correctly... + /* For some reason the icon isn't centered correctly... */ r.top --; - UserDrawSysMenuButton(hWnd, MemDC, &r, FALSE); + if (UserDrawSysMenuButton(hWnd, MemDC, &r, FALSE)) + r.left += GetSystemMetrics(SM_CXSIZE) + Padding; r.top ++; } r.top ++; @@ -1283,9 +1270,6 @@ DrawCaption(HWND hWnd, HDC hDC, LPCRECT lprc, UINT uFlags) { if(!(uFlags & DC_GRADIENT)) { - if (!(uFlags & DC_SMALLCAP) && ((uFlags & DC_ICON) || (uFlags & DC_INBUTTON))) - r.left += GetSystemMetrics(SM_CXSIZE) + Padding; - r.right = (lprc->right - lprc->left); if (uFlags & DC_SMALLCAP) ButtonWidth = GetSystemMetrics(SM_CXSMSIZE) - 2; From d45a8c1356cb0007e8fb8a2a648e83434a478175 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:09:35 +0000 Subject: [PATCH 234/356] - DrawIcon should return TRUE if it succeeds. svn path=/trunk/; revision=10052 --- reactos/subsys/win32k/objects/cursoricon.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index 53f04c30fe9..5c743425eef 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.62 2004/07/07 08:39:54 gvg Exp $ */ +/* $Id: cursoricon.c,v 1.63 2004/07/09 20:09:35 navaraf Exp $ */ #include PCURICON_OBJECT FASTCALL @@ -1236,6 +1236,8 @@ NtUserDrawIconEx( #if CANSTRETCHBLT SetStretchBltMode(hdcOff, nStretchMode); #endif + + Ret = TRUE; cleanup: if(DoFlickerFree) From 35a256ae2bdb353c04e5cc69bbc451bb2262b978 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:10:45 +0000 Subject: [PATCH 235/356] - Since LookupAccountSidA is unimplemented, but returns success, we should at least fill the output parameters with some reasonable values. svn path=/trunk/; revision=10053 --- reactos/lib/advapi32/sec/misc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index be32d2b1508..37c7668a196 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.19 2004/07/06 22:08:48 gvg Exp $ +/* $Id: misc.c,v 1.20 2004/07/09 20:10:45 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -379,6 +379,8 @@ LookupAccountSidA (LPCSTR lpSystemName, PSID_NAME_USE peUse) { DPRINT1("LookupAccountSidA is unimplemented, but returns success\n"); + lstrcpynA(lpName, "Administrator", *cchName); + lstrcpynA(lpReferencedDomainName, "ReactOS", *cchReferencedDomainName); return TRUE; } @@ -398,6 +400,8 @@ LookupAccountSidW (LPCWSTR lpSystemName, PSID_NAME_USE peUse) { DPRINT1("LookupAccountSidW is unimplemented, but returns success\n"); + lstrcpynW(lpName, L"Administrator", *cchName); + lstrcpynW(lpReferencedDomainName, L"ReactOS", *cchReferencedDomainName); return TRUE; } From 79a4726093ee464dcdbe2df9732a6424b8947486 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:13:00 +0000 Subject: [PATCH 236/356] - Handle UnsafeRect == NULL case in NtUserGetUpdateRect. svn path=/trunk/; revision=10054 --- reactos/subsys/win32k/ntuser/painting.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/painting.c b/reactos/subsys/win32k/ntuser/painting.c index b72f6a2cc74..419440e0295 100644 --- a/reactos/subsys/win32k/ntuser/painting.c +++ b/reactos/subsys/win32k/ntuser/painting.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: painting.c,v 1.83 2004/05/15 08:01:56 gvg Exp $ + * $Id: painting.c,v 1.84 2004/07/09 20:13:00 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -914,11 +914,14 @@ NtUserGetUpdateRect(HWND Wnd, LPRECT UnsafeRect, BOOL Erase) RGNDATA_UnlockRgn(Rgn); NtGdiDeleteObject(Rgn); - Status = MmCopyToCaller(UnsafeRect, &Rect, sizeof(RECT)); - if (! NT_SUCCESS(Status)) + if (UnsafeRect != NULL) { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; + Status = MmCopyToCaller(UnsafeRect, &Rect, sizeof(RECT)); + if (! NT_SUCCESS(Status)) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } } return Rect.left < Rect.right && Rect.top < Rect.bottom; From 91995ef4ed9c605f93f489867fdcaa52567d5dc1 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:14:49 +0000 Subject: [PATCH 237/356] - Some application depend on Info->RegionSize set by NtQueryVirtualMemory for iteration. We had a workaround here for this behaviour until a correct implementation is written, but it was limited for addresses lower than 0x70000000. Raise that limit to 0x80000000. svn path=/trunk/; revision=10055 --- reactos/ntoskrnl/mm/virtual.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index abc85fcef5a..44c966ce914 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: virtual.c,v 1.76 2004/06/19 08:53:35 vizzini Exp $ +/* $Id: virtual.c,v 1.77 2004/07/09 20:14:49 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -180,7 +180,7 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, /* Since programs might depend on RegionSize for * iteration, we for now just make up a value. */ - Info->RegionSize = (Address > (PVOID)0x70000000) ? 0 : 0x10000; + Info->RegionSize = (Address > (PVOID)0x80000000) ? 0 : 0x10000; Info->Protect = PAGE_NOACCESS; Info->Type = 0; Status = STATUS_SUCCESS; From 549b1545100f169a8ec9a4b6600ba7d2cb75b204 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 9 Jul 2004 20:18:49 +0000 Subject: [PATCH 238/356] added skeleton for acledit.dll svn path=/trunk/; revision=10056 --- reactos/Makefile | 4 +- reactos/baseaddress.cfg | 3 +- reactos/include/acledit.h | 136 +++++++++++++++++++++++++++++++ reactos/lib/acledit/.cvsignore | 8 ++ reactos/lib/acledit/Makefile | 45 ++++++++++ reactos/lib/acledit/acledit.c | 60 ++++++++++++++ reactos/lib/acledit/acledit.def | 12 +++ reactos/lib/acledit/acledit.edf | 12 +++ reactos/lib/acledit/acledit.rc | 40 +++++++++ reactos/lib/acledit/acleditint.h | 8 ++ reactos/lib/acledit/resource.h | 8 ++ reactos/lib/acledit/stubs.c | 118 +++++++++++++++++++++++++++ 12 files changed, 451 insertions(+), 3 deletions(-) create mode 100644 reactos/include/acledit.h create mode 100644 reactos/lib/acledit/.cvsignore create mode 100644 reactos/lib/acledit/Makefile create mode 100644 reactos/lib/acledit/acledit.c create mode 100644 reactos/lib/acledit/acledit.def create mode 100644 reactos/lib/acledit/acledit.edf create mode 100644 reactos/lib/acledit/acledit.rc create mode 100644 reactos/lib/acledit/acleditint.h create mode 100644 reactos/lib/acledit/resource.h create mode 100644 reactos/lib/acledit/stubs.c diff --git a/reactos/Makefile b/reactos/Makefile index a196acc3be6..74d806db17a 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.233 2004/07/02 08:06:46 arty Exp $ +# $Id: Makefile,v 1.234 2004/07/09 20:18:48 weiden Exp $ # # Global makefile # @@ -44,7 +44,7 @@ DLLS_CPL = cpl # advapi32 cards crtdll comdlg32 fmifs gdi32 imagehlp kernel32 libpcap packet msafd msvcrt ntdll # epsapi psapi richedit rpcrt4 secur32 user32 version ws2help ws2_32 wsock32 wshirda mswsock # imagehlp imm32 -DLLS = advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freetype gdi32 \ +DLLS = acledit advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freetype gdi32 \ imm32 iphlpapi kernel32 lzexpand mpr msafd msgina msimg32 msvcrt msvcrt20 mswsock \ netapi32 ntdll ole32 oleaut32 oledlg packet psapi richedit rpcrt4 samlib secur32 \ setupapi shell32 shlwapi snmpapi syssetup twain unicode user32 userenv version wininet \ diff --git a/reactos/baseaddress.cfg b/reactos/baseaddress.cfg index c149050787f..293f7bdffa1 100644 --- a/reactos/baseaddress.cfg +++ b/reactos/baseaddress.cfg @@ -1,10 +1,11 @@ -# $Id: baseaddress.cfg,v 1.16 2004/05/29 21:24:42 hbirr Exp $ +# $Id: baseaddress.cfg,v 1.17 2004/07/09 20:18:49 weiden Exp $ # # Please try to keep this up2date. Please clean up # after yourself. # REACTOS +TARGET_BASE_LIB_ACLEDIT =0x71b70000 TARGET_BASE_LIB_ADVAPI32 =0x77dc0000 TARGET_BASE_LIB_CABINET =0x75120000 TARGET_BASE_LIB_CARDS =0x701a0000 diff --git a/reactos/include/acledit.h b/reactos/include/acledit.h new file mode 100644 index 00000000000..c7269f42ecc --- /dev/null +++ b/reactos/include/acledit.h @@ -0,0 +1,136 @@ +/* + * acledit.h + * + * Access Control List Editor definitions + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef __ACLEDIT_H +#define __ACLEDIT_H + +#include + +typedef struct _ACL_HELP_CONTROL +{ + LPWSTR lpHelpFile; + DWORD dwMainDialogTopic; + DWORD dwACLEditorDialogTopic; + DWORD Reserved1; + DWORD dwAddEntryDialogTopic; + DWORD Reserved2; + DWORD Reserved3; + DWORD dwAccountDialogTopic; +} ACL_HELP_CONTROL, *PACL_HELP_CONTROL; + +typedef struct _ACL_DLG_CONTROL +{ + UCHAR ucVersion; + BOOL bIsContainer; + BOOL bAllowNewObject; + BOOL bMapSpecificToGeneric; + LPDWORD lpdwGenericAccessMap; + LPDWORD lpdwGenericMappingNewObjects; + LPWSTR lpDialogTitle; + PACL_HELP_CONTROL pHelpInfo; + LPWSTR lpSubReplaceTitle; + LPWSTR lpSubReplaceObjectsTitle; + LPWSTR lpSubReplaceConfirmation; + LPWSTR lpSpecialAccess; + LPWSTR lpSpecialNewAccess; +} ACL_DLG_CONTROL, *PACL_DLG_CONTROL; + +typedef struct _ACL_EDIT_ENTRY{ + DWORD dwType; + DWORD dwAccessMask; + DWORD dwAccessMask1; + LPWSTR lpName; +} ACL_EDIT_ENTRY, *PACL_EDIT_ENTRY; + +typedef struct _ACL_EDIT_CONTROL +{ + DWORD dwNumberOfEntries; + PACL_EDIT_ENTRY pEntries; + LPWSTR lpDefaultPermissionName; +} ACL_EDIT_CONTROL, *PACL_EDIT_CONTROL; + +typedef DWORD (CALLBACK *PACL_CHANGE)(HWND hWnd, + HINSTANCE hInstance, + PVOID pCallbackContext, + PSECURITY_DESCRIPTOR pNewSD, + PSECURITY_DESCRIPTOR pNewObjectSD, + BOOL bApplyToSubContainers, + BOOL bApplyToSubObjects, + LPDWORD lpdwChangeContextStatus); + +DWORD WINAPI +EditAuditInfo(DWORD Unknown); + +DWORD WINAPI +EditOwnerInfo(DWORD Unknown); + +DWORD WINAPI +EditPermissionInfo(DWORD Unknown); + +LONG WINAPI +FMExtensionProcW(HWND hWnd, + WORD wEvent, + LONG lParam); + +DWORD WINAPI +SedDiscretionaryAclEditor(HWND hWndOwner, + HINSTANCE hInstance, + LPCWSTR lpMachineName, + PACL_DLG_CONTROL pAclDlgControl, + PACL_EDIT_CONTROL pAclEditControl, + LPCWSTR lpObjectName, + PACL_CHANGE pChangeCallback, + PVOID pChangeCallbackContext, + PSECURITY_DESCRIPTOR pObjectSecurity, + BOOL bNoReadPermission, + BOOL bReadOnly, + LPDWORD lpdwChangeContextStatus, + DWORD Reserved); + +DWORD WINAPI +SedTakeOwnership(HWND hWndOwner, + HINSTANCE hInstance, + LPCWSTR lpMachineName, + LPCWSTR lpObjectType, + LPCWSTR lpObjectName, + DWORD dwObjectCount, + PACL_CHANGE pChangeCallback, + PVOID pChangeCallbackContext, + PSECURITY_DESCRIPTOR pObjectSecurity, + BOOL NoReadPermission, + BOOL NoOwnerChange, + LPDWORD lpdwChangeContextStatus, + PACL_HELP_CONTROL pHelpInfo, + DWORD Reserved); + +DWORD WINAPI +SedSystemAclEditor(HWND hWndOwner, + HINSTANCE hInstance, + LPCWSTR lpMachineName, + PACL_DLG_CONTROL pAclDlgControl, + PACL_EDIT_CONTROL pAclEditControl, + LPCWSTR lpObjectName, + PACL_CHANGE pChangeCallback, + PVOID pChangeCallbackContext, + PSECURITY_DESCRIPTOR pObjectSecurity, + BOOL bNoReadPermission, + LPDWORD lpdwChangeContextStatus, + DWORD Reserved); + +#endif /* __ACLEDIT_H */ + +/* EOF */ diff --git a/reactos/lib/acledit/.cvsignore b/reactos/lib/acledit/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/acledit/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp diff --git a/reactos/lib/acledit/Makefile b/reactos/lib/acledit/Makefile new file mode 100644 index 00000000000..406425c47e1 --- /dev/null +++ b/reactos/lib/acledit/Makefile @@ -0,0 +1,45 @@ +# $Id: Makefile,v 1.1 2004/07/09 20:18:49 weiden Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = acledit + +TARGET_INSTALLDIR = system32 + +TARGET_BASE = $(TARGET_BASE_LIB_ACLEDIT) + +TARGET_CFLAGS = \ + -I./include \ + -DUNICODE \ + -D_UNICODE \ + -D__REACTOS__ \ + -Wall \ + -Werror \ + -fno-builtin + +TARGET_LFLAGS = -nostartfiles -nostdlib + +TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a user32.a + +TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = acledit.o stubs.o + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +include $(TOOLS_PATH)/depend.mk + +%/TAGS: + etags -o $(@D)/TAGS $(@D)/\*.c + +etags: ./TAGS diff --git a/reactos/lib/acledit/acledit.c b/reactos/lib/acledit/acledit.c new file mode 100644 index 00000000000..02234d5d8aa --- /dev/null +++ b/reactos/lib/acledit/acledit.c @@ -0,0 +1,60 @@ +/* + * ReactOS kernel + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: acledit.c,v 1.1 2004/07/09 20:18:49 weiden Exp $ + * + * PROJECT: ReactOS Access Control List Editor + * FILE: lib/acledit/acledit.c + * PURPOSE: Access Control List Editor + * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * + * Based on guess work and on this nice article: + * http://www.sysinternals.com/ntw2k/info/acledit.shtml + * + * UPDATE HISTORY: + * 07/09/2004 Created + */ +#include +#include +#include "acleditint.h" +#include "resource.h" + +extern HINSTANCE hDllInstance; + + +BOOL STDCALL +DllMain( + HINSTANCE hinstDLL, + DWORD dwReason, + LPVOID lpvReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + hDllInstance = hinstDLL; + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/reactos/lib/acledit/acledit.def b/reactos/lib/acledit/acledit.def new file mode 100644 index 00000000000..7fc5e70c99a --- /dev/null +++ b/reactos/lib/acledit/acledit.def @@ -0,0 +1,12 @@ +LIBRARY acledit.dll + +EXPORTS +EditAuditInfo@4 +EditOwnerInfo@4 +EditPermissionInfo@4 +FMExtensionProcW@12 +SedDiscretionaryAclEditor@52 +SedSystemAclEditor@48 +SedTakeOwnership@56 + +; EOF diff --git a/reactos/lib/acledit/acledit.edf b/reactos/lib/acledit/acledit.edf new file mode 100644 index 00000000000..63aa6816eaf --- /dev/null +++ b/reactos/lib/acledit/acledit.edf @@ -0,0 +1,12 @@ +LIBRARY acledit.dll + +EXPORTS +EditAuditInfo=EditAuditInfo@4 +EditOwnerInfo=EditOwnerInfo@4 +EditPermissionInfo=EditPermissionInfo@4 +FMExtensionProcW=FMExtensionProcW@12 +SedDiscretionaryAclEditor=SedDiscretionaryAclEditor@52 +SedSystemAclEditor=SedSystemAclEditor@48 +SedTakeOwnership=SedTakeOwnership@56 + +; EOF diff --git a/reactos/lib/acledit/acledit.rc b/reactos/lib/acledit/acledit.rc new file mode 100644 index 00000000000..533618c97e5 --- /dev/null +++ b/reactos/lib/acledit/acledit.rc @@ -0,0 +1,40 @@ +#include +#include +#include "resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +VS_VERSION_INFO VERSIONINFO + FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD + PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", RES_STR_COMPANY_NAME + VALUE "FileDescription", "ReactOS Access Control Editor\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "acledit\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "acledit.dll\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + diff --git a/reactos/lib/acledit/acleditint.h b/reactos/lib/acledit/acleditint.h new file mode 100644 index 00000000000..62c3b5febb9 --- /dev/null +++ b/reactos/lib/acledit/acleditint.h @@ -0,0 +1,8 @@ +#ifndef __ACLEDITINT_H +#define __ACLEDITINT_H + +HINSTANCE hDllInstance; + +#endif /* __ACLEDITINT_H */ + +/* EOF */ diff --git a/reactos/lib/acledit/resource.h b/reactos/lib/acledit/resource.h new file mode 100644 index 00000000000..89c5d02b7cf --- /dev/null +++ b/reactos/lib/acledit/resource.h @@ -0,0 +1,8 @@ +#ifndef __DEVMGR_RESOURCE_H +#define __DEVMGR_RESOURCE_H + +#define IDI_DEVMGR 100 + +#endif /* __DEVMGR_RESOURCE_H */ + +/* EOF */ diff --git a/reactos/lib/acledit/stubs.c b/reactos/lib/acledit/stubs.c new file mode 100644 index 00000000000..9a40e037624 --- /dev/null +++ b/reactos/lib/acledit/stubs.c @@ -0,0 +1,118 @@ +/* $Id: stubs.c,v 1.1 2004/07/09 20:18:49 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Access Control List Editor + * FILE: lib/acledit/stubs.c + * PURPOSE: acledit.dll stubs + * PROGRAMMER: Thomas Weidenmueller + * NOTES: If you implement a function, remove it from this file + * + * Based on guess work and on this nice article: + * http://www.sysinternals.com/ntw2k/info/acledit.shtml + * + * UPDATE HISTORY: + * 07/09/2004 Created + */ +#include +#include +#include "acleditint.h" + +#define UNIMPLEMENTED \ + DbgPrint("ACLEDIT: %s at %s:%d is UNIMPLEMENTED!\n",__FUNCTION__,__FILE__,__LINE__) + + +DWORD +WINAPI +EditAuditInfo(DWORD Unknown) +{ + UNIMPLEMENTED; + return 0; +} + +DWORD +WINAPI +EditOwnerInfo(DWORD Unknown) +{ + UNIMPLEMENTED; + return 0; +} + +DWORD +WINAPI +EditPermissionInfo(DWORD Unknown) +{ + UNIMPLEMENTED; + return 0; +} + +LONG +WINAPI +FMExtensionProcW(HWND hWnd, + WORD wEvent, + LONG lParam) +{ + UNIMPLEMENTED; + return 0; +} + +DWORD +WINAPI +SedDiscretionaryAclEditor(HWND hWndOwner, + HINSTANCE hInstance, + LPCWSTR lpMachineName, + PACL_DLG_CONTROL pAclDlgControl, + PACL_EDIT_CONTROL pAclEditControl, + LPCWSTR lpObjectName, + PACL_CHANGE pChangeCallback, + PVOID pChangeCallbackContext, + PSECURITY_DESCRIPTOR pObjectSecurity, + BOOL bNoReadPermission, + BOOL bReadOnly, + LPDWORD lpdwChangeContextStatus, + DWORD Reserved) +{ + UNIMPLEMENTED; + return 0; +} + +DWORD +WINAPI +SedTakeOwnership(HWND hWndOwner, + HINSTANCE hInstance, + LPCWSTR lpMachineName, + LPCWSTR lpObjectType, + LPCWSTR lpObjectName, + DWORD dwObjectCount, + PACL_CHANGE pChangeCallback, + PVOID pChangeCallbackContext, + PSECURITY_DESCRIPTOR pObjectSecurity, + BOOL NoReadPermission, + BOOL NoOwnerChange, + LPDWORD lpdwChangeContextStatus, + PACL_HELP_CONTROL pHelpInfo, + DWORD Reserved) +{ + UNIMPLEMENTED; + return 0; +} + +DWORD +WINAPI +SedSystemAclEditor(HWND hWndOwner, + HINSTANCE hInstance, + LPCWSTR lpMachineName, + PACL_DLG_CONTROL pAclDlgControl, + PACL_EDIT_CONTROL pAclEditControl, + LPCWSTR lpObjectName, + PACL_CHANGE pChangeCallback, + PVOID pChangeCallbackContext, + PSECURITY_DESCRIPTOR pObjectSecurity, + BOOL bNoReadPermission, + LPDWORD lpdwChangeContextStatus, + DWORD Reserved) +{ + UNIMPLEMENTED; + return 0; +} + +/* EOF */ From fe2b1d6967fc3bd56464c944b5699c79992ae513 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 9 Jul 2004 20:28:20 +0000 Subject: [PATCH 239/356] - Implementation of [NtGdi]GetTextFace[W] and [NtGdi]GetFontData[W]. - Print a message for unimplemented functions in GDI32.dll. svn path=/trunk/; revision=10058 --- reactos/iface/addsys/w32ksvc.db | 1 + reactos/include/win32k/font.h | 3 +- reactos/lib/gdi32/misc/stubs.c | 341 +++++++++++++++++++++++++-- reactos/lib/gdi32/misc/stubsa.c | 20 +- reactos/lib/gdi32/misc/stubsw.c | 24 +- reactos/lib/gdi32/objects/font.c | 19 +- reactos/subsys/win32k/objects/text.c | 89 ++++++- 7 files changed, 462 insertions(+), 35 deletions(-) diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index 4df76b7ee00..85b0b458beb 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -123,6 +123,7 @@ NtGdiGetEnhMetaFileDescription 3 NtGdiGetEnhMetaFileHeader 3 NtGdiGetEnhMetaFilePaletteEntries 3 NtGdiGetEnhMetaFilePixelFormat 3 +NtGdiGetFontData 5 NtGdiGetFontFamilyInfo 4 NtGdiGetFontLanguageInfo 1 #NtGdiGetFontResourceInfo ? diff --git a/reactos/include/win32k/font.h b/reactos/include/win32k/font.h index bea3c9f3ac6..c031bd427b7 100644 --- a/reactos/include/win32k/font.h +++ b/reactos/include/win32k/font.h @@ -1,4 +1,4 @@ -/* $Id: font.h,v 1.1 2004/03/23 00:18:54 gvg Exp $ +/* $Id: font.h,v 1.2 2004/07/09 20:28:19 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -22,5 +22,6 @@ typedef struct tagFONTFAMILYINFO int STDCALL NtGdiGetFontFamilyInfo(HDC Dc, LPLOGFONTW LogFont, PFONTFAMILYINFO Info, DWORD Size); BOOL STDCALL NtGdiTranslateCharsetInfo(PDWORD Src, LPCHARSETINFO CSI, DWORD Flags); +DWORD STDCALL NtGdiGetFontData(HDC,DWORD,DWORD,LPVOID,DWORD); #endif /* WIN32K_FONT_H_INCLUDED */ diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 5b163624222..5f780ad4d0e 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.62 2004/05/18 13:57:41 weiden Exp $ +/* $Id: stubs.c,v 1.63 2004/07/09 20:28:20 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -28,6 +28,8 @@ typedef DWORD CHWIDTHINFO; typedef CHWIDTHINFO *PCHWIDTHINFO; #endif +#define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try again later.\n", __FUNCTION__); + /* * @unimplemented */ @@ -40,6 +42,7 @@ AnimatePalette( CONST PALETTEENTRY *a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -55,6 +58,7 @@ CancelDC( HDC a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -77,6 +81,7 @@ Chord( int a8 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -91,6 +96,7 @@ CloseMetaFile( HDC a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -105,6 +111,7 @@ CreateDIBPatternBrush( UINT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -119,6 +126,7 @@ DeleteMetaFile( HMETAFILE a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -136,6 +144,7 @@ DrawEscape( LPCSTR a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -153,6 +162,7 @@ EnumObjects( LPARAM a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -171,6 +181,7 @@ Escape( LPVOID a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -187,6 +198,7 @@ ExtCreateRegion( CONST RGNDATA * a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -202,6 +214,7 @@ GetAspectRatioFilterEx( LPSIZE a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -218,6 +231,7 @@ GetBoundsRect( UINT a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -233,24 +247,7 @@ GetMetaRgn( HRGN a1 ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/* - * @unimplemented - */ -DWORD -STDCALL -GetFontData( - HDC a0, - DWORD a1, - DWORD a2, - LPVOID a3, - DWORD a4 - ) -{ + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -267,6 +264,7 @@ GetMetaFileBitsEx( LPVOID a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -282,6 +280,7 @@ GetRasterizerCaps( UINT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -295,6 +294,7 @@ GetSystemPaletteUse( HDC hDc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -309,6 +309,7 @@ GetTextCharacterExtra( HDC hDc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -323,6 +324,7 @@ GetTextCharset( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -339,6 +341,7 @@ GetTextCharsetInfo( DWORD dwFlags ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -353,6 +356,7 @@ GetFontLanguageInfo( HDC hDc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -368,6 +372,7 @@ PlayMetaFile( HMETAFILE a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -383,6 +388,7 @@ ResizePalette( UINT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -397,6 +403,7 @@ SetMetaRgn( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -413,6 +420,7 @@ SetBoundsRect( UINT a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -428,6 +436,7 @@ SetMapperFlags( DWORD a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -443,6 +452,7 @@ SetMetaFileBitsEx( CONST BYTE *a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -458,6 +468,7 @@ SetSystemPaletteUse( UINT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -473,6 +484,7 @@ SetTextCharacterExtra( int a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -489,6 +501,7 @@ SetTextJustification( int a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -503,6 +516,7 @@ UpdateColors( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -520,6 +534,7 @@ PlayMetaFileRecord( UINT a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -537,6 +552,7 @@ EnumMetaFile( LPARAM a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -551,6 +567,7 @@ CloseEnhMetaFile( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -565,6 +582,7 @@ DeleteEnhMetaFile( HENHMETAFILE a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -583,6 +601,7 @@ EnumEnhMetaFile( CONST RECT *a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -599,6 +618,7 @@ GetEnhMetaFileBits( LPBYTE a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -615,6 +635,7 @@ GetEnhMetaFileHeader( LPENHMETAHEADER a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -631,6 +652,7 @@ GetEnhMetaFilePaletteEntries( LPPALETTEENTRY a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -649,6 +671,7 @@ GetWinMetaFileBits( HDC a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -665,6 +688,7 @@ PlayEnhMetaFile( CONST RECT *a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -682,6 +706,7 @@ PlayEnhMetaFileRecord( UINT a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -697,6 +722,7 @@ SetEnhMetaFileBits( CONST BYTE *a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -713,6 +739,7 @@ SetWinMetaFileBits( HDC a2, CONST METAFILEPICT *a3) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -729,6 +756,7 @@ GdiComment( CONST BYTE *a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -748,6 +776,7 @@ AngleArc( FLOAT a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -763,6 +792,7 @@ SetColorAdjustment( CONST COLORADJUSTMENT *a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -778,6 +808,7 @@ GetColorAdjustment( LPCOLORADJUSTMENT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -792,6 +823,7 @@ EndDoc( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -806,6 +838,7 @@ StartPage( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -820,6 +853,7 @@ EndPage( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -834,6 +868,7 @@ AbortDoc( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -849,6 +884,7 @@ SetAbortProc( ABORTPROC a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -863,6 +899,7 @@ AbortPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -877,6 +914,7 @@ BeginPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -891,6 +929,7 @@ CloseFigure( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -905,6 +944,7 @@ EndPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -919,6 +959,7 @@ FillPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -933,6 +974,7 @@ FlattenPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -950,6 +992,7 @@ GetPath( int a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -964,6 +1007,7 @@ PathToRegion( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -981,6 +1025,7 @@ PolyDraw( int a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -996,6 +1041,7 @@ SelectClipPath( int a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1012,6 +1058,7 @@ SetMiterLimit( PFLOAT a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1026,6 +1073,7 @@ StrokeAndFillPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1040,6 +1088,7 @@ StrokePath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1054,6 +1103,7 @@ WidenPath( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1072,6 +1122,7 @@ ExtCreatePen( CONST DWORD *a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1087,6 +1138,7 @@ GetMiterLimit( PFLOAT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1105,6 +1157,7 @@ ScaleViewportExtEx( LPSIZE a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1124,6 +1177,7 @@ ScaleWindowExtEx( LPSIZE a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1138,6 +1192,7 @@ UnrealizeObject( HGDIOBJ a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1150,8 +1205,12 @@ BOOL STDCALL GdiFlush() { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + /* + * Although GdiFlush is unimplemented, it's safe to return + * TRUE, because we don't have GDI engine surface caching + * implemented yet. + */ + return TRUE; } @@ -1164,6 +1223,7 @@ GdiSetBatchLimit( DWORD a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1176,6 +1236,7 @@ DWORD STDCALL GdiGetBatchLimit() { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1191,6 +1252,7 @@ SetICMMode( int a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1208,6 +1270,7 @@ CheckColorsInGamut( DWORD a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1222,6 +1285,7 @@ GetColorSpace( HDC hDc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1237,6 +1301,7 @@ SetColorSpace( HCOLORSPACE a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1251,6 +1316,7 @@ DeleteColorSpace( HCOLORSPACE a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1266,6 +1332,7 @@ GetDeviceGammaRamp( LPVOID a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1281,6 +1348,7 @@ SetDeviceGammaRamp( LPVOID a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1297,6 +1365,7 @@ ColorMatchToTarget( DWORD a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1313,6 +1382,7 @@ wglCopyContext( UINT a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1327,6 +1397,7 @@ wglCreateContext( HDC hDc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1342,6 +1413,7 @@ wglCreateLayerContext( int a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1356,6 +1428,7 @@ wglDeleteContext( HGLRC a ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1368,6 +1441,7 @@ HGLRC STDCALL wglGetCurrentContext(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1380,6 +1454,7 @@ HDC STDCALL wglGetCurrentDC(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1394,6 +1469,7 @@ wglGetProcAddress( LPCSTR a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1409,6 +1485,7 @@ wglMakeCurrent( HGLRC a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1424,6 +1501,7 @@ wglShareLists( HGLRC a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1442,6 +1520,7 @@ wglDescribeLayerPlane( LPLAYERPLANEDESCRIPTOR a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1460,6 +1539,7 @@ wglSetLayerPaletteEntries( CONST COLORREF *a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1478,6 +1558,7 @@ wglGetLayerPaletteEntries( COLORREF *a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1494,6 +1575,7 @@ wglRealizeLayerPalette( BOOL a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1509,6 +1591,7 @@ wglSwapLayerBuffers( UINT a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -1534,6 +1617,7 @@ GdiPlayDCScript( DWORD a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1552,6 +1636,7 @@ GdiPlayJournal( DWORD a4 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1572,6 +1657,7 @@ GdiPlayScript( DWORD a6 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1592,6 +1678,7 @@ GetGlyphOutlineWow( DWORD a6 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1608,6 +1695,7 @@ GetRandomRgn( INT a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1623,6 +1711,7 @@ SelectBrushLocal( DWORD a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1638,6 +1727,7 @@ SelectFontLocal( DWORD a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1652,6 +1742,7 @@ SetFontEnumeration( DWORD a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1667,6 +1758,7 @@ SetRelAbs( DWORD a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1686,6 +1778,7 @@ gdiPlaySpoolStream( DWORD a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1703,6 +1796,7 @@ GetFontResourceInfo( DWORD a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1719,6 +1813,7 @@ AddFontMemResourceEx( DWORD *pcFonts ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1733,6 +1828,7 @@ AddFontResourceTracking( int unknown ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1744,6 +1840,7 @@ BOOL STDCALL AnyLinkedFonts(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1755,6 +1852,7 @@ HBITMAP STDCALL ClearBitmapAttributes(HBITMAP hbm, DWORD dwFlags) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1766,6 +1864,7 @@ HBRUSH STDCALL ClearBrushAttributes(HBRUSH hbm, DWORD dwFlags) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1777,6 +1876,7 @@ BOOL STDCALL ColorCorrectPalette(HDC hDC,HPALETTE hPalette,DWORD dwFirstEntry,DWORD dwNumOfEntries) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1788,6 +1888,7 @@ BOOL STDCALL EnableEUDC(BOOL enable) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1799,6 +1900,7 @@ int STDCALL EndFormPage(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1810,6 +1912,7 @@ BOOL STDCALL EudcLoadLinkW(LPCWSTR pBaseFaceName,LPCWSTR pEudcFontPath,INT iPriority,INT iFontLinkType) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1821,6 +1924,7 @@ BOOL STDCALL EudcUnloadLinkW(LPCWSTR pBaseFaceName,LPCWSTR pEudcFontPath) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1832,6 +1936,7 @@ BOOL STDCALL FontIsLinked(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1843,6 +1948,7 @@ int STDCALL GdiAddFontResourceW(LPCWSTR filename,FLONG f,DESIGNVECTOR *pdv) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1854,6 +1960,7 @@ DWORD STDCALL GdiAddGlsBounds(HDC hdc,LPRECT prc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1865,6 +1972,7 @@ BOOL STDCALL GdiAlphaBlend(HDC hdcDst,LONG DstX,LONG DstY,LONG DstCx,LONG DstCy,HDC hdcSrc,LONG SrcX,LONG SrcY,LONG SrcCx,LONG SrcCy,BLENDFUNCTION BlendFunction) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1876,6 +1984,7 @@ BOOL STDCALL GdiArtificialDecrementDriver(LPWSTR pDriverName,BOOL unknown) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1887,6 +1996,7 @@ BOOL STDCALL GdiCleanCacheDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1898,6 +2008,7 @@ BOOL STDCALL GdiConsoleTextOut(HDC hdc, POLYTEXTW *lpto,UINT nStrings, RECTL *prclBounds) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1909,6 +2020,7 @@ HDC STDCALL GdiConvertAndCheckDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1920,6 +2032,7 @@ HBITMAP STDCALL GdiConvertBitmap(HBITMAP hbm) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1931,6 +2044,7 @@ HBRUSH STDCALL GdiConvertBrush(HBRUSH hbr) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1942,6 +2056,7 @@ HDC STDCALL GdiConvertDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1953,6 +2068,7 @@ HFONT STDCALL GdiConvertFont(HFONT hfont) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1964,6 +2080,7 @@ HPALETTE STDCALL GdiConvertPalette(HPALETTE hpal) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1975,6 +2092,7 @@ HRGN STDCALL GdiConvertRegion(HRGN hregion) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1986,6 +2104,7 @@ HENHMETAFILE STDCALL GdiConvertEnhMetaFile(HENHMETAFILE hmf) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -1997,6 +2116,7 @@ BOOL STDCALL GdiDeleteLocalDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2008,6 +2128,7 @@ int STDCALL GdiDescribePixelFormat(HDC hdc,int ipfd,UINT cjpfd,PPIXELFORMATDESCRIPTOR ppfd) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2019,6 +2140,7 @@ BOOL STDCALL GdiDrawStream(HDC dc, ULONG l, VOID *v) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2030,6 +2152,7 @@ HGDIOBJ STDCALL GdiFixUpHandle(HGDIOBJ hobj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2041,6 +2164,7 @@ DWORD STDCALL GdiGetCodePage(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2052,6 +2176,7 @@ HBRUSH STDCALL GdiGetLocalBrush(HBRUSH hbr) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2063,6 +2188,7 @@ HDC STDCALL GdiGetLocalDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2074,6 +2200,7 @@ HFONT STDCALL GdiGetLocalFont(HFONT hfont) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2085,6 +2212,7 @@ BOOL STDCALL GdiIsMetaFileDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2096,6 +2224,7 @@ BOOL STDCALL GdiIsMetaPrintDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2107,6 +2236,7 @@ BOOL STDCALL GdiIsPlayMetafileDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2118,6 +2248,7 @@ BOOL STDCALL GdiReleaseDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2129,6 +2260,7 @@ BOOL STDCALL GdiReleaseLocalDC(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2140,6 +2272,7 @@ BOOL STDCALL GdiSetAttrs(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2151,6 +2284,7 @@ VOID STDCALL GdiSetLastError(DWORD dwErrCode) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -2161,6 +2295,7 @@ BOOL STDCALL GdiSetPixelFormat(HDC hdc,int ipfd) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2172,6 +2307,7 @@ BOOL STDCALL GdiValidateHandle(HGDIOBJ hobj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2183,6 +2319,7 @@ BOOL STDCALL GdiSwapBuffers(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2194,6 +2331,7 @@ VOID STDCALL GdiSetServerAttr(HDC hdc,DWORD attr) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -2204,6 +2342,7 @@ DWORD STDCALL GetBitmapAttributes(HBITMAP hbm) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2215,6 +2354,7 @@ DWORD STDCALL GetBrushAttributes(HBRUSH hbr) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2232,6 +2372,7 @@ GetCharABCWidthsI( LPABC lpabc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2249,6 +2390,7 @@ GetCharWidthI( LPINT lpBuffer ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2263,6 +2405,7 @@ GetFontUnicodeRanges( LPGLYPHSET lpgs ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2274,6 +2417,7 @@ ULONG STDCALL GetEUDCTimeStamp(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2285,6 +2429,7 @@ DWORD STDCALL GetEUDCTimeStampExW(LPCWSTR str) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2296,6 +2441,7 @@ ULONG STDCALL GetFontAssocStatus(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2307,6 +2453,7 @@ HFONT STDCALL GetHFONT(HDC dc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2320,6 +2467,7 @@ GetLayout( HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2331,6 +2479,7 @@ BOOL STDCALL GetTextExtentExPointWPri(HDC hdc,LPWSTR lpwsz,ULONG cwc,ULONG dxMax,ULONG *pcCh,PULONG pdxOut,LPSIZE psize) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2342,6 +2491,7 @@ int STDCALL GetTextFaceAliasW(HDC hdc,int cChar,LPWSTR pszOut) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2353,6 +2503,7 @@ BOOL STDCALL GetTransform(HDC hdc, DWORD iXform, LPXFORM pxf) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2364,6 +2515,7 @@ LONG STDCALL HT_Get8BPPFormatPalette(LPPALETTEENTRY pPaletteEntry, USHORT RedGamma,USHORT GreenGamma, USHORT BlueGamma) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2375,6 +2527,7 @@ LONG STDCALL HT_Get8BPPMaskPalette(LPPALETTEENTRY pPaletteEntry, BOOL Use8BPPMaskPal,BYTE CMYMask, USHORT RedGamma, USHORT GreenGamma, USHORT BlueGamma) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2386,6 +2539,7 @@ BOOL STDCALL MirrorRgn(HWND hwnd,HRGN hrgn) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2397,6 +2551,7 @@ int STDCALL NamedEscape(HDC hdc,PWCHAR pDriver,int nDriver,int iEsc,int cjIn,LPSTR pjIn,int cjOut,LPSTR pjOut) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2408,6 +2563,7 @@ DWORD STDCALL QueryFontAssocStatus(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2421,6 +2577,7 @@ RemoveFontMemResourceEx( HANDLE fh ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2436,6 +2593,7 @@ RemoveFontResourceExA( PVOID pdv ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2451,6 +2609,7 @@ RemoveFontResourceExW( PVOID pdv ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2462,6 +2621,7 @@ int STDCALL RemoveFontResourceTracking(LPCSTR lpString,int unknown) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2473,6 +2633,7 @@ HBITMAP STDCALL SetBitmapAttributes(HBITMAP hbm, DWORD dwFlags) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2484,6 +2645,7 @@ HBRUSH STDCALL SetBrushAttributes(HBRUSH hbm, DWORD dwFlags) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2498,6 +2660,7 @@ SetLayout( DWORD dwLayout ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2509,6 +2672,7 @@ DWORD STDCALL SetLayoutWidth(HDC hdc,LONG wox,DWORD dwLayout) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2520,6 +2684,7 @@ BOOL STDCALL SetMagicColors(HDC hdc,PALETTEENTRY peMagic,ULONG Index) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2531,6 +2696,7 @@ BOOL STDCALL SetVirtualResolution(HDC hdc, int cxVirtualDevicePixel,int cyVirtualDevicePixel,int cxVirtualDeviceMm, int cyVirtualDeviceMm) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2542,6 +2708,7 @@ int STDCALL StartFormPage(HDC hdc) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2553,6 +2720,7 @@ VOID STDCALL UnloadNetworkFonts(DWORD unknown) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -2563,6 +2731,7 @@ BOOL STDCALL bInitSystemAndFontsDirectoriesW(LPWSTR *SystemDir,LPWSTR *FontsDir) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2574,6 +2743,7 @@ BOOL STDCALL bMakePathNameW(LPWSTR lpBuffer,LPCWSTR lpFileName,LPWSTR *lpFilePart,DWORD unknown) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2585,6 +2755,7 @@ HFONT STDCALL CreateFontIndirectExA(const ENUMLOGFONTEXDVA *elfexd) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2602,6 +2773,7 @@ GetGlyphIndicesA( DWORD fl ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2613,6 +2785,7 @@ UINT STDCALL GetStringBitmapA(HDC hdc,LPSTR psz,BOOL unknown,UINT cj,BYTE *lpSB) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2632,6 +2805,7 @@ GetTextExtentExPointI( LPSIZE lpSize ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2643,6 +2817,7 @@ HFONT STDCALL CreateFontIndirectExW(const ENUMLOGFONTEXDVW *elfexd) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2660,6 +2835,7 @@ GetGlyphIndicesW( DWORD fl ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2671,6 +2847,7 @@ UINT STDCALL GetStringBitmapW(HDC hdc,LPWSTR pwsz,BOOL unknown,UINT cj,BYTE *lpSB) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2687,6 +2864,7 @@ GetTextExtentPointI( LPSIZE lpSize ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2700,6 +2878,7 @@ GdiFullscreenControl(FULLSCREENCONTROL FullscreenCommand,PVOID FullscreenInput, DWORD FullscreenInputLength,PVOID FullscreenOutput, PULONG FullscreenOutputLength) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2711,6 +2890,7 @@ INT STDCALL GdiQueryFonts(PUNIVERSAL_FONT_ID pufiFontList,ULONG nBufferSize,PLARGE_INTEGER pTimeStamp ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2722,6 +2902,7 @@ BOOL STDCALL GdiRealizationInfo(HDC hdc, PREALIZATION_INFO pri) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2733,6 +2914,7 @@ BOOL STDCALL GetCharWidthInfo(HDC hdc,PCHWIDTHINFO pChWidthInfo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2744,6 +2926,7 @@ BOOL STDCALL GetETM(HDC hdc,EXTTEXTMETRIC *petm) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2755,6 +2938,7 @@ BOOL STDCALL GdiAddGlsRecord(HDC hdc,DWORD unknown1,LPCSTR unknown2,LPRECT unknown3) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2766,6 +2950,7 @@ HANDLE STDCALL GdiConvertMetaFilePict(HGLOBAL hMem) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2777,6 +2962,7 @@ DEVMODEW * STDCALL GdiConvertToDevmodeW(DEVMODEA *dm) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2788,6 +2974,7 @@ HENHMETAFILE STDCALL GdiCreateLocalEnhMetaFile(HENHMETAFILE hmo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2799,6 +2986,7 @@ METAFILEPICT * STDCALL GdiCreateLocalMetaFilePict(HENHMETAFILE hmo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2810,6 +2998,7 @@ DWORD STDCALL GdiGetCharDimensions(HDC hdc,LPTEXTMETRICW lptm,BOOL unk) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2821,6 +3010,7 @@ PSHAREDHANDLETABLE STDCALL GdiQueryTable(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2835,6 +3025,7 @@ GdiGetSpoolFileHandle( LPDEVMODEW pDevmode, LPWSTR pwszDocName) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2847,6 +3038,7 @@ STDCALL GdiDeleteSpoolFileHandle( HANDLE SpoolFileHandle) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2859,6 +3051,7 @@ STDCALL GdiGetPageCount( HANDLE SpoolFileHandle) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2871,6 +3064,7 @@ STDCALL GdiGetDC( HANDLE SpoolFileHandle) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2885,6 +3079,7 @@ GdiGetPageHandle( DWORD Page, LPDWORD pdwPageType) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2898,6 +3093,7 @@ GdiStartDocEMF( HANDLE SpoolFileHandle, DOCINFOW *pDocInfo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2910,6 +3106,7 @@ STDCALL GdiStartPageEMF( HANDLE SpoolFileHandle) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2926,6 +3123,7 @@ GdiPlayPageEMF( RECT *prectBorder, RECT *prectClip) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2939,6 +3137,7 @@ GdiEndPageEMF( HANDLE SpoolFileHandle, DWORD dwOptimization) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2951,6 +3150,7 @@ STDCALL GdiEndDocEMF( HANDLE SpoolFileHandle) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2966,6 +3166,7 @@ GdiGetDevmodeForPage( PDEVMODEW *pCurrDM, PDEVMODEW *pLastDM) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2979,6 +3180,7 @@ GdiResetDCEMF( HANDLE SpoolFileHandle, PDEVMODEW pCurrDM) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -2989,6 +3191,7 @@ GdiResetDCEMF( HANDLE STDCALL BRUSHOBJ_hGetColorTransform(BRUSHOBJ *pbo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3000,6 +3203,7 @@ PVOID STDCALL BRUSHOBJ_pvAllocRbrush(IN BRUSHOBJ *BrushObj, IN ULONG ObjSize) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3010,6 +3214,7 @@ BRUSHOBJ_pvAllocRbrush(IN BRUSHOBJ *BrushObj, PVOID STDCALL BRUSHOBJ_pvGetRbrush(IN BRUSHOBJ *BrushObj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3020,6 +3225,7 @@ BRUSHOBJ_pvGetRbrush(IN BRUSHOBJ *BrushObj) ULONG STDCALL BRUSHOBJ_ulGetBrushColor(BRUSHOBJ *pbo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3032,6 +3238,7 @@ CLIPOBJ_bEnum(IN CLIPOBJ *ClipObj, IN ULONG ObjSize, OUT ULONG *EnumRects) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3046,6 +3253,7 @@ CLIPOBJ_cEnumStart(IN CLIPOBJ *ClipObj, IN ULONG BuildOrder, IN ULONG MaxRects) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3056,6 +3264,7 @@ CLIPOBJ_cEnumStart(IN CLIPOBJ *ClipObj, PATHOBJ* STDCALL CLIPOBJ_ppoGetPath(CLIPOBJ *ClipObj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3067,6 +3276,7 @@ VOID STDCALL EngAcquireSemaphore ( IN HSEMAPHORE hsem ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3076,6 +3286,7 @@ EngAcquireSemaphore ( IN HSEMAPHORE hsem ) BOOL STDCALL EngAlphaBlend(SURFOBJ *psoDest,SURFOBJ *psoSrc,CLIPOBJ *pco,XLATEOBJ *pxlo,RECTL *prclDest,RECTL *prclSrc,BLENDOBJ *pBlendObj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3088,6 +3299,7 @@ EngAssociateSurface(IN HSURF Surface, IN HDEV Dev, IN ULONG Hooks) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3108,6 +3320,7 @@ EngBitBlt(SURFOBJ *Dest, POINTL *BrushOrigin, ROP4 rop4) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3118,6 +3331,7 @@ EngBitBlt(SURFOBJ *Dest, BOOL STDCALL EngCheckAbort(SURFOBJ *pso) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3128,6 +3342,7 @@ EngCheckAbort(SURFOBJ *pso) FD_GLYPHSET* STDCALL EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3143,6 +3358,7 @@ EngCopyBits(SURFOBJ *Dest, RECTL *DestRect, POINTL *SourcePoint) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3157,6 +3373,7 @@ EngCreateBitmap(IN SIZEL Size, IN ULONG Flags, IN PVOID Bits) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3167,6 +3384,7 @@ EngCreateBitmap(IN SIZEL Size, CLIPOBJ* STDCALL EngCreateClip(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3179,6 +3397,7 @@ EngCreateDeviceBitmap(IN DHSURF Surface, IN SIZEL Size, IN ULONG Format) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3191,6 +3410,7 @@ EngCreateDeviceSurface(IN DHSURF Surface, IN SIZEL Size, IN ULONG FormatVersion) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3206,6 +3426,7 @@ EngCreatePalette(IN ULONG Mode, IN ULONG Green, IN ULONG Blue) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3217,6 +3438,7 @@ HSEMAPHORE STDCALL EngCreateSemaphore ( VOID ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3227,6 +3449,7 @@ EngCreateSemaphore ( VOID ) VOID STDCALL EngDeleteClip(CLIPOBJ *ClipRegion) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3236,6 +3459,7 @@ EngDeleteClip(CLIPOBJ *ClipRegion) BOOL STDCALL EngDeletePalette(IN HPALETTE Palette) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3246,6 +3470,7 @@ EngDeletePalette(IN HPALETTE Palette) VOID STDCALL EngDeletePath(PATHOBJ *ppo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3256,6 +3481,7 @@ VOID STDCALL EngDeleteSemaphore ( IN HSEMAPHORE hsem ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3265,6 +3491,7 @@ EngDeleteSemaphore ( IN HSEMAPHORE hsem ) BOOL STDCALL EngDeleteSurface(IN HSURF Surface) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3277,6 +3504,7 @@ EngEraseSurface(SURFOBJ *Surface, RECTL *Rect, ULONG iColor) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3287,6 +3515,7 @@ EngEraseSurface(SURFOBJ *Surface, BOOL STDCALL EngFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,BRUSHOBJ *pbo,POINTL *pptlBrushOrg,MIX mix,FLONG flOptions) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3297,6 +3526,7 @@ EngFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,BRUSHOBJ *pbo,POINTL *pptlBru PVOID STDCALL EngFindResource(HANDLE h,int iName,int iType,PULONG pulSize) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3307,6 +3537,7 @@ EngFindResource(HANDLE h,int iName,int iType,PULONG pulSize) VOID STDCALL EngFreeModule(HANDLE h) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3317,6 +3548,7 @@ VOID STDCALL EngGetCurrentCodePage(OUT PUSHORT OemCodePage, OUT PUSHORT AnsiCodePage) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3326,6 +3558,7 @@ EngGetCurrentCodePage(OUT PUSHORT OemCodePage, LPWSTR STDCALL EngGetDriverName(HDEV hdev) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3336,6 +3569,7 @@ EngGetDriverName(HDEV hdev) LPWSTR STDCALL EngGetPrinterDataFileName(HDEV hdev) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3346,6 +3580,7 @@ EngGetPrinterDataFileName(HDEV hdev) BOOL STDCALL EngGradientFill(SURFOBJ *psoDest,CLIPOBJ *pco,XLATEOBJ *pxlo,TRIVERTEX *pVertex,ULONG nVertex,PVOID pMesh,ULONG nMesh,RECTL *prclExtents,POINTL *pptlDitherOrg,ULONG ulMode) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3364,6 +3599,7 @@ EngLineTo(SURFOBJ *Surface, RECTL *RectBounds, MIX mix) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3374,6 +3610,7 @@ EngLineTo(SURFOBJ *Surface, HANDLE STDCALL EngLoadModule(LPWSTR pwsz) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3384,6 +3621,7 @@ EngLoadModule(LPWSTR pwsz) SURFOBJ * STDCALL EngLockSurface(IN HSURF Surface) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3394,6 +3632,7 @@ EngLockSurface(IN HSURF Surface) BOOL STDCALL EngMarkBandingSurface(HSURF hsurf) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3408,6 +3647,7 @@ EngMultiByteToUnicodeN(OUT LPWSTR UnicodeString, IN PCHAR MultiByteString, IN ULONG BytesInMultiByteString) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3417,6 +3657,7 @@ EngMultiByteToUnicodeN(OUT LPWSTR UnicodeString, INT STDCALL EngMultiByteToWideChar(UINT CodePage,LPWSTR WideCharString,INT BytesInWideCharString,LPSTR MultiByteString,INT BytesInMultiByteString) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3431,6 +3672,7 @@ EngPaint(IN SURFOBJ *Surface, IN POINTL *BrushOrigin, IN MIX Mix) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3441,6 +3683,7 @@ EngPaint(IN SURFOBJ *Surface, BOOL STDCALL EngPlgBlt(SURFOBJ *psoTrg,SURFOBJ *psoSrc,SURFOBJ *psoMsk,CLIPOBJ *pco,XLATEOBJ *pxlo,COLORADJUSTMENT *pca,POINTL *pptlBrushOrg,POINTFIX *pptfx,RECTL *prcl,POINTL *pptl,ULONG iMode) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3451,6 +3694,7 @@ EngPlgBlt(SURFOBJ *psoTrg,SURFOBJ *psoSrc,SURFOBJ *psoMsk,CLIPOBJ *pco,XLATEOBJ BOOL STDCALL EngQueryEMFInfo(HDEV hdev,EMFINFO *pEMFInfo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3461,6 +3705,7 @@ EngQueryEMFInfo(HDEV hdev,EMFINFO *pEMFInfo) VOID STDCALL EngQueryLocalTime(PENG_TIME_FIELDS etf) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3471,6 +3716,7 @@ VOID STDCALL EngReleaseSemaphore ( IN HSEMAPHORE hsem ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3480,6 +3726,7 @@ EngReleaseSemaphore ( IN HSEMAPHORE hsem ) BOOL STDCALL EngStretchBlt(SURFOBJ *psoDest,SURFOBJ *psoSrc,SURFOBJ *psoMask,CLIPOBJ *pco,XLATEOBJ *pxlo,COLORADJUSTMENT *pca,POINTL *pptlHTOrg,RECTL *prclDest,RECTL *prclSrc,POINTL *pptlMask,ULONG iMode) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3490,6 +3737,7 @@ EngStretchBlt(SURFOBJ *psoDest,SURFOBJ *psoSrc,SURFOBJ *psoMask,CLIPOBJ *pco,XLA BOOL STDCALL EngStretchBltROP(SURFOBJ *psoDest,SURFOBJ *psoSrc,SURFOBJ *psoMask,CLIPOBJ *pco,XLATEOBJ *pxlo,COLORADJUSTMENT *pca,POINTL *pptlHTOrg,RECTL *prclDest,RECTL *prclSrc,POINTL *pptlMask,ULONG iMode,BRUSHOBJ *pbo,DWORD rop4) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3500,6 +3748,7 @@ EngStretchBltROP(SURFOBJ *psoDest,SURFOBJ *psoSrc,SURFOBJ *psoMask,CLIPOBJ *pco, BOOL STDCALL EngStrokeAndFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,XFORMOBJ *pxo,BRUSHOBJ *pboStroke,LINEATTRS *plineattrs,BRUSHOBJ *pboFill,POINTL *pptlBrushOrg,MIX mixFill,FLONG flOptions) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3510,6 +3759,7 @@ EngStrokeAndFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,XFORMOBJ *pxo,BRUSHO BOOL STDCALL EngStrokePath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,XFORMOBJ *pxo,BRUSHOBJ *pbo,POINTL *pptlBrushOrg,LINEATTRS *plineattrs,MIX mix) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3520,6 +3770,7 @@ EngStrokePath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,XFORMOBJ *pxo,BRUSHOBJ *pbo BOOL STDCALL EngTextOut(SURFOBJ *pso,STROBJ *pstro,FONTOBJ *pfo,CLIPOBJ *pco,RECTL *prclExtra,RECTL *prclOpaque,BRUSHOBJ *pboFore,BRUSHOBJ *pboOpaque,POINTL *pptlOrg,MIX mix) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3537,6 +3788,7 @@ EngTransparentBlt(IN SURFOBJ *Dest, IN ULONG TransparentColor, IN ULONG Reserved) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3551,6 +3803,7 @@ EngUnicodeToMultiByteN(OUT PCHAR MultiByteString, IN PWSTR UnicodeString, IN ULONG BytesInUnicodeString) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3560,6 +3813,7 @@ EngUnicodeToMultiByteN(OUT PCHAR MultiByteString, VOID STDCALL EngUnlockSurface(SURFOBJ *pso) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3569,6 +3823,7 @@ EngUnlockSurface(SURFOBJ *pso) INT STDCALL EngWideCharToMultiByte(UINT CodePage,LPWSTR WideCharString,INT BytesInWideCharString,LPSTR MultiByteString,INT BytesInMultiByteString) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3581,6 +3836,7 @@ STDCALL FONTOBJ_cGetAllGlyphHandles(IN FONTOBJ *FontObj, IN HGLYPH *Glyphs) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3596,6 +3852,7 @@ FONTOBJ_cGetGlyphs(IN FONTOBJ *FontObj, IN HGLYPH *GlyphHandles, IN PVOID *OutGlyphs) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3606,6 +3863,7 @@ FONTOBJ_cGetGlyphs(IN FONTOBJ *FontObj, PFD_GLYPHATTR STDCALL FONTOBJ_pQueryGlyphAttrs(FONTOBJ *pfo,ULONG iMode) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3616,6 +3874,7 @@ FONTOBJ_pQueryGlyphAttrs(FONTOBJ *pfo,ULONG iMode) FD_GLYPHSET *STDCALL FONTOBJ_pfdg(FONTOBJ *pfo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3627,6 +3886,7 @@ IFIMETRICS* STDCALL FONTOBJ_pifi(IN FONTOBJ *FontObj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3639,6 +3899,7 @@ STDCALL FONTOBJ_pvTrueTypeFontFile(IN FONTOBJ *FontObj, IN ULONG *FileSize) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3650,6 +3911,7 @@ XFORMOBJ* STDCALL FONTOBJ_pxoGetXform(IN FONTOBJ *FontObj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3663,6 +3925,7 @@ FONTOBJ_vGetInfo(IN FONTOBJ *FontObj, IN ULONG InfoSize, OUT PFONTINFO FontInfo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3672,6 +3935,7 @@ FONTOBJ_vGetInfo(IN FONTOBJ *FontObj, BOOL STDCALL PATHOBJ_bEnum(PATHOBJ *ppo,PATHDATA *ppd) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3682,6 +3946,7 @@ PATHOBJ_bEnum(PATHOBJ *ppo,PATHDATA *ppd) BOOL STDCALL PATHOBJ_bEnumClipLines(PATHOBJ *ppo,ULONG cb,CLIPLINE *pcl) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3692,6 +3957,7 @@ PATHOBJ_bEnumClipLines(PATHOBJ *ppo,ULONG cb,CLIPLINE *pcl) VOID STDCALL PATHOBJ_vEnumStart(PATHOBJ *ppo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3701,6 +3967,7 @@ PATHOBJ_vEnumStart(PATHOBJ *ppo) VOID STDCALL PATHOBJ_vEnumStartClipLines(PATHOBJ *ppo,CLIPOBJ *pco,SURFOBJ *pso,LINEATTRS *pla) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3710,6 +3977,7 @@ PATHOBJ_vEnumStartClipLines(PATHOBJ *ppo,CLIPOBJ *pco,SURFOBJ *pso,LINEATTRS *pl VOID STDCALL PATHOBJ_vGetBounds(PATHOBJ *ppo,PRECTFX prectfx) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3719,6 +3987,7 @@ PATHOBJ_vGetBounds(PATHOBJ *ppo,PRECTFX prectfx) BOOL STDCALL STROBJ_bEnum(STROBJ *pstro,ULONG *pc,PGLYPHPOS *ppgpos) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3729,6 +3998,7 @@ STROBJ_bEnum(STROBJ *pstro,ULONG *pc,PGLYPHPOS *ppgpos) BOOL STDCALL STROBJ_bEnumPositionsOnly(STROBJ *pstro,ULONG *pc,PGLYPHPOS *ppgpos) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3739,6 +4009,7 @@ STROBJ_bEnumPositionsOnly(STROBJ *pstro,ULONG *pc,PGLYPHPOS *ppgpos) BOOL STDCALL STROBJ_bGetAdvanceWidths(STROBJ *pso,ULONG iFirst,ULONG c,POINTQF *pptqD) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3749,6 +4020,7 @@ STROBJ_bGetAdvanceWidths(STROBJ *pso,ULONG iFirst,ULONG c,POINTQF *pptqD) DWORD STDCALL STROBJ_dwGetCodePage(STROBJ *pstro) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3759,6 +4031,7 @@ STROBJ_dwGetCodePage(STROBJ *pstro) VOID STDCALL STROBJ_vEnumStart(STROBJ *pstro) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3768,6 +4041,7 @@ STROBJ_vEnumStart(STROBJ *pstro) BOOL STDCALL XFORMOBJ_bApplyXform(XFORMOBJ *pxo,ULONG iMode,ULONG cPoints,PVOID pvIn,PVOID pvOut) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3778,6 +4052,7 @@ XFORMOBJ_bApplyXform(XFORMOBJ *pxo,ULONG iMode,ULONG cPoints,PVOID pvIn,PVOID pv ULONG STDCALL XFORMOBJ_iGetXform(XFORMOBJ *pxo,XFORML *pxform) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3791,6 +4066,7 @@ XLATEOBJ_cGetPalette(XLATEOBJ *XlateObj, ULONG cPal, ULONG *OutPal) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3801,6 +4077,7 @@ XLATEOBJ_cGetPalette(XLATEOBJ *XlateObj, HANDLE STDCALL XLATEOBJ_hGetColorTransform(XLATEOBJ *pxlo) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3812,6 +4089,7 @@ ULONG STDCALL XLATEOBJ_iXlate(XLATEOBJ *XlateObj, ULONG Color) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3822,6 +4100,7 @@ XLATEOBJ_iXlate(XLATEOBJ *XlateObj, ULONG * STDCALL XLATEOBJ_piVector(XLATEOBJ *XlateObj) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3834,6 +4113,7 @@ LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, HDC hdc ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3855,6 +4135,7 @@ LPDWORD pdwFourCC, LPVIDMEM pvmList ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3866,6 +4147,7 @@ BOOL STDCALL DdDeleteDirectDrawObject( LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3878,6 +4160,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, BOOL bPrimarySurface ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3889,6 +4172,7 @@ BOOL STDCALL DdDeleteSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3901,6 +4185,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, HWND hWnd ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3913,6 +4198,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, LPPALETTEENTRY pColorTable ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3924,6 +4210,7 @@ BOOL STDCALL DdReleaseDC( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3940,6 +4227,7 @@ HANDLE hSectionApp, DWORD dwOffset ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3952,6 +4240,7 @@ LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, BOOL *pbNewMode ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3964,6 +4253,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom, LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3976,6 +4266,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurface, LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } @@ -3984,6 +4275,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached */ ULONG STDCALL DdQueryDisplaySettingsUniqueness(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -3997,6 +4289,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pSurface, BOOL bRelease ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -4010,6 +4303,7 @@ HDC hdc, LPVOID lpGammaRamp ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -4023,6 +4317,7 @@ LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl1, LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -4041,6 +4336,7 @@ GdiPlayEMF HANDLE hPageQuery ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -4052,6 +4348,7 @@ BOOL STDCALL GdiInitSpool(VOID) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -4068,6 +4365,7 @@ GdiPlayPrivatePageEMF RECT *prectDocument ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -4077,5 +4375,6 @@ GdiPlayPrivatePageEMF */ VOID STDCALL GdiInitializeLanguagePack(DWORD InitParam) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } diff --git a/reactos/lib/gdi32/misc/stubsa.c b/reactos/lib/gdi32/misc/stubsa.c index 6686617c93e..49d37c07d84 100644 --- a/reactos/lib/gdi32/misc/stubsa.c +++ b/reactos/lib/gdi32/misc/stubsa.c @@ -1,4 +1,4 @@ -/* $Id: stubsa.c,v 1.31 2004/04/09 20:03:13 navaraf Exp $ +/* $Id: stubsa.c,v 1.32 2004/07/09 20:28:20 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -23,6 +23,8 @@ #include #include +#define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try again later.\n", __FUNCTION__); + /* * @implemented */ @@ -172,6 +174,7 @@ DeviceCapabilitiesExA( CONST DEVMODEA *pDevMode ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -189,6 +192,7 @@ EnumFontsA ( LPARAM lParam ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; #if 0 @@ -291,6 +295,7 @@ GetOutlineTextMetricsA( LPOUTLINETEXTMETRICA lpOTM ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -344,6 +349,7 @@ GetCharacterPlacementA( DWORD a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -404,6 +410,7 @@ StartDocA( CONST DOCINFOA *a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -420,6 +427,7 @@ PolyTextOutA( int a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -436,6 +444,7 @@ GetTextFaceA( LPSTR a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -452,6 +461,7 @@ GetKerningPairsA( LPKERNINGPAIR a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -468,6 +478,7 @@ GetLogColorSpaceA( DWORD a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -482,6 +493,7 @@ CreateColorSpaceA( LPLOGCOLORSPACEA a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -498,6 +510,7 @@ GetICMProfileA( LPSTR a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -513,6 +526,7 @@ SetICMProfileA( LPSTR a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -539,6 +553,7 @@ EnumICMProfilesA( * until we run out of strings or the user returns FALSE */ + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -556,6 +571,7 @@ wglUseFontBitmapsA( DWORD a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -577,6 +593,7 @@ wglUseFontOutlinesA( LPGLYPHMETRICSFLOAT a7 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -594,6 +611,7 @@ UpdateICMRegKeyA( UINT a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } diff --git a/reactos/lib/gdi32/misc/stubsw.c b/reactos/lib/gdi32/misc/stubsw.c index 6b513115d8a..53ecfeb4a03 100644 --- a/reactos/lib/gdi32/misc/stubsw.c +++ b/reactos/lib/gdi32/misc/stubsw.c @@ -1,4 +1,4 @@ -/* $Id: stubsw.c,v 1.28 2004/04/09 20:03:13 navaraf Exp $ +/* $Id: stubsw.c,v 1.29 2004/07/09 20:28:20 navaraf Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -14,6 +14,8 @@ #include #include +#define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try again later.\n", __FUNCTION__); + /* * @implemented */ @@ -106,6 +108,7 @@ DeviceCapabilitiesExW( pOutput, pDevMode ); #else + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; #endif @@ -127,6 +130,7 @@ EnumFontsW( #if 0 return NtGdiEnumFonts ( hDC, lpFaceName, FontFunc, lParam ); #else + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; #endif @@ -211,6 +215,7 @@ GetOutlineTextMetricsW( LPOUTLINETEXTMETRICW lpOTM ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -250,6 +255,7 @@ GetCharacterPlacementW( DWORD a5 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -307,13 +313,14 @@ PolyTextOutW( int a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* - * @unimplemented + * @implemented */ int STDCALL @@ -323,8 +330,7 @@ GetTextFaceW( LPWSTR a2 ) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + return NtGdiGetTextFace(a0, a1, a2); } @@ -339,6 +345,7 @@ GetKerningPairsW( LPKERNINGPAIR a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -355,6 +362,7 @@ GetLogColorSpaceW( DWORD a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -368,6 +376,7 @@ CreateColorSpaceW( LPLOGCOLORSPACEW a0 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -384,6 +393,7 @@ GetICMProfileW( LPWSTR a2 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -399,6 +409,7 @@ SetICMProfileW( LPWSTR a1 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -424,6 +435,7 @@ EnumICMProfilesW( * and call the user's callback function until we run out of strings or * the user returns FALSE */ + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } @@ -441,6 +453,7 @@ wglUseFontBitmapsW( DWORD a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -462,6 +475,7 @@ wglUseFontOutlinesW( LPGLYPHMETRICSFLOAT a7 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -479,6 +493,7 @@ UpdateICMRegKeyW( UINT a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } @@ -502,6 +517,7 @@ GetFontResourceInfoW( DWORD a3 ) { + UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } diff --git a/reactos/lib/gdi32/objects/font.c b/reactos/lib/gdi32/objects/font.c index 244649af501..1342545aff8 100644 --- a/reactos/lib/gdi32/objects/font.c +++ b/reactos/lib/gdi32/objects/font.c @@ -1,4 +1,4 @@ -/* $Id: font.c,v 1.5 2004/07/03 17:40:22 navaraf Exp $ +/* $Id: font.c,v 1.6 2004/07/09 20:28:20 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -404,3 +404,20 @@ GetCharWidth32W( { return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); } + + +/* + * @implemented + */ +DWORD +STDCALL +GetFontData( + HDC a0, + DWORD a1, + DWORD a2, + LPVOID a3, + DWORD a4 + ) +{ + return NtGdiGetFontData(a0, a1, a2, a3, a4); +} diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 4b9856c8088..03291a23cf8 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.102 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: text.c,v 1.103 2004/07/09 20:28:20 navaraf Exp $ */ #include #include @@ -2498,13 +2498,31 @@ NtGdiGetTextExtentPoint32(HDC hDC, return TRUE; } -int -STDCALL -NtGdiGetTextFace(HDC hDC, - int Count, - LPWSTR FaceName) +INT STDCALL +NtGdiGetTextFace(HDC hDC, INT Count, LPWSTR FaceName) { - UNIMPLEMENTED; + PDC Dc; + PTEXTOBJ TextObj; + NTSTATUS Status; + + Dc = DC_LockDc(hDC); + if (Dc == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + TextObj = TEXTOBJ_LockText(Dc->w.hFont); + DC_UnlockDc(hDC); + + Count = min(Count, wcslen(TextObj->logfont.lfFaceName)); + Status = MmCopyToCaller(FaceName, TextObj->logfont.lfFaceName, Count * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return 0; + } + + return Count; } BOOL @@ -2680,6 +2698,63 @@ NtGdiTextOut( return NtGdiExtTextOut(hDC, XStart, YStart, 0, NULL, String, Count, NULL); } +DWORD STDCALL +NtGdiGetFontData( + HDC hDC, + DWORD Table, + DWORD Offset, + LPVOID Buffer, + DWORD Size) +{ + PDC Dc; + HFONT hFont; + PTEXTOBJ TextObj; + PFONTGDI FontGdi; + DWORD Result = GDI_ERROR; + NTSTATUS Status; + + Dc = DC_LockDc(hDC); + if (Dc == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return GDI_ERROR; + } + hFont = Dc->w.hFont; + TextObj = TEXTOBJ_LockText(hFont); + DC_UnlockDc(hDC); + + if (TextObj == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return GDI_ERROR; + } + + Status = GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGdi); + if (NT_SUCCESS(Status)) + { + IntLockFreeType; + + if (FT_IS_SFNT(FontGdi->face)) + { + if (Table) + Table = Table >> 24 | Table << 24 | (Table >> 8 & 0xFF00) | + (Table << 8 & 0xFF0000); + + if (Buffer == NULL) + Size = 0; + + if (!FT_Load_Sfnt_Table(FontGdi->face, Table, Offset, Buffer, &Size)) + Result = Size; + } + + IntUnLockFreeType; + } + + TEXTOBJ_UnlockText(hFont); + + return Result; +} + static UINT FASTCALL GetFontScore(LOGFONTW *LogFont, PUNICODE_STRING FaceName, PFONTGDI FontGDI) { From 4f24993634486d68ad348941fe5af185b02885c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 9 Jul 2004 20:57:38 +0000 Subject: [PATCH 240/356] FindWindow() should search the threads desktop, not the active one. svn path=/trunk/; revision=10059 --- reactos/subsys/win32k/include/desktop.h | 3 +++ reactos/subsys/win32k/ntuser/desktop.c | 13 ++++++++++++- reactos/subsys/win32k/ntuser/window.c | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/win32k/include/desktop.h b/reactos/subsys/win32k/include/desktop.h index 2c49a77caba..37292dc94a6 100644 --- a/reactos/subsys/win32k/include/desktop.h +++ b/reactos/subsys/win32k/include/desktop.h @@ -31,6 +31,9 @@ IntGetScreenDC(VOID); HWND FASTCALL IntGetDesktopWindow (VOID); +HWND FASTCALL +IntGetCurrentThreadDesktopWindow(VOID); + PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID); diff --git a/reactos/subsys/win32k/ntuser/desktop.c b/reactos/subsys/win32k/ntuser/desktop.c index dcb00662e55..8cac7116dab 100644 --- a/reactos/subsys/win32k/ntuser/desktop.c +++ b/reactos/subsys/win32k/ntuser/desktop.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: desktop.c,v 1.16 2004/07/03 13:55:36 navaraf Exp $ + * $Id: desktop.c,v 1.17 2004/07/09 20:57:38 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -206,6 +206,17 @@ HWND FASTCALL IntGetDesktopWindow(VOID) return pdo->DesktopWindow; } +HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID) +{ + PDESKTOP_OBJECT pdo = PsGetWin32Thread()->Desktop; + if (NULL == pdo) + { + DPRINT1("Thread doesn't have a desktop\n"); + return NULL; + } + return pdo->DesktopWindow; +} + /* PUBLIC FUNCTIONS ***********************************************************/ NTSTATUS FASTCALL diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 570fc5fabbd..2c68169504a 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: window.c,v 1.242 2004/07/03 17:40:25 navaraf Exp $ +/* $Id: window.c,v 1.243 2004/07/09 20:57:38 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -2381,7 +2381,7 @@ NtUserFindWindowEx(HWND hwndParent, PWNDCLASS_OBJECT ClassObject = NULL; BOOL ClassFound; - Desktop = IntGetDesktopWindow(); + Desktop = IntGetCurrentThreadDesktopWindow(); if(hwndParent == NULL) hwndParent = Desktop; From 95e1a9b2470b2c7f47e7ab039d5998f0cb314411 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 10 Jul 2004 13:05:08 +0000 Subject: [PATCH 241/356] - Fixed the comparing of video modes in IntInitScreenInfo. svn path=/trunk/; revision=10060 --- reactos/drivers/video/displays/framebuf/screen.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/video/displays/framebuf/screen.c b/reactos/drivers/video/displays/framebuf/screen.c index b760cafac23..0ecfb8757c5 100644 --- a/reactos/drivers/video/displays/framebuf/screen.c +++ b/reactos/drivers/video/displays/framebuf/screen.c @@ -158,12 +158,9 @@ IntInitScreenInfo( ModeInfoPtr = ModeInfo; while (ModeCount-- > 0) { - if (ModeInfoPtr->Length == 0) - { - continue; - } - if (pDevMode->dmPelsWidth == ModeInfoPtr->VisScreenWidth && + if (ModeInfoPtr->Length > 0 && + pDevMode->dmPelsWidth == ModeInfoPtr->VisScreenWidth && pDevMode->dmPelsHeight == ModeInfoPtr->VisScreenHeight && pDevMode->dmBitsPerPel == (ModeInfoPtr->BitsPerPlane * ModeInfoPtr->NumberOfPlanes) && From 7f900f8f7e36427f3baf18470051d32e196ce787 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 10 Jul 2004 13:08:02 +0000 Subject: [PATCH 242/356] - Fixed the return value in VirtualQueryEx if NtQueryVirtualMemory returns an error. svn path=/trunk/; revision=10061 --- reactos/lib/kernel32/mem/virtual.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/kernel32/mem/virtual.c b/reactos/lib/kernel32/mem/virtual.c index dba21341ce4..0d2c91e7b37 100644 --- a/reactos/lib/kernel32/mem/virtual.c +++ b/reactos/lib/kernel32/mem/virtual.c @@ -1,4 +1,4 @@ -/* $Id: virtual.c,v 1.13 2004/06/13 10:35:52 navaraf Exp $ +/* $Id: virtual.c,v 1.14 2004/07/10 13:08:02 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -198,7 +198,7 @@ VirtualQueryEx(HANDLE hProcess, if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); - return(ResultLength); + return 0; } return(ResultLength); } From 39da3d41f97a47fbb11417c85cc88e1239a64439 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Jul 2004 13:11:18 +0000 Subject: [PATCH 243/356] Fix RtlEqualSid(). svn path=/trunk/; revision=10062 --- reactos/lib/rtl/sid.c | 127 +++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 64 deletions(-) diff --git a/reactos/lib/rtl/sid.c b/reactos/lib/rtl/sid.c index a7a7cee3a34..60e742b1c68 100644 --- a/reactos/lib/rtl/sid.c +++ b/reactos/lib/rtl/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.2 2004/06/20 23:30:47 gdalsnes Exp $ +/* $Id: sid.c,v 1.3 2004/07/10 13:11:18 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,15 +24,13 @@ BOOLEAN STDCALL RtlValidSid(IN PSID Sid) { - if ((Sid->Revision & 0xf) != 1) - { - return(FALSE); - } - if (Sid->SubAuthorityCount > 15) - { - return(FALSE); - } - return(TRUE); + if (((Sid->Revision & 0xf) != 1) || + (Sid->SubAuthorityCount > 15)) + { + return FALSE; + } + + return TRUE; } @@ -42,7 +40,7 @@ RtlValidSid(IN PSID Sid) ULONG STDCALL RtlLengthRequiredSid(IN UCHAR SubAuthorityCount) { - return(sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG)); + return (sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG)); } @@ -54,12 +52,13 @@ RtlInitializeSid(IN PSID Sid, IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, IN UCHAR SubAuthorityCount) { - Sid->Revision = 1; - Sid->SubAuthorityCount = SubAuthorityCount; - memcpy(&Sid->IdentifierAuthority, - IdentifierAuthority, - sizeof(SID_IDENTIFIER_AUTHORITY)); - return(STATUS_SUCCESS); + Sid->Revision = 1; + Sid->SubAuthorityCount = SubAuthorityCount; + memcpy(&Sid->IdentifierAuthority, + IdentifierAuthority, + sizeof(SID_IDENTIFIER_AUTHORITY)); + + return STATUS_SUCCESS; } @@ -70,7 +69,7 @@ PULONG STDCALL RtlSubAuthoritySid(IN PSID Sid, IN ULONG SubAuthority) { - return(&Sid->SubAuthority[SubAuthority]); + return &Sid->SubAuthority[SubAuthority]; } @@ -80,7 +79,7 @@ RtlSubAuthoritySid(IN PSID Sid, PUCHAR STDCALL RtlSubAuthorityCountSid(IN PSID Sid) { - return(&Sid->SubAuthorityCount); + return &Sid->SubAuthorityCount; } @@ -91,7 +90,7 @@ BOOLEAN STDCALL RtlEqualSid(IN PSID Sid1, IN PSID Sid2) { - if (Sid1->Revision != Sid2->Revision) + if (Sid1->Revision != Sid2->Revision) { return(FALSE); } @@ -99,7 +98,7 @@ RtlEqualSid(IN PSID Sid1, { return(FALSE); } - if (RtlCompareMemory(Sid1, Sid2, RtlLengthSid(Sid1)) != 0) + if (RtlCompareMemory(Sid1, Sid2, RtlLengthSid(Sid1)) != RtlLengthSid(Sid1)) { return(FALSE); } @@ -113,7 +112,7 @@ RtlEqualSid(IN PSID Sid1, ULONG STDCALL RtlLengthSid(IN PSID Sid) { - return(sizeof(SID) + (Sid->SubAuthorityCount-1)*4); + return (sizeof(SID) + (Sid->SubAuthorityCount-1) * sizeof(ULONG)); } @@ -125,14 +124,16 @@ RtlCopySid(ULONG BufferLength, PSID Dest, PSID Src) { - if (BufferLength < RtlLengthSid(Src)) - { - return(STATUS_UNSUCCESSFUL); - } - memmove(Dest, - Src, - RtlLengthSid(Src)); - return(STATUS_SUCCESS); + if (BufferLength < RtlLengthSid(Src)) + { + return STATUS_UNSUCCESSFUL; + } + + memmove(Dest, + Src, + RtlLengthSid(Src)); + + return STATUS_SUCCESS; } @@ -181,49 +182,47 @@ RtlCopySidAndAttributesArray(ULONG Count, PSID_IDENTIFIER_AUTHORITY STDCALL RtlIdentifierAuthoritySid(IN PSID Sid) { - return(&Sid->IdentifierAuthority); + return &Sid->IdentifierAuthority; } /* * @implemented */ -NTSTATUS -STDCALL -RtlAllocateAndInitializeSid ( - PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, - UCHAR SubAuthorityCount, - ULONG SubAuthority0, - ULONG SubAuthority1, - ULONG SubAuthority2, - ULONG SubAuthority3, - ULONG SubAuthority4, - ULONG SubAuthority5, - ULONG SubAuthority6, - ULONG SubAuthority7, - PSID *Sid -) +NTSTATUS STDCALL +RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + UCHAR SubAuthorityCount, + ULONG SubAuthority0, + ULONG SubAuthority1, + ULONG SubAuthority2, + ULONG SubAuthority3, + ULONG SubAuthority4, + ULONG SubAuthority5, + ULONG SubAuthority6, + ULONG SubAuthority7, + PSID *Sid) { - PSID pSid; + PSID pSid; - if (SubAuthorityCount > 8) - return STATUS_INVALID_SID; + if (SubAuthorityCount > 8) + return STATUS_INVALID_SID; - if (Sid == NULL) - return STATUS_INVALID_PARAMETER; + if (Sid == NULL) + return STATUS_INVALID_PARAMETER; - pSid = (PSID)ExAllocatePool(PagedPool, SubAuthorityCount * sizeof(DWORD) + 8); - if (pSid == NULL) - return STATUS_NO_MEMORY; + pSid = (PSID)ExAllocatePool(PagedPool, + sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG)); + if (pSid == NULL) + return STATUS_NO_MEMORY; - pSid->Revision = 1; - pSid->SubAuthorityCount = SubAuthorityCount; - memcpy (&pSid->IdentifierAuthority, - IdentifierAuthority, - sizeof(SID_IDENTIFIER_AUTHORITY)); + pSid->Revision = 1; + pSid->SubAuthorityCount = SubAuthorityCount; + memcpy(&pSid->IdentifierAuthority, + IdentifierAuthority, + sizeof(SID_IDENTIFIER_AUTHORITY)); - switch (SubAuthorityCount) - { + switch (SubAuthorityCount) + { case 8: pSid->SubAuthority[7] = SubAuthority7; case 7: @@ -241,11 +240,11 @@ RtlAllocateAndInitializeSid ( case 1: pSid->SubAuthority[0] = SubAuthority0; break; - } + } - *Sid = pSid; + *Sid = pSid; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } From 5b9cf862e014fb016c4ae4550aaa4a8d820353f2 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Jul 2004 13:12:24 +0000 Subject: [PATCH 244/356] Create group SIDs for logon token. svn path=/trunk/; revision=10063 --- reactos/lib/advapi32/misc/logon.c | 325 ++++++++++++++++++++++++++++-- 1 file changed, 312 insertions(+), 13 deletions(-) diff --git a/reactos/lib/advapi32/misc/logon.c b/reactos/lib/advapi32/misc/logon.c index cfc0f6f74fa..9059f09038e 100644 --- a/reactos/lib/advapi32/misc/logon.c +++ b/reactos/lib/advapi32/misc/logon.c @@ -1,4 +1,4 @@ -/* $Id: logon.c,v 1.7 2004/07/07 08:41:47 gvg Exp $ +/* $Id: logon.c,v 1.8 2004/07/10 13:12:24 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -237,6 +237,293 @@ SamGetUserSid (LPCWSTR UserName, } +static BOOL STDCALL +SamGetDomainSid(PSID *Sid) +{ + PSID lpSid; + DWORD dwLength; + HKEY hDomainKey; + + DPRINT("SamGetDomainSid() called\n"); + + if (Sid != NULL) + *Sid = NULL; + + /* Open the account domain key */ + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"SAM\\SAM\\Domains\\Account", + 0, + KEY_READ, + &hDomainKey)) + { + DPRINT1("Failed to open the account domain key! (Error %lu)\n", GetLastError()); + return FALSE; + } + + /* Get SID size */ + dwLength = 0; + if (RegQueryValueExW(hDomainKey, + L"Sid", + NULL, + NULL, + NULL, + &dwLength)) + { + DPRINT1("Failed to read the SID size! (Error %lu)\n", GetLastError()); + RegCloseKey(hDomainKey); + return FALSE; + } + + /* Allocate sid buffer */ + DPRINT("Required SID buffer size: %lu\n", dwLength); + lpSid = (PSID)RtlAllocateHeap(RtlGetProcessHeap(), + 0, + dwLength); + if (lpSid == NULL) + { + DPRINT1("Failed to allocate SID buffer!\n"); + RegCloseKey(hDomainKey); + return FALSE; + } + + /* Read sid */ + if (RegQueryValueExW(hDomainKey, + L"Sid", + NULL, + NULL, + (LPBYTE)lpSid, + &dwLength)) + { + DPRINT1("Failed to read the SID! (Error %lu)\n", GetLastError()); + RtlFreeHeap(RtlGetProcessHeap(), + 0, + lpSid); + RegCloseKey(hDomainKey); + return FALSE; + } + + RegCloseKey(hDomainKey); + + *Sid = lpSid; + + DPRINT("SamGetDomainSid() done\n"); + + return TRUE; +} + + +static PSID +AppendRidToSid(PSID SrcSid, + ULONG Rid) +{ + ULONG Rids[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + UCHAR RidCount; + PSID DstSid; + ULONG i; + + RidCount = *RtlSubAuthorityCountSid(SrcSid); + if (RidCount >= 8) + return NULL; + + for (i = 0; i < RidCount; i++) + Rids[i] = *RtlSubAuthoritySid(SrcSid, i); + + Rids[RidCount] = Rid; + RidCount++; + + RtlAllocateAndInitializeSid(RtlIdentifierAuthoritySid(SrcSid), + RidCount, + Rids[0], + Rids[1], + Rids[2], + Rids[3], + Rids[4], + Rids[5], + Rids[6], + Rids[7], + &DstSid); + + return DstSid; +} + + +static PTOKEN_GROUPS +AllocateGroupSids(PSID *PrimaryGroupSid, + PSID *OwnerSid) +{ + SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY LocalAuthority = {SECURITY_LOCAL_SID_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; + PTOKEN_GROUPS TokenGroups; + PSID DomainSid; + PSID Sid; + LUID Luid; + NTSTATUS Status; + + Status = NtAllocateLocallyUniqueId(&Luid); + if (!NT_SUCCESS(Status)) + { + return NULL; + } + + if (!SamGetDomainSid(&DomainSid)) + { + return NULL; + } + + TokenGroups = RtlAllocateHeap(GetProcessHeap(), 0, + sizeof(TOKEN_GROUPS) + + 8 * sizeof(SID_AND_ATTRIBUTES)); + if (TokenGroups == NULL) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + DomainSid); + return NULL; + } + + TokenGroups->GroupCount = 8; + + Sid = AppendRidToSid(DomainSid, + DOMAIN_GROUP_RID_USERS); + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + DomainSid); + + TokenGroups->Groups[0].Sid = Sid; + TokenGroups->Groups[0].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + *PrimaryGroupSid = Sid; + + + RtlAllocateAndInitializeSid(&WorldAuthority, + 1, + SECURITY_WORLD_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[1].Sid = Sid; + TokenGroups->Groups[1].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + + + RtlAllocateAndInitializeSid(&SystemAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[2].Sid = Sid; + TokenGroups->Groups[2].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + + *OwnerSid = Sid; + + RtlAllocateAndInitializeSid(&SystemAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_USERS, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[3].Sid = Sid; + TokenGroups->Groups[3].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + + /* Logon SID */ + RtlAllocateAndInitializeSid(&SystemAuthority, + SECURITY_LOGON_IDS_RID_COUNT, + SECURITY_LOGON_IDS_RID, + Luid.HighPart, + Luid.LowPart, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[4].Sid = Sid; + TokenGroups->Groups[4].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY | SE_GROUP_LOGON_ID; + + RtlAllocateAndInitializeSid(&LocalAuthority, + 1, + SECURITY_LOCAL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[5].Sid = Sid; + TokenGroups->Groups[5].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + + RtlAllocateAndInitializeSid(&SystemAuthority, + 1, + SECURITY_INTERACTIVE_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[6].Sid = Sid; + TokenGroups->Groups[6].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + + RtlAllocateAndInitializeSid(&SystemAuthority, + 1, + SECURITY_AUTHENTICATED_USER_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &Sid); + + TokenGroups->Groups[7].Sid = Sid; + TokenGroups->Groups[7].Attributes = SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY; + + return TokenGroups; +} + + +static VOID +FreeGroupSids(PTOKEN_GROUPS TokenGroups) +{ + ULONG i; + + for (i = 0; i < TokenGroups->GroupCount; i++) + { + if (TokenGroups->Groups[i].Sid != NULL) + RtlFreeHeap(GetProcessHeap(), 0, TokenGroups->Groups[i].Sid); + } + + RtlFreeHeap(GetProcessHeap(), 0, TokenGroups); +} + + /* * @unimplemented */ @@ -283,14 +570,15 @@ LogonUserW (LPWSTR lpszUsername, TOKEN_USER TokenUser; TOKEN_OWNER TokenOwner; TOKEN_PRIMARY_GROUP TokenPrimaryGroup; - TOKEN_GROUPS TokenGroups; -// PTOKEN_GROUPS TokenGroups; + PTOKEN_GROUPS TokenGroups; PTOKEN_PRIVILEGES TokenPrivileges; TOKEN_DEFAULT_DACL TokenDefaultDacl; LARGE_INTEGER ExpirationTime; LUID AuthenticationId; TOKEN_SOURCE TokenSource; - PSID UserSid; + PSID UserSid = NULL; + PSID PrimaryGroupSid = NULL; + PSID OwnerSid = NULL; ACL Dacl; NTSTATUS Status; SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; @@ -333,21 +621,29 @@ LogonUserW (LPWSTR lpszUsername, TokenUser.User.Sid = UserSid; TokenUser.User.Attributes = 0; -// TokenGroups = NULL; - TokenGroups.GroupCount = 1; - TokenGroups.Groups[0].Sid = UserSid; /* FIXME */ - TokenGroups.Groups[0].Attributes = SE_GROUP_ENABLED; + /* Allocate and initialize token groups */ + TokenGroups = AllocateGroupSids(&PrimaryGroupSid, + &OwnerSid); + if (NULL == TokenGroups) + { + RtlFreeSid (UserSid); + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + /* Allocate and initialize token privileges */ TokenPrivileges = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(TOKEN_PRIVILEGES) + sizeof(DefaultPrivs) / sizeof(DefaultPrivs[0]) * sizeof(LUID_AND_ATTRIBUTES)); if (NULL == TokenPrivileges) { + FreeGroupSids(TokenGroups); RtlFreeSid (UserSid); SetLastError(ERROR_OUTOFMEMORY); return FALSE; } + TokenPrivileges->PrivilegeCount = 0; for (i = 0; i < sizeof(DefaultPrivs) / sizeof(DefaultPrivs[0]); i++) { @@ -363,13 +659,14 @@ LogonUserW (LPWSTR lpszUsername, } } - TokenOwner.Owner = UserSid; - - TokenPrimaryGroup.PrimaryGroup = UserSid; + TokenOwner.Owner = OwnerSid; + TokenPrimaryGroup.PrimaryGroup = PrimaryGroupSid; +// TokenPrimaryGroup.PrimaryGroup = UserSid; Status = RtlCreateAcl (&Dacl, sizeof(ACL), ACL_REVISION); if (!NT_SUCCESS(Status)) { + FreeGroupSids(TokenGroups); RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); RtlFreeSid (UserSid); return FALSE; @@ -383,6 +680,8 @@ LogonUserW (LPWSTR lpszUsername, Status = NtAllocateLocallyUniqueId (&TokenSource.SourceIdentifier); if (!NT_SUCCESS(Status)) { + FreeGroupSids(TokenGroups); + RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); RtlFreeSid (UserSid); return FALSE; } @@ -394,14 +693,14 @@ LogonUserW (LPWSTR lpszUsername, &AuthenticationId, &ExpirationTime, &TokenUser, -// TokenGroups, - &TokenGroups, + TokenGroups, TokenPrivileges, &TokenOwner, &TokenPrimaryGroup, &TokenDefaultDacl, &TokenSource); + FreeGroupSids(TokenGroups); RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); RtlFreeSid (UserSid); From 35f4d34682b581ecaa6556d2b7d12fb659ea2c30 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 10 Jul 2004 14:38:24 +0000 Subject: [PATCH 245/356] export GetSecurityInfo() svn path=/trunk/; revision=10064 --- reactos/lib/advapi32/advapi32.def | 4 ++-- reactos/lib/advapi32/advapi32.edf | 4 ++-- reactos/lib/advapi32/sec/misc.c | 22 +++++++++++++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index d868d825633..34bfc17c4c2 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -1,4 +1,4 @@ -; $Id: advapi32.def,v 1.19 2004/05/26 09:50:09 weiden Exp $ +; $Id: advapi32.def,v 1.20 2004/07/10 14:38:23 weiden Exp $ ; ; advapi32.def ; @@ -155,7 +155,7 @@ GetSecurityDescriptorGroup@12 GetSecurityDescriptorLength@4 GetSecurityDescriptorOwner@12 GetSecurityDescriptorSacl@16 -;GetSecurityInfo@32 +GetSecurityInfo@32 GetServiceDisplayNameA@16 GetServiceDisplayNameW@16 GetServiceKeyNameA@16 diff --git a/reactos/lib/advapi32/advapi32.edf b/reactos/lib/advapi32/advapi32.edf index b5985fed2ed..180ba865a45 100644 --- a/reactos/lib/advapi32/advapi32.edf +++ b/reactos/lib/advapi32/advapi32.edf @@ -1,4 +1,4 @@ -; $Id: advapi32.edf,v 1.39 2004/05/26 09:50:10 weiden Exp $ +; $Id: advapi32.edf,v 1.40 2004/07/10 14:38:23 weiden Exp $ ; ; advapi32.edf ; @@ -151,7 +151,7 @@ GetSecurityDescriptorGroup=GetSecurityDescriptorGroup@12 GetSecurityDescriptorLength=GetSecurityDescriptorLength@4 GetSecurityDescriptorOwner=GetSecurityDescriptorOwner@12 GetSecurityDescriptorSacl=GetSecurityDescriptorSacl@16 -;GetSecurityInfo=GetSecurityInfo@32 +GetSecurityInfo=GetSecurityInfo@32 GetServiceDisplayNameA=GetServiceDisplayNameA@16 GetServiceDisplayNameW=GetServiceDisplayNameW@16 GetServiceKeyNameA=GetServiceKeyNameA@16 diff --git a/reactos/lib/advapi32/sec/misc.c b/reactos/lib/advapi32/sec/misc.c index 37c7668a196..84ad8294c0a 100644 --- a/reactos/lib/advapi32/sec/misc.c +++ b/reactos/lib/advapi32/sec/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.20 2004/07/09 20:10:45 navaraf Exp $ +/* $Id: misc.c,v 1.21 2004/07/10 14:38:24 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -668,4 +668,24 @@ SetNamedSecurityInfoA(LPSTR pObjectName, return ERROR_CALL_NOT_IMPLEMENTED; } + +/********************************************************************** + * GetSecurityInfo EXPORTED + * + * @unimplemented + */ +DWORD STDCALL +GetSecurityInfo(HANDLE handle, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID* ppsidOwner, + PSID* ppsidGroup, + PACL* ppDacl, + PACL* ppSacl, + PSECURITY_DESCRIPTOR* ppSecurityDescriptor) +{ + DPRINT1("GetSecurityInfo: stub\n"); + return ERROR_CALL_NOT_IMPLEMENTED; +} + /* EOF */ From 3768902d9b18801d06124f0ed539ec82d894623a Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 10 Jul 2004 17:01:03 +0000 Subject: [PATCH 246/356] - Implemented NtQueryVirtualMemory for unallocated regions. - Fixed some minor bugs in NtQueryVirtualMemory and its related query functions. svn path=/trunk/; revision=10065 --- reactos/ntoskrnl/include/internal/mm.h | 2 + reactos/ntoskrnl/mm/anonmem.c | 7 +- reactos/ntoskrnl/mm/marea.c | 47 +++++++++ reactos/ntoskrnl/mm/section.c | 8 +- reactos/ntoskrnl/mm/virtual.c | 132 +++++++++++++++++-------- reactos/ntoskrnl/ps/create.c | 8 +- 6 files changed, 152 insertions(+), 52 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 8abd58c130d..18baa020684 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -203,6 +203,8 @@ NTSTATUS MmCreateMemoryArea(struct _EPROCESS* Process, PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL); MEMORY_AREA* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace, PVOID Address); +ULONG MmFindGapAtAddress(PMADDRESS_SPACE AddressSpace, + PVOID Address); NTSTATUS MmInitMemoryAreas(VOID); VOID MiInitializeNonPagedPool(VOID); NTSTATUS MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace, diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index c869b6c3658..0c92ce64392 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: anonmem.c,v 1.28 2004/06/06 08:36:31 hbirr Exp $ +/* $Id: anonmem.c,v 1.29 2004/07/10 17:01:03 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/anonmem.c @@ -887,8 +887,9 @@ MmQueryAnonMem(PMEMORY_AREA MemoryArea, Region = MmFindRegion(MemoryArea->BaseAddress, &MemoryArea->Data.VirtualMemoryData.RegionListHead, Address, &RegionBase); - Info->AllocationBase = RegionBase; - Info->AllocationProtect = Region->Protect; /* FIXME */ + Info->BaseAddress = RegionBase; + Info->AllocationBase = MemoryArea->BaseAddress; + Info->AllocationProtect = MemoryArea->Attributes; Info->RegionSize = (char*)RegionBase + Region->Length - (char*)Info->BaseAddress; Info->State = Region->Type; Info->Protect = Region->Protect; diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index 092cb8eb263..4ea1d3f66a9 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -346,6 +346,53 @@ PVOID MmFindGap(PMADDRESS_SPACE AddressSpace, ULONG Length, BOOL TopDown) return MmFindGapBottomUp(AddressSpace, Length); } +ULONG MmFindGapAtAddress(PMADDRESS_SPACE AddressSpace, PVOID Address) +{ + PLIST_ENTRY current_entry, ListHead; + PMEMORY_AREA current; + + Address = (PVOID)PAGE_ROUND_DOWN(Address); + + if (AddressSpace->LowestAddress < KERNEL_BASE) + { + if (Address >= (PVOID)KERNEL_BASE) + { + return 0; + } + } + else + { + if ((ULONG_PTR)Address < AddressSpace->LowestAddress) + { + return 0; + } + } + + ListHead = &AddressSpace->MAreaListHead; + + current_entry = ListHead->Flink; + while (current_entry != ListHead) + { + current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); + if (current->BaseAddress <= Address && Address < current->BaseAddress + current->Length) + { + return 0; + } + else if (current->BaseAddress > Address) + { + return (ULONG_PTR)current->BaseAddress - (ULONG_PTR)Address; + } + current_entry = current_entry->Flink; + } + if (AddressSpace->LowestAddress < KERNEL_BASE) + { + return KERNEL_BASE - (ULONG_PTR)Address; + } + else + { + return 0 - (ULONG_PTR)Address; + } +} NTSTATUS INIT_FUNCTION MmInitMemoryAreas(VOID) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 9db45c2dfb8..9d8b9b32bd3 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: section.c,v 1.152 2004/06/20 10:21:48 navaraf Exp $ +/* $Id: section.c,v 1.153 2004/07/10 17:01:02 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -2035,7 +2035,7 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, } } KeReleaseSpinLock(&Section->ViewListLock, oldIrql); - Info->BaseAddress = MemoryArea->BaseAddress; + Info->BaseAddress = RegionBaseAddress; Info->AllocationProtect = MemoryArea->Attributes; Info->Type = MEM_IMAGE; } @@ -2043,10 +2043,10 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, { Info->BaseAddress = RegionBaseAddress; Info->AllocationBase = MemoryArea->BaseAddress; - Info->AllocationProtect = Region->Protect; + Info->AllocationProtect = MemoryArea->Attributes; Info->Type = MEM_MAPPED; } - Info->RegionSize = MemoryArea->Length; + Info->RegionSize = PAGE_ROUND_UP(MemoryArea->Length); Info->State = MEM_COMMIT; Info->Protect = Region->Protect; diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 44c966ce914..403ff839235 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: virtual.c,v 1.77 2004/07/09 20:14:49 navaraf Exp $ +/* $Id: virtual.c,v 1.78 2004/07/10 17:01:02 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -132,6 +132,12 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, MEMORY_AREA* MemoryArea; ULONG ResultLength = 0; PMADDRESS_SPACE AddressSpace; + KPROCESSOR_MODE PrevMode; + union + { + MEMORY_BASIC_INFORMATION BasicInfo; + } + VirtualMemoryInfo; DPRINT("NtQueryVirtualMemory(ProcessHandle %x, Address %x, " "VirtualMemoryInformationClass %d, VirtualMemoryInformation %x, " @@ -139,20 +145,33 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, VirtualMemoryInformationClass,VirtualMemoryInformation, Length,ResultLength); - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_QUERY_INFORMATION, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); + PrevMode = ExGetPreviousMode(); - if (!NT_SUCCESS(Status)) + if (PrevMode == UserMode && Address >= (PVOID)KERNEL_BASE) { - DPRINT("NtQueryVirtualMemory() = %x\n",Status); - return(Status); + return STATUS_INVALID_PARAMETER; } - AddressSpace = &Process->AddressSpace; + if (Address < (PVOID)KERNEL_BASE) + { + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_QUERY_INFORMATION, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT("NtQueryVirtualMemory() = %x\n",Status); + return(Status); + } + AddressSpace = &Process->AddressSpace; + } + else + { + AddressSpace = MmGetKernelAddressSpace(); + } MmLockAddressSpace(AddressSpace); MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, Address); @@ -160,47 +179,65 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, { case MemoryBasicInformation: { - PMEMORY_BASIC_INFORMATION Info = - (PMEMORY_BASIC_INFORMATION)VirtualMemoryInformation; - + PMEMORY_BASIC_INFORMATION Info = &VirtualMemoryInfo.BasicInfo; if (Length != sizeof(MEMORY_BASIC_INFORMATION)) { MmUnlockAddressSpace(AddressSpace); ObDereferenceObject(Process); return(STATUS_INFO_LENGTH_MISMATCH); } - + if (MemoryArea == NULL) { + Info->Type = 0; Info->State = MEM_FREE; + Info->Protect = PAGE_NOACCESS; + Info->AllocationProtect = 0; Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); - Info->AllocationBase = 0; - Info->AllocationProtect = 0; - /* TODO: Find the next memory area and set RegionSize! */ - /* Since programs might depend on RegionSize for - * iteration, we for now just make up a value. - */ - Info->RegionSize = (Address > (PVOID)0x80000000) ? 0 : 0x10000; - Info->Protect = PAGE_NOACCESS; - Info->Type = 0; + Info->AllocationBase = NULL; + Info->RegionSize = MmFindGapAtAddress(AddressSpace, Info->BaseAddress); Status = STATUS_SUCCESS; ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - } - else if (MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY) - { - Status = MmQueryAnonMem(MemoryArea, Address, Info, - &ResultLength); - } - else if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) - { - Status = MmQuerySectionView(MemoryArea, Address, Info, - &ResultLength); - } - else - { - Status = STATUS_UNSUCCESSFUL; - ResultLength = 0; - } + } + else + { + switch(MemoryArea->Type) + { + case MEMORY_AREA_VIRTUAL_MEMORY: + Status = MmQueryAnonMem(MemoryArea, Address, Info, + &ResultLength); + break; + case MEMORY_AREA_SECTION_VIEW: + Status = MmQuerySectionView(MemoryArea, Address, Info, + &ResultLength); + break; + case MEMORY_AREA_NO_ACCESS: + Info->Type = 0; + Info->State = MEM_FREE; + Info->Protect = MemoryArea->Attributes; + Info->AllocationProtect = MemoryArea->Attributes; + Info->BaseAddress = MemoryArea->BaseAddress; + Info->AllocationBase = MemoryArea->BaseAddress; + Info->RegionSize = MemoryArea->Length; + Status = STATUS_SUCCESS; + ResultLength = sizeof(MEMORY_BASIC_INFORMATION); + break; + case MEMORY_AREA_SHARED_DATA: + Info->Type = 0; + Info->State = MEM_COMMIT; + Info->Protect = MemoryArea->Attributes; + Info->AllocationProtect = MemoryArea->Attributes; + Info->BaseAddress = MemoryArea->BaseAddress; + Info->AllocationBase = MemoryArea->BaseAddress; + Info->RegionSize = MemoryArea->Length; + Status = STATUS_SUCCESS; + ResultLength = sizeof(MEMORY_BASIC_INFORMATION); + break; + default: + Status = STATUS_UNSUCCESSFUL; + ResultLength = 0; + } + } break; } @@ -213,7 +250,20 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle, } MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Address < (PVOID)KERNEL_BASE) + { + ObDereferenceObject(Process); + } + + if (NT_SUCCESS(Status) && ResultLength > 0) + { + Status = MmCopyToCaller(VirtualMemoryInformation, &VirtualMemoryInfo, ResultLength); + if (!NT_SUCCESS(Status)) + { + ResultLength = 0; + } + } + if (UnsafeResultLength != NULL) { MmCopyToCaller(UnsafeResultLength, &ResultLength, sizeof(ULONG)); diff --git a/reactos/ntoskrnl/ps/create.c b/reactos/ntoskrnl/ps/create.c index afca150bba6..7ac5cba25c7 100644 --- a/reactos/ntoskrnl/ps/create.c +++ b/reactos/ntoskrnl/ps/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.73 2004/03/24 22:00:39 ea Exp $ +/* $Id: create.c,v 1.74 2004/07/10 17:01:03 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -481,7 +481,7 @@ PsCreateTeb(HANDLE ProcessHandle, while (TRUE) { - Status = NtQueryVirtualMemory(ProcessHandle, + Status = ZwQueryVirtualMemory(ProcessHandle, TebBase, MemoryBasicInformation, &Info, @@ -489,14 +489,14 @@ PsCreateTeb(HANDLE ProcessHandle, &ResultLength); if (!NT_SUCCESS(Status)) { - CPRINT("NtQueryVirtualMemory (Status %x)\n", Status); + CPRINT("ZwQueryVirtualMemory (Status %x)\n", Status); KEBUGCHECK(0); } /* FIXME: Race between this and the above check */ if (Info.State == MEM_FREE) { /* The TEB must reside in user space */ - Status = NtAllocateVirtualMemory(ProcessHandle, + Status = ZwAllocateVirtualMemory(ProcessHandle, &TebBase, 0, &TebSize, From 43a041190d325c5885ba97c5e482ed87caf21370 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 10 Jul 2004 21:11:13 +0000 Subject: [PATCH 247/356] Removed Microsoft code. svn path=/trunk/; revision=10066 --- reactos/lib/mmdrv/auxil.c | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/reactos/lib/mmdrv/auxil.c b/reactos/lib/mmdrv/auxil.c index c4f6308060c..4d1ea8b4f05 100644 --- a/reactos/lib/mmdrv/auxil.c +++ b/reactos/lib/mmdrv/auxil.c @@ -36,43 +36,4 @@ APIENTRY DWORD auxMessage(UINT uDevice, } return MMSYSERR_NOERROR; - - -// WARNING: MS Code -- delete as soon as possible ! -/* MMRESULT mRet; - AUX_DD_VOLUME Volume; - - switch (uMsg) { - case AUXDM_GETDEVCAPS: - dprintf2(("AUXDM_GETDEVCAPS")); - return sndGetData(AuxDevice, uDevice, dwParam2, (LPBYTE)dwParam1, - IOCTL_AUX_GET_CAPABILITIES); - - case AUXDM_GETNUMDEVS: - dprintf2(("AUXDM_GETNUMDEVS")); - return sndGetNumDevs(AuxDevice); - - case AUXDM_GETVOLUME: - dprintf2(("AUXDM_GETVOLUME")); - - mRet = sndGetData(AuxDevice, uDevice, sizeof(Volume), - (PBYTE)&Volume, IOCTL_AUX_GET_VOLUME); - - if (mRet == MMSYSERR_NOERROR) { - *(LPDWORD)dwParam1 = - (DWORD)MAKELONG(HIWORD(Volume.Left), - HIWORD(Volume.Right)); - } - - return mRet; - - case AUXDM_SETVOLUME: - dprintf2(("AUXDM_SETVOLUME")); - Volume.Left = LOWORD(dwParam1) << 16; - Volume.Right = HIWORD(dwParam1) << 16; - - return sndSetData(AuxDevice, uDevice, sizeof(Volume), - (PBYTE)&Volume, IOCTL_AUX_SET_VOLUME); - } -*/ } From e32637bc50d473b974656d3ca9eae6484e43edf9 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Jul 2004 21:15:26 +0000 Subject: [PATCH 248/356] Fix default DACL of the logon token. svn path=/trunk/; revision=10067 --- reactos/lib/advapi32/misc/logon.c | 98 +++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 30 deletions(-) diff --git a/reactos/lib/advapi32/misc/logon.c b/reactos/lib/advapi32/misc/logon.c index 9059f09038e..6935632a9d2 100644 --- a/reactos/lib/advapi32/misc/logon.c +++ b/reactos/lib/advapi32/misc/logon.c @@ -1,4 +1,4 @@ -/* $Id: logon.c,v 1.8 2004/07/10 13:12:24 ekohl Exp $ +/* $Id: logon.c,v 1.9 2004/07/10 21:15:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -579,7 +579,8 @@ LogonUserW (LPWSTR lpszUsername, PSID UserSid = NULL; PSID PrimaryGroupSid = NULL; PSID OwnerSid = NULL; - ACL Dacl; + PSID LocalSystemSid; + PACL Dacl; NTSTATUS Status; SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; unsigned i; @@ -626,7 +627,7 @@ LogonUserW (LPWSTR lpszUsername, &OwnerSid); if (NULL == TokenGroups) { - RtlFreeSid (UserSid); + RtlFreeSid(UserSid); SetLastError(ERROR_OUTOFMEMORY); return FALSE; } @@ -639,7 +640,7 @@ LogonUserW (LPWSTR lpszUsername, if (NULL == TokenPrivileges) { FreeGroupSids(TokenGroups); - RtlFreeSid (UserSid); + RtlFreeSid(UserSid); SetLastError(ERROR_OUTOFMEMORY); return FALSE; } @@ -661,48 +662,85 @@ LogonUserW (LPWSTR lpszUsername, TokenOwner.Owner = OwnerSid; TokenPrimaryGroup.PrimaryGroup = PrimaryGroupSid; -// TokenPrimaryGroup.PrimaryGroup = UserSid; - Status = RtlCreateAcl (&Dacl, sizeof(ACL), ACL_REVISION); - if (!NT_SUCCESS(Status)) + + Dacl = RtlAllocateHeap(GetProcessHeap(), 0, 1024); + if (Dacl == NULL) { FreeGroupSids(TokenGroups); - RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); - RtlFreeSid (UserSid); + RtlFreeSid(UserSid); + SetLastError(ERROR_OUTOFMEMORY); return FALSE; } - TokenDefaultDacl.DefaultDacl = &Dacl; - - memcpy (TokenSource.SourceName, - "**ANON**", - 8); - Status = NtAllocateLocallyUniqueId (&TokenSource.SourceIdentifier); + Status = RtlCreateAcl(Dacl, 1024, ACL_REVISION); if (!NT_SUCCESS(Status)) { + RtlFreeHeap(GetProcessHeap(), 0, Dacl); FreeGroupSids(TokenGroups); RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); - RtlFreeSid (UserSid); + RtlFreeSid(UserSid); return FALSE; } - Status = NtCreateToken (phToken, - TOKEN_ALL_ACCESS, - &ObjectAttributes, - TokenPrimary, - &AuthenticationId, - &ExpirationTime, - &TokenUser, - TokenGroups, - TokenPrivileges, - &TokenOwner, - &TokenPrimaryGroup, - &TokenDefaultDacl, - &TokenSource); + RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + GENERIC_ALL, + OwnerSid); + RtlAllocateAndInitializeSid(&SystemAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &LocalSystemSid); + + /* SID: S-1-5-18 */ + RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + GENERIC_ALL, + LocalSystemSid); + + RtlFreeSid(LocalSystemSid); + + TokenDefaultDacl.DefaultDacl = Dacl; + + memcpy(TokenSource.SourceName, + "User32 ", + 8); + Status = NtAllocateLocallyUniqueId(&TokenSource.SourceIdentifier); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, Dacl); + FreeGroupSids(TokenGroups); + RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); + RtlFreeSid(UserSid); + return FALSE; + } + + Status = NtCreateToken(phToken, + TOKEN_ALL_ACCESS, + &ObjectAttributes, + TokenPrimary, + &AuthenticationId, + &ExpirationTime, + &TokenUser, + TokenGroups, + TokenPrivileges, + &TokenOwner, + &TokenPrimaryGroup, + &TokenDefaultDacl, + &TokenSource); + + RtlFreeHeap(GetProcessHeap(), 0, Dacl); FreeGroupSids(TokenGroups); RtlFreeHeap(GetProcessHeap(), 0, TokenPrivileges); - RtlFreeSid (UserSid); + RtlFreeSid(UserSid); return NT_SUCCESS(Status); } From 2396faea94b68ed751a58809063c2f754dbb1111 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 10 Jul 2004 21:19:46 +0000 Subject: [PATCH 249/356] Added msvfw32 ported from Wine. This fixes bug 388. svn path=/trunk/; revision=10068 --- reactos/lib/msvideo/.cvsignore | 9 + reactos/lib/msvideo/Makefile | 9 + reactos/lib/msvideo/Makefile.in | 22 + reactos/lib/msvideo/Makefile.ros-template | 21 + reactos/lib/msvideo/drawdib.c | 463 +++++++ reactos/lib/msvideo/mciwnd.c | 1419 +++++++++++++++++++++ reactos/lib/msvideo/msvfw32.rc | 38 + reactos/lib/msvideo/msvfw32.spec | 51 + reactos/lib/msvideo/msvfw32.spec.def | 43 + reactos/lib/msvideo/msvideo.spec | 68 + reactos/lib/msvideo/msvideo16.c | 910 +++++++++++++ reactos/lib/msvideo/msvideo_main.c | 1184 +++++++++++++++++ reactos/lib/msvideo/msvideo_private.h | 65 + reactos/lib/msvideo/vfw16.h | 130 ++ 14 files changed, 4432 insertions(+) create mode 100644 reactos/lib/msvideo/.cvsignore create mode 100644 reactos/lib/msvideo/Makefile create mode 100644 reactos/lib/msvideo/Makefile.in create mode 100644 reactos/lib/msvideo/Makefile.ros-template create mode 100644 reactos/lib/msvideo/drawdib.c create mode 100644 reactos/lib/msvideo/mciwnd.c create mode 100644 reactos/lib/msvideo/msvfw32.rc create mode 100644 reactos/lib/msvideo/msvfw32.spec create mode 100644 reactos/lib/msvideo/msvfw32.spec.def create mode 100644 reactos/lib/msvideo/msvideo.spec create mode 100644 reactos/lib/msvideo/msvideo16.c create mode 100644 reactos/lib/msvideo/msvideo_main.c create mode 100644 reactos/lib/msvideo/msvideo_private.h create mode 100644 reactos/lib/msvideo/vfw16.h diff --git a/reactos/lib/msvideo/.cvsignore b/reactos/lib/msvideo/.cvsignore new file mode 100644 index 00000000000..8f3b3e45db8 --- /dev/null +++ b/reactos/lib/msvideo/.cvsignore @@ -0,0 +1,9 @@ +*.coff +*.dll +*.sym +*.o +*.d +*.map +*.tmp +Makefile.ros +oleaut32.spec.def diff --git a/reactos/lib/msvideo/Makefile b/reactos/lib/msvideo/Makefile new file mode 100644 index 00000000000..36ab3ede514 --- /dev/null +++ b/reactos/lib/msvideo/Makefile @@ -0,0 +1,9 @@ +# $Id: Makefile,v 1.1 2004/07/10 21:19:46 sedwards Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/msvideo/Makefile.in b/reactos/lib/msvideo/Makefile.in new file mode 100644 index 00000000000..b52a912c7be --- /dev/null +++ b/reactos/lib/msvideo/Makefile.in @@ -0,0 +1,22 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = msvfw32.dll +IMPORTS = winmm comctl32 version user32 gdi32 advapi32 kernel32 ntdll +ALTNAMES = msvideo.dll +EXTRALIBS = $(LIBUNICODE) + +SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) + +C_SRCS = \ + mciwnd.c \ + msvideo_main.c \ + drawdib.c + +C_SRCS16 = \ + msvideo16.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/msvideo/Makefile.ros-template b/reactos/lib/msvideo/Makefile.ros-template new file mode 100644 index 00000000000..6bca328078d --- /dev/null +++ b/reactos/lib/msvideo/Makefile.ros-template @@ -0,0 +1,21 @@ +# $Id: Makefile.ros-template,v 1.1 2004/07/10 21:19:46 sedwards Exp $ + +TARGET_NAME = msvfw32 + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ + +TARGET_SDKLIBS = @IMPORTS@ libwine.a wine_uuid.a ntdll.a + +TARGET_BASE = $(TARGET_BASE_LIB_WINMM) + +TARGET_RC_SRCS = @RC_SRCS@ +TARGET_RC_BINSRC = @RC_BINSRC@ +TARGET_RC_BINARIES = @RC_BINARIES@ + +default: all + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/msvideo/drawdib.c b/reactos/lib/msvideo/drawdib.c new file mode 100644 index 00000000000..fa4c92ff35a --- /dev/null +++ b/reactos/lib/msvideo/drawdib.c @@ -0,0 +1,463 @@ +/* + * Copyright 2000 Bradley Baetz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * FIXME: Some flags are ignored + * + * Handle palettes + */ + +#include +#include "msvideo_private.h" + +#include "wingdi.h" +#include "winuser.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msvideo); + +typedef struct tagWINE_HDD { + HDC hdc; + INT dxDst; + INT dyDst; + LPBITMAPINFOHEADER lpbi; + INT dxSrc; + INT dySrc; + HPALETTE hpal; /* Palette to use for the DIB */ + BOOL begun; /* DrawDibBegin has been called */ + LPBITMAPINFOHEADER lpbiOut; /* Output format */ + HIC hic; /* HIC for decompression */ + HDC hMemDC; /* DC for buffering */ + HBITMAP hOldDib; /* Original Dib */ + HBITMAP hDib; /* DibSection */ + LPVOID lpvbits; /* Buffer for holding decompressed dib */ + HDRAWDIB hSelf; + struct tagWINE_HDD* next; +} WINE_HDD; + +int num_colours(LPBITMAPINFOHEADER lpbi) +{ + if(lpbi->biClrUsed) + return lpbi->biClrUsed; + if(lpbi->biBitCount<=8) + return 1<biBitCount; + return 0; +} + +static WINE_HDD* HDD_FirstHdd /* = NULL */; + +static WINE_HDD* MSVIDEO_GetHddPtr(HDRAWDIB hd) +{ + WINE_HDD* hdd; + + for (hdd = HDD_FirstHdd; hdd != NULL && hdd->hSelf != hd; hdd = hdd->next); + return hdd; +} + +static DWORD HDD_HandleRef = 1; + +/*********************************************************************** + * DrawDibOpen [MSVFW32.@] + */ +HDRAWDIB VFWAPI DrawDibOpen(void) +{ + WINE_HDD* whdd; + + TRACE("(void)\n"); + + whdd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_HDD)); + TRACE("=> %p\n", whdd); + + while (MSVIDEO_GetHddPtr((HDRAWDIB)HDD_HandleRef) != NULL) HDD_HandleRef++; + whdd->hSelf = (HDRAWDIB)HDD_HandleRef++; + + whdd->next = HDD_FirstHdd; + HDD_FirstHdd = whdd; + + return whdd->hSelf; +} + +/*********************************************************************** + * DrawDibClose [MSVFW32.@] + */ +BOOL VFWAPI DrawDibClose(HDRAWDIB hdd) +{ + WINE_HDD* whdd = MSVIDEO_GetHddPtr(hdd); + WINE_HDD** p; + + TRACE("(%p)\n", hdd); + + if (!whdd) return FALSE; + + if (whdd->begun) DrawDibEnd(hdd); + + for (p = &HDD_FirstHdd; *p != NULL; p = &((*p)->next)) + { + if (*p == whdd) + { + *p = whdd->next; + break; + } + } + + HeapFree(GetProcessHeap(), 0, whdd); + + return TRUE; +} + +/*********************************************************************** + * DrawDibEnd [MSVFW32.@] + */ +BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd) +{ + BOOL ret = TRUE; + WINE_HDD *whdd = MSVIDEO_GetHddPtr(hdd); + + TRACE("(%p)\n", hdd); + + whdd->hpal = 0; /* Do not free this */ + whdd->hdc = 0; + if (whdd->lpbi) + { + HeapFree(GetProcessHeap(), 0, whdd->lpbi); + whdd->lpbi = NULL; + } + if (whdd->lpbiOut) + { + HeapFree(GetProcessHeap(), 0, whdd->lpbiOut); + whdd->lpbiOut = NULL; + } + + whdd->begun = FALSE; + + /*if (whdd->lpvbits) + HeapFree(GetProcessHeap(), 0, whdd->lpvbuf);*/ + + if (whdd->hMemDC) + { + SelectObject(whdd->hMemDC, whdd->hOldDib); + DeleteDC(whdd->hMemDC); + whdd->hMemDC = 0; + } + + if (whdd->hDib) DeleteObject(whdd->hDib); + whdd->hDib = 0; + + if (whdd->hic) + { + ICDecompressEnd(whdd->hic); + ICClose(whdd->hic); + whdd->hic = 0; + } + + whdd->lpvbits = NULL; + + return ret; +} + +/*********************************************************************** + * DrawDibBegin [MSVFW32.@] + */ +BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd, + HDC hdc, + INT dxDst, + INT dyDst, + LPBITMAPINFOHEADER lpbi, + INT dxSrc, + INT dySrc, + UINT wFlags) +{ + BOOL ret = TRUE; + WINE_HDD *whdd; + + TRACE("(%p,%p,%d,%d,%p,%d,%d,0x%08lx)\n", + hdd, hdc, dxDst, dyDst, lpbi, dxSrc, dySrc, (DWORD)wFlags); + + TRACE("lpbi: %ld,%ld/%ld,%d,%d,%ld,%ld,%ld,%ld,%ld,%ld\n", + lpbi->biSize, lpbi->biWidth, lpbi->biHeight, lpbi->biPlanes, + lpbi->biBitCount, lpbi->biCompression, lpbi->biSizeImage, + lpbi->biXPelsPerMeter, lpbi->biYPelsPerMeter, lpbi->biClrUsed, + lpbi->biClrImportant); + + if (wFlags & ~(DDF_BUFFER)) + FIXME("wFlags == 0x%08x not handled\n", wFlags & ~(DDF_BUFFER)); + + whdd = MSVIDEO_GetHddPtr(hdd); + if (!whdd) return FALSE; + + if (whdd->begun) DrawDibEnd(hdd); + + if (lpbi->biCompression) + { + DWORD size = 0; + + whdd->hic = ICOpen(ICTYPE_VIDEO, lpbi->biCompression, ICMODE_DECOMPRESS); + if (!whdd->hic) + { + WARN("Could not open IC. biCompression == 0x%08lx\n", lpbi->biCompression); + ret = FALSE; + } + + if (ret) + { + size = ICDecompressGetFormat(whdd->hic, lpbi, NULL); + if (size == ICERR_UNSUPPORTED) + { + WARN("Codec doesn't support GetFormat, giving up.\n"); + ret = FALSE; + } + } + + if (ret) + { + whdd->lpbiOut = HeapAlloc(GetProcessHeap(), 0, size); + + if (ICDecompressGetFormat(whdd->hic, lpbi, whdd->lpbiOut) != ICERR_OK) + ret = FALSE; + } + + if (ret) + { + /* FIXME: Use Ex functions if available? */ + if (ICDecompressBegin(whdd->hic, lpbi, whdd->lpbiOut) != ICERR_OK) + ret = FALSE; + + TRACE("biSizeImage == %ld\n", whdd->lpbiOut->biSizeImage); + TRACE("biCompression == %ld\n", whdd->lpbiOut->biCompression); + TRACE("biBitCount == %d\n", whdd->lpbiOut->biBitCount); + } + } + else + { + DWORD dwSize; + /* No compression */ + TRACE("Not compressed!\n"); + dwSize = lpbi->biSize + num_colours(lpbi)*sizeof(RGBQUAD); + whdd->lpbiOut = HeapAlloc(GetProcessHeap(), 0, dwSize); + memcpy(whdd->lpbiOut, lpbi, dwSize); + } + + if (ret) + { + /*whdd->lpvbuf = HeapAlloc(GetProcessHeap(), 0, whdd->lpbiOut->biSizeImage);*/ + + whdd->hMemDC = CreateCompatibleDC(hdc); + TRACE("Creating: %ld, %p\n", whdd->lpbiOut->biSize, whdd->lpvbits); + whdd->hDib = CreateDIBSection(whdd->hMemDC, (BITMAPINFO *)whdd->lpbiOut, DIB_RGB_COLORS, &(whdd->lpvbits), 0, 0); + if (!whdd->hDib) + { + TRACE("Error: %ld\n", GetLastError()); + } + TRACE("Created: %p,%p\n", whdd->hDib, whdd->lpvbits); + whdd->hOldDib = SelectObject(whdd->hMemDC, whdd->hDib); + } + + if (ret) + { + whdd->hdc = hdc; + whdd->dxDst = dxDst; + whdd->dyDst = dyDst; + whdd->lpbi = HeapAlloc(GetProcessHeap(), 0, lpbi->biSize); + memcpy(whdd->lpbi, lpbi, lpbi->biSize); + whdd->dxSrc = dxSrc; + whdd->dySrc = dySrc; + whdd->begun = TRUE; + whdd->hpal = 0; + } + else + { + if (whdd->hic) + ICClose(whdd->hic); + if (whdd->lpbiOut) + { + HeapFree(GetProcessHeap(), 0, whdd->lpbiOut); + whdd->lpbiOut = NULL; + } + } + + return ret; +} + +/********************************************************************** + * DrawDibDraw [MSVFW32.@] + */ +BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc, + INT xDst, INT yDst, INT dxDst, INT dyDst, + LPBITMAPINFOHEADER lpbi, + LPVOID lpBits, + INT xSrc, INT ySrc, INT dxSrc, INT dySrc, + UINT wFlags) +{ + WINE_HDD *whdd; + BOOL ret = TRUE; + + TRACE("(%p,%p,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08lx)\n", + hdd, hdc, xDst, yDst, dxDst, dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, (DWORD)wFlags); + + whdd = MSVIDEO_GetHddPtr(hdd); + if (!whdd) return FALSE; + + if (wFlags & ~(DDF_SAME_HDC | DDF_SAME_DRAW | DDF_NOTKEYFRAME | DDF_UPDATE | DDF_DONTDRAW)) + FIXME("wFlags == 0x%08lx not handled\n", (DWORD)wFlags); + + if (!lpBits) + { + /* Undocumented? */ + lpBits = (LPSTR)lpbi + (WORD)(lpbi->biSize) + (WORD)(num_colours(lpbi)*sizeof(RGBQUAD)); + } + + +#define CHANGED(x) (whdd->x != x) + + if ((!whdd->begun) || + (!(wFlags & DDF_SAME_HDC) && CHANGED(hdc)) || + (!(wFlags & DDF_SAME_DRAW) && (CHANGED(lpbi) || CHANGED(dxSrc) || CHANGED(dySrc) || CHANGED(dxDst) || CHANGED(dyDst)))) + { + TRACE("Something changed!\n"); + ret = DrawDibBegin(hdd, hdc, dxDst, dyDst, lpbi, dxSrc, dySrc, 0); + } + +#undef CHANGED + + if ((dxDst == -1) && (dyDst == -1)) + { + dxDst = dxSrc; + dyDst = dySrc; + } + + if (!(wFlags & DDF_UPDATE)) + { + /* biSizeImage may be set to 0 for BI_RGB (uncompressed) bitmaps */ + if ((lpbi->biCompression == BI_RGB) && (lpbi->biSizeImage == 0)) + lpbi->biSizeImage = ((lpbi->biWidth * lpbi->biBitCount + 31) / 32) * 4 * lpbi->biHeight; + + if (lpbi->biCompression) + { + DWORD flags = 0; + + TRACE("Compression == 0x%08lx\n", lpbi->biCompression); + + if (wFlags & DDF_NOTKEYFRAME) + flags |= ICDECOMPRESS_NOTKEYFRAME; + + ICDecompress(whdd->hic, flags, lpbi, lpBits, whdd->lpbiOut, whdd->lpvbits); + } + else + { + memcpy(whdd->lpvbits, lpBits, lpbi->biSizeImage); + } + } + if (!(wFlags & DDF_DONTDRAW) && whdd->hpal) + SelectPalette(hdc, whdd->hpal, FALSE); + + if (!(StretchBlt(whdd->hdc, xDst, yDst, dxDst, dyDst, whdd->hMemDC, xSrc, ySrc, dxSrc, dySrc, SRCCOPY))) + ret = FALSE; + + return ret; +} + +/************************************************************************* + * DrawDibStart [MSVFW32.@] + */ +BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate) { + FIXME("(%p, %ld), stub\n", hdd, rate); + return TRUE; +} + +/************************************************************************* + * DrawDibStop [MSVFW32.@] + */ +BOOL VFWAPI DrawDibStop(HDRAWDIB hdd) { + FIXME("(%p), stub\n", hdd); + return TRUE; +} + +/*********************************************************************** + * DrawDibSetPalette [MSVFW32.@] + */ +BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal) +{ + WINE_HDD *whdd; + + TRACE("(%p, %p)\n", hdd, hpal); + + whdd = MSVIDEO_GetHddPtr(hdd); + if (!whdd) return FALSE; + + whdd->hpal = hpal; + + if (whdd->begun) + { + SelectPalette(whdd->hdc, hpal, 0); + RealizePalette(whdd->hdc); + } + + return TRUE; +} + +/*********************************************************************** + * DrawDibGetPalette [MSVFW32.@] + */ +HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB hdd) +{ + WINE_HDD *whdd; + + TRACE("(%p)\n", hdd); + + whdd = MSVIDEO_GetHddPtr(hdd); + if (!whdd) return FALSE; + + return whdd->hpal; +} + +/*********************************************************************** + * DrawDibRealize [MSVFW32.@] + */ +UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground) +{ + WINE_HDD *whdd; + HPALETTE oldPal; + UINT ret = 0; + + FIXME("(%p, %p, %d), stub\n", hdd, hdc, fBackground); + + whdd = MSVIDEO_GetHddPtr(hdd); + if (!whdd) return FALSE; + + if (!whdd || !(whdd->begun)) + { + ret = 0; + goto out; + } + + if (!whdd->hpal) + whdd->hpal = CreateHalftonePalette(hdc); + + oldPal = SelectPalette(hdc, whdd->hpal, fBackground); + ret = RealizePalette(hdc); + + out: + TRACE("=> %u\n", ret); + return ret; +} + +DWORD VFWAPI DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi) +{ + FIXME("(%p) stub\n", lpbi); + + return PD_CAN_DRAW_DIB; +} diff --git a/reactos/lib/msvideo/mciwnd.c b/reactos/lib/msvideo/mciwnd.c new file mode 100644 index 00000000000..9260c01e719 --- /dev/null +++ b/reactos/lib/msvideo/mciwnd.c @@ -0,0 +1,1419 @@ +/* + * Copyright 2000 Eric Pouech + * Copyright 2003 Dmitry Timoshkov + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * FIXME: + * Add support for all remaining MCI_ commands and MCIWNDM_ messages. + * Add support for MCIWNDF_RECORD. + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" +#include "winternl.h" +#include "vfw.h" +#include "digitalv.h" +#include "commctrl.h" +#include "wine/unicode.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mci); + +extern HMODULE MSVFW32_hModule; +static const WCHAR mciWndClassW[] = {'M','C','I','W','n','d','C','l','a','s','s',0}; + +typedef struct +{ + DWORD dwStyle; + MCIDEVICEID mci; + HDRVR hdrv; + int alias; + UINT dev_type; + UINT mode; + long position; + SIZE size; /* size of the original frame rect */ + int zoom; + LPWSTR lpName; + HWND hWnd, hwndOwner; + UINT uTimer; + MCIERROR lasterror; + WCHAR return_string[128]; + WORD active_timer, inactive_timer; +} MCIWndInfo; + +static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam); + +#define CTL_PLAYSTOP 0x3200 +#define CTL_MENU 0x3201 +#define CTL_TRACKBAR 0x3202 + +/*********************************************************************** + * MCIWndRegisterClass [MSVFW32.@] + * + * NOTE: Native always uses its own hInstance + */ +BOOL VFWAPIV MCIWndRegisterClass(void) +{ + WNDCLASSW wc; + + /* Since we are going to register a class belonging to MSVFW32 + * and later we will create windows with a different hInstance + * CS_GLOBALCLASS is needed. And because the second attempt + * to register a global class will fail we need to test whether + * the class was already registered. + */ + wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_OWNDC | CS_GLOBALCLASS; + wc.lpfnWndProc = MCIWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = sizeof(MCIWndInfo*); + wc.hInstance = MSVFW32_hModule; + wc.hIcon = 0; + wc.hCursor = LoadCursorW(0, MAKEINTRESOURCEW(IDC_ARROW)); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = mciWndClassW; + + if (RegisterClassW(&wc)) return TRUE; + if (GetLastError() == ERROR_CLASS_ALREADY_EXISTS) return TRUE; + + return FALSE; +} + +/*********************************************************************** + * MCIWndCreateW [MSVFW32.@] + */ +HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance, + DWORD dwStyle, LPCWSTR szFile) +{ + TRACE("%p %p %lx %s\n", hwndParent, hInstance, dwStyle, debugstr_w(szFile)); + + MCIWndRegisterClass(); + + if (!hInstance) hInstance = GetModuleHandleW(0); + + if (hwndParent) + dwStyle |= WS_VISIBLE | WS_BORDER /*| WS_CHILD*/; + else + dwStyle |= WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; + + return CreateWindowExW(0, mciWndClassW, NULL, + dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + 0, 0, 300, 0, + hwndParent, 0, hInstance, (LPVOID)szFile); +} + +/*********************************************************************** + * MCIWndCreate [MSVFW32.@] + * MCIWndCreateA [MSVFW32.@] + */ +HWND VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance, + DWORD dwStyle, LPCSTR szFile) +{ + HWND ret; + UNICODE_STRING fileW; + + if (szFile) + RtlCreateUnicodeStringFromAsciiz(&fileW, szFile); + else + fileW.Buffer = NULL; + + ret = MCIWndCreateW(hwndParent, hInstance, dwStyle, fileW.Buffer); + + RtlFreeUnicodeString(&fileW); + return ret; +} + +static inline void MCIWND_notify_mode(MCIWndInfo *mwi) +{ + if (mwi->dwStyle & MCIWNDF_NOTIFYMODE) + { + UINT new_mode = SendMessageW(mwi->hWnd, MCIWNDM_GETMODEW, 0, 0); + if (new_mode != mwi->mode) + { + mwi->mode = new_mode; + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMODE, (WPARAM)mwi->hWnd, new_mode); + } + } +} + +static inline void MCIWND_notify_pos(MCIWndInfo *mwi) +{ + if (mwi->dwStyle & MCIWNDF_NOTIFYPOS) + { + long new_pos = SendMessageW(mwi->hWnd, MCIWNDM_GETPOSITIONW, 0, 0); + if (new_pos != mwi->position) + { + mwi->position = new_pos; + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYPOS, (WPARAM)mwi->hWnd, new_pos); + } + } +} + +static inline void MCIWND_notify_size(MCIWndInfo *mwi) +{ + if (mwi->dwStyle & MCIWNDF_NOTIFYSIZE) + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYSIZE, (WPARAM)mwi->hWnd, 0); +} + +static inline void MCIWND_notify_error(MCIWndInfo *mwi) +{ + if (mwi->dwStyle & MCIWNDF_NOTIFYERROR) + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYERROR, (WPARAM)mwi->hWnd, (LPARAM)mwi->lasterror); +} + +static void MCIWND_UpdateState(MCIWndInfo *mwi) +{ + WCHAR buffer[1024]; + + if (!mwi->mci) + { + /* FIXME: get this from resources */ + static const WCHAR no_deviceW[] = {'N','o',' ','D','e','v','i','c','e',0}; + SetWindowTextW(mwi->hWnd, no_deviceW); + return; + } + + MCIWND_notify_pos(mwi); + + if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR)) + SendDlgItemMessageW(mwi->hWnd, CTL_TRACKBAR, TBM_SETPOS, TRUE, mwi->position); + + if (!(mwi->dwStyle & MCIWNDF_SHOWALL)) + return; + + if ((mwi->dwStyle & MCIWNDF_SHOWNAME) && mwi->lpName) + strcpyW(buffer, mwi->lpName); + else + *buffer = 0; + + if (mwi->dwStyle & (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) + { + static const WCHAR spaceW[] = {' ',0}; + static const WCHAR l_braceW[] = {'(',0}; + + if (*buffer) strcatW(buffer, spaceW); + strcatW(buffer, l_braceW); + } + + if (mwi->dwStyle & MCIWNDF_SHOWPOS) + { + WCHAR posW[64]; + + posW[0] = 0; + SendMessageW(mwi->hWnd, MCIWNDM_GETPOSITIONW, 64, (LPARAM)posW); + strcatW(buffer, posW); + } + + if ((mwi->dwStyle & (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) == (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) + { + static const WCHAR dashW[] = {' ','-',' ',0}; + strcatW(buffer, dashW); + } + + if (mwi->dwStyle & MCIWNDF_SHOWMODE) + { + WCHAR modeW[64]; + + modeW[0] = 0; + SendMessageW(mwi->hWnd, MCIWNDM_GETMODEW, 64, (LPARAM)modeW); + strcatW(buffer, modeW); + } + + if (mwi->dwStyle & (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) + { + static const WCHAR r_braceW[] = {')',0}; + strcatW(buffer, r_braceW); + } + + TRACE("=> '%s'\n", debugstr_w(buffer)); + SetWindowTextW(mwi->hWnd, buffer); +} + +static LRESULT MCIWND_Create(HWND hWnd, LPCREATESTRUCTW cs) +{ + HWND hChld; + MCIWndInfo *mwi; + static const WCHAR buttonW[] = {'b','u','t','t','o','n',0}; + + mwi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*mwi)); + if (!mwi) return -1; + + SetWindowLongW(hWnd, 0, (LPARAM)mwi); + + mwi->dwStyle = cs->style; + /* There is no need to show stats if there is no caption */ + if ((mwi->dwStyle & WS_CAPTION) != WS_CAPTION) + mwi->dwStyle &= ~MCIWNDF_SHOWALL; + + mwi->hWnd = hWnd; + mwi->hwndOwner = cs->hwndParent; + mwi->active_timer = 500; + mwi->inactive_timer = 2000; + mwi->mode = MCI_MODE_NOT_READY; + mwi->position = -1; + mwi->zoom = 100; + + if (!(mwi->dwStyle & MCIWNDF_NOMENU)) + { + static const WCHAR menuW[] = {'M','e','n','u',0}; + + hChld = CreateWindowExW(0, buttonW, menuW, WS_CHILD|WS_VISIBLE, 32, cs->cy, 32, 32, + hWnd, (HMENU)CTL_MENU, cs->hInstance, 0L); + TRACE("Get Button2: %p\n", hChld); + } + + if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR)) + { + INITCOMMONCONTROLSEX init; + static const WCHAR playW[] = {'P','l','a','y',0}; + + /* adding the other elements: play/stop button, menu button, status */ + hChld = CreateWindowExW(0, buttonW, playW, WS_CHILD|WS_VISIBLE, 0, cs->cy, 32, 32, + hWnd, (HMENU)CTL_PLAYSTOP, cs->hInstance, 0L); + TRACE("Get Button1: %p\n", hChld); + + init.dwSize = sizeof(init); + init.dwICC = ICC_BAR_CLASSES; + InitCommonControlsEx(&init); + + hChld = CreateWindowExW(0, TRACKBAR_CLASSW, NULL, WS_CHILD|WS_VISIBLE, 64, cs->cy, cs->cx - 64, 32, + hWnd, (HMENU)CTL_TRACKBAR, cs->hInstance, 0L); + TRACE("Get status: %p\n", hChld); + } + + /* This sets the default window size */ + SendMessageW(hWnd, MCI_CLOSE, 0, 0); + + if (cs->lpCreateParams) + { + LPARAM lParam; + + /* MCI wnd class is prepared to be embedded as an MDI child window */ + if (cs->dwExStyle & WS_EX_MDICHILD) + { + MDICREATESTRUCTW *mdics = (MDICREATESTRUCTW *)cs->lpCreateParams; + lParam = mdics->lParam; + } + else + lParam = (LPARAM)cs->lpCreateParams; + + /* If it's our internal class pointer, file name is a unicode string */ + if (cs->lpszClass == mciWndClassW) + SendMessageW(hWnd, MCIWNDM_OPENW, 0, lParam); + else + { + /* Otherwise let's try to figure out what string format is used */ + HWND parent = cs->hwndParent; + if (!parent) parent = GetWindow(hWnd, GW_OWNER); + + SendMessageW(hWnd, IsWindowUnicode(parent) ? MCIWNDM_OPENW : MCIWNDM_OPENA, 0, lParam); + } + } + + return 0; +} + +static void MCIWND_ToggleState(MCIWndInfo *mwi) +{ + switch (SendMessageW(mwi->hWnd, MCIWNDM_GETMODEW, 0, 0)) + { + case MCI_MODE_NOT_READY: + case MCI_MODE_RECORD: + case MCI_MODE_SEEK: + case MCI_MODE_OPEN: + TRACE("Cannot do much...\n"); + break; + + case MCI_MODE_PAUSE: + SendMessageW(mwi->hWnd, MCI_RESUME, 0, 0); + break; + + case MCI_MODE_PLAY: + SendMessageW(mwi->hWnd, MCI_PAUSE, 0, 0); + break; + + case MCI_MODE_STOP: + SendMessageW(mwi->hWnd, MCI_STOP, 0, 0); + break; + } +} + +static LRESULT MCIWND_Command(MCIWndInfo *mwi, WPARAM wParam, LPARAM lParam) +{ + switch (LOWORD(wParam)) + { + case CTL_PLAYSTOP: MCIWND_ToggleState(mwi); break; + case CTL_MENU: + case CTL_TRACKBAR: + default: + FIXME("support for command %04x not implement yet\n", LOWORD(wParam)); + } + return 0L; +} + +static void MCIWND_notify_media(MCIWndInfo *mwi) +{ + if (mwi->dwStyle & (MCIWNDF_NOTIFYMEDIAA | MCIWNDF_NOTIFYMEDIAW)) + { + if (!mwi->lpName) + { + static const WCHAR empty_str[1]; + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMEDIA, (WPARAM)mwi->hWnd, (LPARAM)empty_str); + } + else + { + if (mwi->dwStyle & MCIWNDF_NOTIFYANSI) + { + char *ansi_name; + int len; + + len = WideCharToMultiByte(CP_ACP, 0, mwi->lpName, -1, NULL, 0, NULL, NULL); + ansi_name = HeapAlloc(GetProcessHeap(), 0, len); + WideCharToMultiByte(CP_ACP, 0, mwi->lpName, -1, ansi_name, len, NULL, NULL); + + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMEDIA, (WPARAM)mwi->hWnd, (LPARAM)ansi_name); + + HeapFree(GetProcessHeap(), 0, ansi_name); + } + else + SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMEDIA, (WPARAM)mwi->hWnd, (LPARAM)mwi->lpName); + } + } +} + +static MCIERROR mci_generic_command(MCIWndInfo *mwi, UINT cmd) +{ + MCI_GENERIC_PARMS mci_generic; + + mci_generic.dwCallback = 0; + mwi->lasterror = mciSendCommandW(mwi->mci, cmd, 0, (DWORD_PTR)&mci_generic); + + if (mwi->lasterror) + return mwi->lasterror; + + MCIWND_notify_mode(mwi); + MCIWND_UpdateState(mwi); + return 0; +} + +static LRESULT mci_get_devcaps(MCIWndInfo *mwi, UINT cap) +{ + MCI_GETDEVCAPS_PARMS mci_devcaps; + + mci_devcaps.dwItem = cap; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_GETDEVCAPS, + MCI_GETDEVCAPS_ITEM, + (DWORD_PTR)&mci_devcaps); + if (mwi->lasterror) + return 0; + + return mci_devcaps.dwReturn; +} + +static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) +{ + MCIWndInfo *mwi; + + TRACE("%p %04x %08x %08lx\n", hWnd, wMsg, wParam, lParam); + + mwi = (MCIWndInfo*)GetWindowLongW(hWnd, 0); + if (!mwi && wMsg != WM_CREATE) + return DefWindowProcW(hWnd, wMsg, wParam, lParam); + + switch (wMsg) + { + case WM_CREATE: + MCIWND_Create(hWnd, (CREATESTRUCTW *)lParam); + break; + + case WM_DESTROY: + if (mwi->uTimer) + KillTimer(hWnd, mwi->uTimer); + + if (mwi->mci) + SendMessageW(hWnd, MCI_CLOSE, 0, 0); + + HeapFree(GetProcessHeap(), 0, mwi); + + DestroyWindow(GetDlgItem(hWnd, CTL_MENU)); + DestroyWindow(GetDlgItem(hWnd, CTL_PLAYSTOP)); + DestroyWindow(GetDlgItem(hWnd, CTL_TRACKBAR)); + break; + + case WM_PAINT: + { + MCI_DGV_UPDATE_PARMS mci_update; + PAINTSTRUCT ps; + + mci_update.hDC = (wParam) ? (HDC)wParam : BeginPaint(hWnd, &ps); + + mciSendCommandW(mwi->mci, MCI_UPDATE, + MCI_DGV_UPDATE_HDC | MCI_DGV_UPDATE_PAINT, + (DWORD_PTR)&mci_update); + + if (!wParam) EndPaint(hWnd, &ps); + return 1; + } + + case WM_COMMAND: + return MCIWND_Command(mwi, wParam, lParam); + + case WM_NCACTIVATE: + if (mwi->uTimer) + { + KillTimer(hWnd, mwi->uTimer); + mwi->uTimer = SetTimer(hWnd, 1, wParam ? mwi->active_timer : mwi->inactive_timer, NULL); + } + break; + + case WM_TIMER: + MCIWND_UpdateState(mwi); + return 0; + + case WM_SIZE: + SetWindowPos(GetDlgItem(hWnd, CTL_PLAYSTOP), 0, 0, HIWORD(lParam) - 32, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); + SetWindowPos(GetDlgItem(hWnd, CTL_MENU), 0, 32, HIWORD(lParam) - 32, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); + SetWindowPos(GetDlgItem(hWnd, CTL_TRACKBAR), 0, 64, HIWORD(lParam) - 32, LOWORD(lParam) - 64, 32, SWP_NOACTIVATE); + + if (!(mwi->dwStyle & MCIWNDF_NOAUTOSIZEMOVIE)) + { + RECT rc; + + rc.left = rc.top = 0; + rc.right = LOWORD(lParam); + rc.bottom = HIWORD(lParam); + if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR)) + rc.bottom -= 32; /* subtract the height of the playbar */ + SendMessageW(hWnd, MCIWNDM_PUT_DEST, 0, (LPARAM)&rc); + } + MCIWND_notify_size(mwi); + break; + + case MM_MCINOTIFY: + MCIWND_notify_mode(mwi); + MCIWND_UpdateState(mwi); + return 0; + + case MCIWNDM_OPENA: + { + UNICODE_STRING nameW; + TRACE("MCIWNDM_OPENA %s\n", debugstr_a((LPSTR)lParam)); + RtlCreateUnicodeStringFromAsciiz(&nameW, (LPCSTR)lParam); + lParam = (LPARAM)nameW.Buffer; + } + /* fall through */ + case MCIWNDM_OPENW: + { + RECT rc; + HCURSOR hCursor; + MCI_OPEN_PARMSW mci_open; + MCI_GETDEVCAPS_PARMS mci_devcaps; + WCHAR aliasW[64]; + WCHAR drv_name[MAX_PATH]; + static const WCHAR formatW[] = {'%','d',0}; + static const WCHAR mci32W[] = {'m','c','i','3','2',0}; + static const WCHAR system_iniW[] = {'s','y','s','t','e','m','.','i','n','i',0}; + + TRACE("MCIWNDM_OPENW %s\n", debugstr_w((LPWSTR)lParam)); + + if (wParam == MCIWNDOPENF_NEW) + { + SendMessageW(hWnd, MCIWNDM_NEWW, 0, lParam); + goto end_of_mci_open; + } + + if (mwi->uTimer) + { + KillTimer(hWnd, mwi->uTimer); + mwi->uTimer = 0; + } + + hCursor = LoadCursorW(0, (LPWSTR)IDC_WAIT); + hCursor = SetCursor(hCursor); + + mci_open.lpstrElementName = (LPWSTR)lParam; + wsprintfW(aliasW, formatW, (int)hWnd + 1); + mci_open.lpstrAlias = aliasW; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_OPEN, + MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS | MCI_WAIT, + (DWORD_PTR)&mci_open); + SetCursor(hCursor); + + if (mwi->lasterror && !(mwi->dwStyle & MCIWNDF_NOERRORDLG)) + { + /* FIXME: get the caption from resources */ + static const WCHAR caption[] = {'M','C','I',' ','E','r','r','o','r',0}; + WCHAR error_str[MAXERRORLENGTH]; + + mciGetErrorStringW(mwi->lasterror, error_str, MAXERRORLENGTH); + MessageBoxW(hWnd, error_str, caption, MB_ICONEXCLAMATION | MB_OK); + MCIWND_notify_error(mwi); + goto end_of_mci_open; + } + + mwi->mci = mci_open.wDeviceID; + mwi->alias = (int)hWnd + 1; + + mwi->lpName = HeapAlloc(GetProcessHeap(), 0, (strlenW((LPWSTR)lParam) + 1) * sizeof(WCHAR)); + strcpyW(mwi->lpName, (LPWSTR)lParam); + + MCIWND_UpdateState(mwi); + + mci_devcaps.dwItem = MCI_GETDEVCAPS_DEVICE_TYPE; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_GETDEVCAPS, + MCI_GETDEVCAPS_ITEM, + (DWORD_PTR)&mci_devcaps); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + goto end_of_mci_open; + } + + mwi->dev_type = mci_devcaps.dwReturn; + + drv_name[0] = 0; + SendMessageW(hWnd, MCIWNDM_GETDEVICEW, 256, (LPARAM)drv_name); + if (drv_name[0] && GetPrivateProfileStringW(mci32W, drv_name, NULL, + drv_name, MAX_PATH, system_iniW)) + mwi->hdrv = OpenDriver(drv_name, NULL, 0); + + if (mwi->dev_type == MCI_DEVTYPE_DIGITAL_VIDEO) + { + MCI_DGV_WINDOW_PARMSW mci_window; + + mci_window.hWnd = hWnd; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WINDOW, + MCI_DGV_WINDOW_HWND, + (DWORD_PTR)&mci_window); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + goto end_of_mci_open; + } + } + + if (SendMessageW(hWnd, MCIWNDM_GET_DEST, 0, (LPARAM)&rc) == 0) + { + mwi->size.cx = rc.right - rc.left; + mwi->size.cy = rc.bottom - rc.top; + + rc.right = MulDiv(mwi->size.cx, mwi->zoom, 100); + rc.bottom = MulDiv(mwi->size.cy, mwi->zoom, 100); + SendMessageW(hWnd, MCIWNDM_PUT_DEST, 0, (LPARAM)&rc); + } + else + { + GetClientRect(hWnd, &rc); + rc.bottom = rc.top; + } + + if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR)) + rc.bottom += 32; /* add the height of the playbar */ + AdjustWindowRect(&rc, GetWindowLongW(hWnd, GWL_STYLE), FALSE); + SetWindowPos(hWnd, 0, 0, 0, rc.right - rc.left, + rc.bottom - rc.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + + SendDlgItemMessageW(hWnd, CTL_TRACKBAR, TBM_SETRANGEMIN, 0L, 0L); + SendDlgItemMessageW(hWnd, CTL_TRACKBAR, TBM_SETRANGEMAX, 1, + SendMessageW(hWnd, MCIWNDM_GETLENGTH, 0, 0)); + mwi->uTimer = SetTimer(hWnd, 1, mwi->active_timer, NULL); + + MCIWND_notify_media(mwi); + +end_of_mci_open: + if (wMsg == MCIWNDM_OPENA) + HeapFree(GetProcessHeap(), 0, (void *)lParam); + return mwi->lasterror; + } + + case MCIWNDM_GETDEVICEID: + TRACE("MCIWNDM_GETDEVICEID\n"); + return mwi->mci; + + case MCIWNDM_GETALIAS: + TRACE("MCIWNDM_GETALIAS\n"); + return mwi->alias; + + case MCIWNDM_GET_SOURCE: + { + MCI_DGV_RECT_PARMS mci_rect; + + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WHERE, + MCI_DGV_WHERE_SOURCE, + (DWORD_PTR)&mci_rect); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + *(RECT *)lParam = mci_rect.rc; + TRACE("MCIWNDM_GET_SOURCE: %s\n", wine_dbgstr_rect(&mci_rect.rc)); + return 0; + } + + case MCIWNDM_GET_DEST: + { + MCI_DGV_RECT_PARMS mci_rect; + + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WHERE, + MCI_DGV_WHERE_DESTINATION, + (DWORD_PTR)&mci_rect); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + *(RECT *)lParam = mci_rect.rc; + TRACE("MCIWNDM_GET_DEST: %s\n", wine_dbgstr_rect(&mci_rect.rc)); + return 0; + } + + case MCIWNDM_PUT_SOURCE: + { + MCI_DGV_PUT_PARMS mci_put; + + mci_put.rc = *(RECT *)lParam; + TRACE("MCIWNDM_PUT_SOURCE: %s\n", wine_dbgstr_rect(&mci_put.rc)); + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PUT, + MCI_DGV_PUT_SOURCE, + (DWORD_PTR)&mci_put); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + return 0; + } + + case MCIWNDM_PUT_DEST: + { + MCI_DGV_PUT_PARMS mci_put; + + mci_put.rc = *(RECT *)lParam; + TRACE("MCIWNDM_PUT_DEST: %s\n", wine_dbgstr_rect(&mci_put.rc)); + + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PUT, + MCI_DGV_PUT_DESTINATION | MCI_DGV_RECT, + (DWORD_PTR)&mci_put); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + return 0; + } + + case MCIWNDM_GETLENGTH: + { + MCI_STATUS_PARMS mci_status; + + mci_status.dwItem = MCI_STATUS_LENGTH; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS, + MCI_STATUS_ITEM, + (DWORD_PTR)&mci_status); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return 0; + } + TRACE("MCIWNDM_GETLENGTH: %ld\n", mci_status.dwReturn); + return mci_status.dwReturn; + } + + case MCIWNDM_GETSTART: + { + MCI_STATUS_PARMS mci_status; + + mci_status.dwItem = MCI_STATUS_POSITION; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS, + MCI_STATUS_ITEM | MCI_STATUS_START, + (DWORD_PTR)&mci_status); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return 0; + } + TRACE("MCIWNDM_GETSTART: %ld\n", mci_status.dwReturn); + return mci_status.dwReturn; + } + + case MCIWNDM_GETEND: + { + LRESULT start, length; + + start = SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0); + length = SendMessageW(hWnd, MCIWNDM_GETLENGTH, 0, 0); + TRACE("MCIWNDM_GETEND: %ld\n", start + length); + return (start + length); + } + + case MCIWNDM_GETPOSITIONA: + case MCIWNDM_GETPOSITIONW: + { + MCI_STATUS_PARMS mci_status; + + TRACE("MCIWNDM_GETPOSITION\n"); + + /* get position string if requested */ + if (wParam && lParam) + { + if (wMsg == MCIWNDM_GETPOSITIONA) + { + char cmd[64]; + + wsprintfA(cmd, "status %d position", mwi->alias); + mwi->lasterror = mciSendStringA(cmd, (LPSTR)lParam, wParam, 0); + } + else + { + + WCHAR cmdW[64]; + static const WCHAR formatW[] = {'s','t','a','t','u','s',' ','%','d',' ','p','o','s','i','t','i','o','n',0}; + + wsprintfW(cmdW, formatW, mwi->alias); + mwi->lasterror = mciSendStringW(cmdW, (LPWSTR)lParam, wParam, 0); + } + + if (mwi->lasterror) + return 0; + } + + mci_status.dwItem = MCI_STATUS_POSITION; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS, + MCI_STATUS_ITEM, + (DWORD_PTR)&mci_status); + if (mwi->lasterror) + return 0; + + return mci_status.dwReturn; + } + + case MCIWNDM_GETMODEA: + case MCIWNDM_GETMODEW: + { + MCI_STATUS_PARMS mci_status; + + TRACE("MCIWNDM_GETMODE\n"); + + if (!mwi->mci) + return MCI_MODE_NOT_READY; + + /* get mode string if requested */ + if (wParam && lParam) + { + if (wMsg == MCIWNDM_GETMODEA) + { + char cmd[64]; + + wsprintfA(cmd, "status %d mode", mwi->alias); + mwi->lasterror = mciSendStringA(cmd, (LPSTR)lParam, wParam, 0); + } + else + { + + WCHAR cmdW[64]; + static const WCHAR formatW[] = {'s','t','a','t','u','s',' ','%','d',' ','m','o','d','e',0}; + + wsprintfW(cmdW, formatW, mwi->alias); + mwi->lasterror = mciSendStringW(cmdW, (LPWSTR)lParam, wParam, 0); + } + + if (mwi->lasterror) + return MCI_MODE_NOT_READY; + } + + mci_status.dwItem = MCI_STATUS_MODE; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS, + MCI_STATUS_ITEM, + (DWORD_PTR)&mci_status); + if (mwi->lasterror) + return MCI_MODE_NOT_READY; + + return mci_status.dwReturn; + } + + case MCIWNDM_PLAYFROM: + { + MCI_PLAY_PARMS mci_play; + + TRACE("MCIWNDM_PLAYFROM %08lx\n", lParam); + + mci_play.dwCallback = (DWORD_PTR)hWnd; + mci_play.dwFrom = lParam; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PLAY, + MCI_FROM | MCI_NOTIFY, + (DWORD_PTR)&mci_play); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + + MCIWND_notify_mode(mwi); + MCIWND_UpdateState(mwi); + return 0; + } + + case MCIWNDM_PLAYTO: + { + MCI_PLAY_PARMS mci_play; + + TRACE("MCIWNDM_PLAYTO %08lx\n", lParam); + + mci_play.dwCallback = (DWORD_PTR)hWnd; + mci_play.dwTo = lParam; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PLAY, + MCI_TO | MCI_NOTIFY, + (DWORD_PTR)&mci_play); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + + MCIWND_notify_mode(mwi); + MCIWND_UpdateState(mwi); + return 0; + } + + case MCIWNDM_PLAYREVERSE: + { + MCI_PLAY_PARMS mci_play; + DWORD flags = MCI_NOTIFY; + + TRACE("MCIWNDM_PLAYREVERSE %08lx\n", lParam); + + mci_play.dwCallback = (DWORD_PTR)hWnd; + mci_play.dwFrom = lParam; + switch (mwi->dev_type) + { + default: + case MCI_DEVTYPE_ANIMATION: + flags |= MCI_ANIM_PLAY_REVERSE; + break; + + case MCI_DEVTYPE_DIGITAL_VIDEO: + flags |= MCI_DGV_PLAY_REVERSE; + break; + +#ifdef MCI_VCR_PLAY_REVERSE + case MCI_DEVTYPE_VCR: + flags |= MCI_VCR_PLAY_REVERSE; + break; +#endif + + case MCI_DEVTYPE_VIDEODISC: + flags |= MCI_VD_PLAY_REVERSE; + break; + + } + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PLAY, + flags, (DWORD_PTR)&mci_play); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + + MCIWND_notify_mode(mwi); + MCIWND_UpdateState(mwi); + return 0; + } + + case MCIWNDM_GETERRORA: + mciGetErrorStringA(mwi->lasterror, (LPSTR)lParam, wParam); + TRACE("MCIWNDM_GETERRORA: %s\n", debugstr_an((LPSTR)lParam, wParam)); + return mwi->lasterror; + + case MCIWNDM_GETERRORW: + mciGetErrorStringW(mwi->lasterror, (LPWSTR)lParam, wParam); + TRACE("MCIWNDM_GETERRORW: %s\n", debugstr_wn((LPWSTR)lParam, wParam)); + return mwi->lasterror; + + case MCIWNDM_SETOWNER: + TRACE("MCIWNDM_SETOWNER %p\n", (HWND)wParam); + mwi->hwndOwner = (HWND)wParam; + return 0; + + case MCIWNDM_SENDSTRINGA: + { + UNICODE_STRING stringW; + + TRACE("MCIWNDM_SENDSTRINGA %s\n", debugstr_a((LPCSTR)lParam)); + + RtlCreateUnicodeStringFromAsciiz(&stringW, (LPCSTR)lParam); + lParam = (LPARAM)stringW.Buffer; + } + /* fall through */ + case MCIWNDM_SENDSTRINGW: + { + WCHAR *cmdW, *p; + + TRACE("MCIWNDM_SENDSTRINGW %s\n", debugstr_w((LPCWSTR)lParam)); + + p = strchrW((LPCWSTR)lParam, ' '); + if (p) + { + static const WCHAR formatW[] = {'%','d',' ',0}; + int len, pos; + + pos = p - (WCHAR *)lParam + 1; + len = lstrlenW((LPCWSTR)lParam) + 64; + + cmdW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + + memcpy(cmdW, (void *)lParam, pos * sizeof(WCHAR)); + wsprintfW(cmdW + pos, formatW, mwi->alias); + strcatW(cmdW, (WCHAR *)lParam + pos); + } + else + cmdW = (LPWSTR)lParam; + + mwi->lasterror = mciSendStringW(cmdW, mwi->return_string, + sizeof(mwi->return_string)/sizeof(mwi->return_string[0]), + 0); + if (mwi->lasterror) + MCIWND_notify_error(mwi); + + if (cmdW != (LPWSTR)lParam) + HeapFree(GetProcessHeap(), 0, cmdW); + + if (wMsg == MCIWNDM_SENDSTRINGA) + HeapFree(GetProcessHeap(), 0, (void *)lParam); + + MCIWND_UpdateState(mwi); + return mwi->lasterror; + } + + case MCIWNDM_RETURNSTRINGA: + WideCharToMultiByte(CP_ACP, 0, mwi->return_string, -1, (LPSTR)lParam, wParam, NULL, NULL); + TRACE("MCIWNDM_RETURNTRINGA %s\n", debugstr_an((LPSTR)lParam, wParam)); + return mwi->lasterror; + + case MCIWNDM_RETURNSTRINGW: + strncpyW((LPWSTR)lParam, mwi->return_string, wParam); + TRACE("MCIWNDM_RETURNTRINGW %s\n", debugstr_wn((LPWSTR)lParam, wParam)); + return mwi->lasterror; + + case MCIWNDM_SETTIMERS: + TRACE("MCIWNDM_SETTIMERS active %d ms, inactive %d ms\n", (int)wParam, (int)lParam); + mwi->active_timer = (WORD)wParam; + mwi->inactive_timer = (WORD)lParam; + return 0; + + case MCIWNDM_SETACTIVETIMER: + TRACE("MCIWNDM_SETACTIVETIMER %d ms\n", (int)wParam); + mwi->active_timer = (WORD)wParam; + return 0; + + case MCIWNDM_SETINACTIVETIMER: + TRACE("MCIWNDM_SETINACTIVETIMER %d ms\n", (int)wParam); + mwi->inactive_timer = (WORD)wParam; + return 0; + + case MCIWNDM_GETACTIVETIMER: + TRACE("MCIWNDM_GETACTIVETIMER: %d ms\n", mwi->active_timer); + return mwi->active_timer; + + case MCIWNDM_GETINACTIVETIMER: + TRACE("MCIWNDM_GETINACTIVETIMER: %d ms\n", mwi->inactive_timer); + return mwi->inactive_timer; + + case MCIWNDM_CHANGESTYLES: + TRACE("MCIWNDM_CHANGESTYLES mask %08x, set %08lx\n", wParam, lParam); + /* FIXME: update the visual window state as well: + * add/remove trackbar, autosize, etc. + */ + mwi->dwStyle &= ~wParam; + mwi->dwStyle |= lParam & wParam; + return 0; + + case MCIWNDM_GETSTYLES: + TRACE("MCIWNDM_GETSTYLES: %08lx\n", mwi->dwStyle & 0xffff); + return mwi->dwStyle & 0xffff; + + case MCIWNDM_GETDEVICEA: + { + MCI_SYSINFO_PARMSA mci_sysinfo; + + mci_sysinfo.lpstrReturn = (LPSTR)lParam; + mci_sysinfo.dwRetSize = wParam; + mwi->lasterror = mciSendCommandA(mwi->mci, MCI_SYSINFO, + MCI_SYSINFO_INSTALLNAME, + (DWORD_PTR)&mci_sysinfo); + TRACE("MCIWNDM_GETDEVICEA: %s\n", debugstr_an((LPSTR)lParam, wParam)); + return 0; + } + + case MCIWNDM_GETDEVICEW: + { + MCI_SYSINFO_PARMSW mci_sysinfo; + + mci_sysinfo.lpstrReturn = (LPWSTR)lParam; + mci_sysinfo.dwRetSize = wParam; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SYSINFO, + MCI_SYSINFO_INSTALLNAME, + (DWORD_PTR)&mci_sysinfo); + TRACE("MCIWNDM_GETDEVICEW: %s\n", debugstr_wn((LPWSTR)lParam, wParam)); + return 0; + } + + case MCIWNDM_VALIDATEMEDIA: + TRACE("MCIWNDM_VALIDATEMEDIA\n"); + if (mwi->mci) + { + SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0); + SendMessageW(hWnd, MCIWNDM_GETLENGTH, 0, 0); + } + return 0; + + case MCIWNDM_GETFILENAMEA: + TRACE("MCIWNDM_GETFILENAMEA: %s\n", debugstr_w(mwi->lpName)); + if (mwi->lpName) + WideCharToMultiByte(CP_ACP, 0, mwi->lpName, -1, (LPSTR)lParam, wParam, NULL, NULL); + return 0; + + case MCIWNDM_GETFILENAMEW: + TRACE("MCIWNDM_GETFILENAMEW: %s\n", debugstr_w(mwi->lpName)); + if (mwi->lpName) + strncpyW((LPWSTR)lParam, mwi->lpName, wParam); + return 0; + + case MCIWNDM_GETTIMEFORMATA: + case MCIWNDM_GETTIMEFORMATW: + { + MCI_STATUS_PARMS mci_status; + + TRACE("MCIWNDM_GETTIMEFORMAT %08x %08lx\n", wParam, lParam); + + /* get format string if requested */ + if (wParam && lParam) + { + if (wMsg == MCIWNDM_GETTIMEFORMATA) + { + char cmd[64]; + + wsprintfA(cmd, "status %d time format", mwi->alias); + mwi->lasterror = mciSendStringA(cmd, (LPSTR)lParam, wParam, 0); + if (mwi->lasterror) + return 0; + } + else + { + WCHAR cmdW[64]; + static const WCHAR formatW[] = {'s','t','a','t','u','s',' ','%','d',' ','t','i','m','e',' ','f','o','r','m','a','t',0}; + + wsprintfW(cmdW, formatW, mwi->alias); + mwi->lasterror = mciSendStringW(cmdW, (LPWSTR)lParam, wParam, 0); + if (mwi->lasterror) + return 0; + } + } + + mci_status.dwItem = MCI_STATUS_TIME_FORMAT ; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_STATUS, + MCI_STATUS_ITEM, + (DWORD_PTR)&mci_status); + if (mwi->lasterror) + return 0; + + return mci_status.dwReturn; + } + + case MCIWNDM_SETTIMEFORMATA: + { + UNICODE_STRING stringW; + + TRACE("MCIWNDM_SETTIMEFORMATA %s\n", debugstr_a((LPSTR)lParam)); + + RtlCreateUnicodeStringFromAsciiz(&stringW, (LPCSTR)lParam); + lParam = (LPARAM)stringW.Buffer; + } + /* fall through */ + case MCIWNDM_SETTIMEFORMATW: + { + static const WCHAR formatW[] = {'s','e','t',' ','%','d',' ','t','i','m','e',' ','f','o','r','m','a','t',' ',0}; + WCHAR *cmdW; + + TRACE("MCIWNDM_SETTIMEFORMATW %s\n", debugstr_w((LPWSTR)lParam)); + + if (mwi->mci) + { + cmdW = HeapAlloc(GetProcessHeap(), 0, (lstrlenW((LPCWSTR)lParam) + 64) * sizeof(WCHAR)); + wsprintfW(cmdW, formatW, mwi->alias); + strcatW(cmdW, (WCHAR *)lParam); + + mwi->lasterror = mciSendStringW(cmdW, NULL, 0, 0); + + /* fix the range tracking according to the new time format */ + if (!mwi->lasterror) + SendDlgItemMessageW(hWnd, CTL_TRACKBAR, TBM_SETRANGEMAX, 1, + SendMessageW(hWnd, MCIWNDM_GETLENGTH, 0, 0)); + } + + if (wMsg == MCIWNDM_SETTIMEFORMATA) + HeapFree(GetProcessHeap(), 0, (void *)lParam); + + return 0; + } + + case MCIWNDM_CAN_PLAY: + TRACE("MCIWNDM_CAN_PLAY\n"); + if (mwi->mci) + return mci_get_devcaps(mwi, MCI_GETDEVCAPS_CAN_PLAY); + return 0; + + case MCIWNDM_CAN_RECORD: + TRACE("MCIWNDM_CAN_RECORD\n"); + if (mwi->mci) + return mci_get_devcaps(mwi, MCI_GETDEVCAPS_CAN_RECORD); + return 0; + + case MCIWNDM_CAN_SAVE: + TRACE("MCIWNDM_CAN_SAVE\n"); + if (mwi->mci) + return mci_get_devcaps(mwi, MCI_GETDEVCAPS_CAN_SAVE); + return 0; + + case MCIWNDM_CAN_EJECT: + TRACE("MCIWNDM_CAN_EJECT\n"); + if (mwi->mci) + return mci_get_devcaps(mwi, MCI_GETDEVCAPS_CAN_EJECT); + return 0; + + case MCIWNDM_CAN_WINDOW: + TRACE("MCIWNDM_CAN_WINDOW\n"); + switch (mwi->dev_type) + { + case MCI_DEVTYPE_ANIMATION: + case MCI_DEVTYPE_DIGITAL_VIDEO: + case MCI_DEVTYPE_OVERLAY: + return 1; + } + return 0; + + case MCIWNDM_CAN_CONFIG: + TRACE("MCIWNDM_CAN_CONFIG\n"); + if (mwi->hdrv) + return SendDriverMessage(mwi->hdrv, DRV_QUERYCONFIGURE, 0, 0); + return 0; + + case MCIWNDM_SETZOOM: + TRACE("MCIWNDM_SETZOOM %ld\n", lParam); + mwi->zoom = lParam; + + if (mwi->mci && !(mwi->dwStyle & MCIWNDF_NOAUTOSIZEWINDOW)) + { + RECT rc; + + rc.left = rc.top = 0; + rc.right = MulDiv(mwi->size.cx, mwi->zoom, 100); + rc.bottom = MulDiv(mwi->size.cy, mwi->zoom, 100); + + if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR)) + rc.bottom += 32; /* add the height of the playbar */ + AdjustWindowRect(&rc, GetWindowLongW(hWnd, GWL_STYLE), FALSE); + SetWindowPos(hWnd, 0, 0, 0, rc.right - rc.left, rc.bottom - rc.top, + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + } + return 0; + + case MCIWNDM_GETZOOM: + TRACE("MCIWNDM_GETZOOM: %d\n", mwi->zoom); + return mwi->zoom; + + case MCIWNDM_EJECT: + { + MCI_SET_PARMS mci_set; + + TRACE("MCIWNDM_EJECT\n"); + + mci_set.dwCallback = (DWORD_PTR)hWnd; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SET, + MCI_SET_DOOR_OPEN | MCI_NOTIFY, + (DWORD_PTR)&mci_set); + MCIWND_notify_mode(mwi); + MCIWND_UpdateState(mwi); + return mwi->lasterror; + } + + case MCIWNDM_SETVOLUME: + case MCIWNDM_GETVOLUME: + case MCIWNDM_SETSPEED: + case MCIWNDM_GETSPEED: + case MCIWNDM_SETREPEAT: + case MCIWNDM_GETREPEAT: + case MCIWNDM_REALIZE: + case MCIWNDM_GETPALETTE: + case MCIWNDM_SETPALETTE: + case MCIWNDM_NEWA: + case MCIWNDM_NEWW: + case MCIWNDM_PALETTEKICK: + case MCIWNDM_OPENINTERFACE: + FIXME("support for MCIWNDM_ message WM_USER+%d not implemented\n", wMsg - WM_USER); + return 0; + + case MCI_PLAY: + { + LRESULT end = SendMessageW(hWnd, MCIWNDM_GETEND, 0, 0); + return SendMessageW(hWnd, MCIWNDM_PLAYTO, 0, end); + } + + case MCI_SEEK: + { + MCI_SEEK_PARMS mci_seek; + + switch (lParam) + { + case MCIWND_START: + lParam = SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0); + break; + + case MCIWND_END: + lParam = SendMessageW(hWnd, MCIWNDM_GETEND, 0, 0); + break; + } + + mci_seek.dwTo = lParam; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SEEK, + MCI_TO, (DWORD_PTR)&mci_seek); + if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + return mwi->lasterror; + } + /* update window to reflect the state */ + InvalidateRect(hWnd, NULL, TRUE); + return 0; + } + + case MCI_CLOSE: + { + RECT rc; + MCI_GENERIC_PARMS mci_generic; + + if (mwi->hdrv) + { + CloseDriver(mwi->hdrv, 0, 0); + mwi->hdrv = 0; + } + + if (mwi->mci) + { + mci_generic.dwCallback = 0; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_CLOSE, + 0, (DWORD_PTR)&mci_generic); + mwi->mci = 0; + } + + mwi->mode = MCI_MODE_NOT_READY; + mwi->position = -1; + + if (mwi->lpName) + { + HeapFree(GetProcessHeap(), 0, mwi->lpName); + mwi->lpName = NULL; + } + MCIWND_UpdateState(mwi); + + GetClientRect(hWnd, &rc); + rc.bottom = rc.top; + if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR)) + rc.bottom += 32; /* add the height of the playbar */ + AdjustWindowRect(&rc, GetWindowLongW(hWnd, GWL_STYLE), FALSE); + SetWindowPos(hWnd, 0, 0, 0, rc.right - rc.left, + rc.bottom - rc.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + + MCIWND_notify_media(mwi); + return 0; + } + + case MCI_PAUSE: + case MCI_STEP: + case MCI_STOP: + case MCI_RESUME: + mci_generic_command(mwi, wMsg); + if (wMsg == MCI_STEP && !mwi->lasterror) + { + /* update window to reflect the state */ + InvalidateRect(hWnd, NULL, TRUE); + } + return mwi->lasterror; + + case MCI_CONFIGURE: + if (mwi->hdrv) + SendDriverMessage(mwi->hdrv, DRV_CONFIGURE, (LPARAM)hWnd, 0); + return 0; + + case MCI_BREAK: + case MCI_CAPTURE: + case MCI_COPY: + case MCI_CUE: + case MCI_CUT: + case MCI_DELETE: + case MCI_ESCAPE: + case MCI_FREEZE: + case MCI_GETDEVCAPS: + /*case MCI_INDEX:*/ + case MCI_INFO: + case MCI_LIST: + case MCI_LOAD: + /*case MCI_MARK:*/ + case MCI_MONITOR: + case MCI_OPEN: + case MCI_PASTE: + case MCI_PUT: + case MCI_QUALITY: + case MCI_REALIZE: + case MCI_RECORD: + case MCI_RESERVE: + case MCI_RESTORE: + case MCI_SAVE: + case MCI_SET: + case MCI_SETAUDIO: + /*case MCI_SETTIMECODE:*/ + /*case MCI_SETTUNER:*/ + case MCI_SETVIDEO: + case MCI_SIGNAL: + case MCI_SPIN: + case MCI_STATUS: + case MCI_SYSINFO: + case MCI_UNDO: + case MCI_UNFREEZE: + case MCI_UPDATE: + case MCI_WHERE: + case MCI_WINDOW: + FIXME("support for MCI_ command %04x not implemented\n", wMsg); + return 0; + } + + if (wMsg >= WM_USER) + { + FIXME("support for MCIWNDM_ message WM_USER+%d not implemented\n", wMsg - WM_USER); + return 0; + } + + if (GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_MDICHILD) + return DefMDIChildProcW(hWnd, wMsg, wParam, lParam); + + return DefWindowProcW(hWnd, wMsg, wParam, lParam); +} diff --git a/reactos/lib/msvideo/msvfw32.rc b/reactos/lib/msvideo/msvfw32.rc new file mode 100644 index 00000000000..3a0ff963fb5 --- /dev/null +++ b/reactos/lib/msvideo/msvfw32.rc @@ -0,0 +1,38 @@ +#include +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +VS_VERSION_INFO VERSIONINFO + FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD + PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", RES_STR_COMPANY_NAME + VALUE "FileDescription", "MSvideo support\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "msvfw32\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "msvfw32.dll\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + diff --git a/reactos/lib/msvideo/msvfw32.spec b/reactos/lib/msvideo/msvfw32.spec new file mode 100644 index 00000000000..9590f91bf3a --- /dev/null +++ b/reactos/lib/msvideo/msvfw32.spec @@ -0,0 +1,51 @@ +# Yes, ICCompress,ICDecompress,MCIWnd* and ICDraw* are cdecl (VFWAPIV). +# The rest is stdcall (VFWAPI) however. -Marcus Meissner, 990124 + +2 stdcall VideoForWindowsVersion() + +@ stdcall DrawDibBegin(long long long long ptr long long long) +@ stub DrawDibChangePalette +@ stdcall DrawDibClose(long) +@ stdcall DrawDibDraw(long long long long long long ptr ptr long long long long long) +@ stdcall DrawDibEnd(long) +@ stub DrawDibGetBuffer +@ stdcall DrawDibGetPalette(long) +@ stdcall DrawDibOpen() +@ stdcall DrawDibProfileDisplay(ptr) +@ stdcall DrawDibRealize(long long long) +@ stdcall DrawDibSetPalette(long long) +@ stdcall DrawDibStart(long long) +@ stdcall DrawDibStop(long) +@ stub DrawDibTime +@ stub GetOpenFileNamePreview +@ stdcall GetOpenFileNamePreviewA(ptr) +@ stdcall GetOpenFileNamePreviewW(ptr) +@ stdcall GetSaveFileNamePreviewA(ptr) +@ stdcall GetSaveFileNamePreviewW(ptr) +@ stdcall ICClose(long) +@ cdecl ICCompress(long long ptr ptr ptr ptr ptr ptr long long long ptr ptr) +@ stdcall ICCompressorChoose(long long ptr ptr ptr ptr) +@ stdcall ICCompressorFree(ptr) +@ cdecl ICDecompress(long long ptr ptr ptr ptr) +@ cdecl ICDraw(long long ptr ptr long long) +@ cdecl ICDrawBegin(long long long long long long long long long ptr long long long long long long) +@ stdcall ICGetDisplayFormat(long ptr ptr long long long) +@ stdcall ICGetInfo(long ptr long) +@ stdcall ICImageCompress(long long ptr ptr ptr long ptr) +@ stdcall ICImageDecompress(long long ptr ptr ptr) +@ stdcall ICInfo(long long ptr) +@ stdcall ICInstall(long long ptr str long) +@ stdcall ICLocate(long long ptr ptr long) +@ stub ICMThunk +@ stdcall ICOpen(long long long) +@ stdcall ICOpenFunction(long long long ptr) +@ stdcall ICRemove(long long long) +@ stdcall ICSendMessage(long long long long) +@ stub ICSeqCompressFrame +@ stub ICSeqCompressFrameEnd +@ stub ICSeqCompressFrameStart +@ cdecl MCIWndCreate (long long long str) MCIWndCreateA +@ cdecl MCIWndCreateA (long long long str) +@ cdecl MCIWndCreateW (long long long wstr) +@ cdecl MCIWndRegisterClass() +@ stub StretchDIB diff --git a/reactos/lib/msvideo/msvfw32.spec.def b/reactos/lib/msvideo/msvfw32.spec.def new file mode 100644 index 00000000000..39fd23f5e5d --- /dev/null +++ b/reactos/lib/msvideo/msvfw32.spec.def @@ -0,0 +1,43 @@ +; File generated automatically from msvfw32.spec; do not edit! + +LIBRARY msvfw32.dll + +EXPORTS + VideoForWindowsVersion@0 @2 + DrawDibBegin@32 @3 + DrawDibClose@4 @5 + DrawDibDraw@52 @6 + DrawDibEnd@4 @7 + DrawDibGetPalette@4 @9 + DrawDibOpen@0 @10 + DrawDibProfileDisplay@4 @11 + DrawDibRealize@12 @12 + DrawDibSetPalette@8 @13 + DrawDibStart@8 @14 + DrawDibStop@4 @15 + GetOpenFileNamePreviewA@4 @18 + GetOpenFileNamePreviewW@4 @19 + GetSaveFileNamePreviewA@4 @20 + GetSaveFileNamePreviewW@4 @21 + ICClose@4 @22 + ICCompress @23 + ICCompressorChoose@24 @24 + ICCompressorFree@4 @25 + ICDecompress @26 + ICDraw @27 + ICDrawBegin @28 + ICGetDisplayFormat@24 @29 + ICGetInfo@12 @30 + ICImageCompress@28 @31 + ICImageDecompress@20 @32 + ICInfo@12 @33 + ICInstall@20 @34 + ICLocate@20 @35 + ICOpen@12 @37 + ICOpenFunction@16 @38 + ICRemove@12 @39 + ICSendMessage@16 @40 + MCIWndCreate=MCIWndCreateA @44 + MCIWndCreateA @45 + MCIWndCreateW @46 + MCIWndRegisterClass @47 diff --git a/reactos/lib/msvideo/msvideo.spec b/reactos/lib/msvideo/msvideo.spec new file mode 100644 index 00000000000..a6f9a876f20 --- /dev/null +++ b/reactos/lib/msvideo/msvideo.spec @@ -0,0 +1,68 @@ +2 pascal VideoForWindowsVersion() VideoForWindowsVersion +20 stub VIDEOGETNUMDEVS +21 stub VIDEOGETERRORTEXT +22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer16 +28 stub VIDEOOPEN +29 stub VIDEOCLOSE +30 stub VIDEODIALOG +31 stub VIDEOFRAME +32 stub VIDEOCONFIGURE +33 stub VIDEOCONFIGURESTORAGE +34 stub VIDEOGETCHANNELCAPS +35 stub VIDEOUPDATE +40 stub VIDEOSTREAMADDBUFFER +41 stub VIDEOSTREAMFINI +42 stub VIDEOSTREAMGETERROR +43 stub VIDEOSTREAMGETPOSITION +44 stub VIDEOSTREAMINIT +46 stub VIDEOSTREAMPREPAREHEADER +47 stub VIDEOSTREAMRESET +49 stub VIDEOSTREAMSTART +50 stub VIDEOSTREAMSTOP +51 stub VIDEOSTREAMUNPREPAREHEADER +52 stub VIDEOSTREAMALLOCHDRANDBUFFER +53 stub VIDEOSTREAMFREEHDRANDBUFFER +60 stub VIDEOMESSAGE +102 pascal -ret16 DrawDibOpen() DrawDibOpen16 +103 pascal -ret16 DrawDibClose(word) DrawDibClose16 +104 pascal -ret16 DrawDibBegin(word word s_word s_word ptr s_word s_word word) DrawDibBegin16 +105 pascal -ret16 DrawDibEnd(word) DrawDibEnd16 +106 pascal -ret16 DrawDibDraw(word word s_word s_word s_word s_word ptr ptr s_word s_word s_word s_word word) DrawDibDraw16 +108 pascal -ret16 DrawDibGetPalette(word) DrawDibGetPalette16 +110 pascal -ret16 DrawDibSetPalette(word word) DrawDibSetPalette16 +111 stub DRAWDIBCHANGEPALETTE +112 pascal -ret16 DrawDibRealize(word word word) DrawDibRealize16 +113 stub DRAWDIBTIME +114 stub DRAWDIBPROFILEDISPLAY +115 stub STRETCHDIB +118 pascal -ret16 DrawDibStart(word long) DrawDibStart16 +119 pascal -ret16 DrawDibStop(word) DrawDibStop16 +120 stub DRAWDIBGETBUFFER +200 pascal -ret16 ICInfo(long long segptr) ICInfo16 +201 stub ICINSTALL +202 stub ICREMOVE +203 pascal -ret16 ICOpen(long long word) ICOpen16 +204 pascal ICClose(word) ICClose16 +205 pascal ICSendMessage(word word long long) ICSendMessage16 +206 pascal -ret16 ICOpenFunction(long long word segptr) ICOpenFunction16 +207 varargs _ICMessage(word word word) ICMessage16 +212 pascal ICGetInfo(word segptr long) ICGetInfo16 +213 pascal -ret16 ICLocate(long long ptr ptr word) ICLocate16 +224 cdecl _ICCompress(word long segptr segptr segptr segptr segptr segptr long long long segptr segptr) ICCompress16 +230 cdecl _ICDecompress(word long segptr segptr segptr segptr) ICDecompress16 +232 cdecl _ICDrawBegin(word long word word word s_word s_word s_word s_word segptr s_word s_word s_word s_word long long) ICDrawBegin16 +234 cdecl _ICDraw(word long segptr segptr long long) ICDraw16 +239 pascal -ret16 ICGetDisplayFormat(word ptr ptr s_word s_word s_word) ICGetDisplayFormat16 +240 stub ICIMAGECOMPRESS +241 stub ICIMAGEDECOMPRESS +242 stub ICCOMPRESSORCHOOSE +243 stub ICCOMPRESSORFREE +244 stub ICSEQCOMPRESSFRAMESTART +245 stub ICSEQCOMPRESSFRAMEEND +246 stub ICSEQCOMPRESSFRAME +250 stub _MCIWNDCREATE +251 stub _MCIWNDREGISTERCLASS +252 stub GETOPENFILENAMEPREVIEW +253 stub GETSAVEFILENAMEPREVIEW + +300 pascal DllEntryPoint(long word word word long word) VIDEO_LibMain diff --git a/reactos/lib/msvideo/msvideo16.c b/reactos/lib/msvideo/msvideo16.c new file mode 100644 index 00000000000..2d5596e9b9f --- /dev/null +++ b/reactos/lib/msvideo/msvideo16.c @@ -0,0 +1,910 @@ +/* + * msvideo 16-bit functions + * + * Copyright 1998 Marcus Meissner + * Copyright 2000 Bradley Baetz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define COM_NO_WINDOWS_H +#include +#include + +#include "msvideo_private.h" +#include "winver.h" +#include "winnls.h" +#include "winreg.h" +#include "vfw16.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msvideo); + +/* Drivers32 settings */ +#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32" + +/*********************************************************************** + * DrawDibOpen [MSVIDEO.102] + */ +HDRAWDIB16 VFWAPI DrawDibOpen16(void) +{ + return HDRAWDIB_16(DrawDibOpen()); +} + +/*********************************************************************** + * DrawDibClose [MSVIDEO.103] + */ +BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) +{ + return DrawDibClose(HDRAWDIB_32(hdd)); +} + +/************************************************************************ + * DrawDibBegin [MSVIDEO.104] + */ +BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst, + INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc, + INT16 dySrc, UINT16 wFlags) +{ + return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi, + dxSrc, dySrc, wFlags); +} + +/*********************************************************************** + * DrawDibEnd [MSVIDEO.105] + */ +BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) +{ + return DrawDibEnd(HDRAWDIB_32(hdd)); +} + +/********************************************************************** + * DrawDibDraw [MSVIDEO.106] + */ +BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst, + INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi, + LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc, + INT16 dySrc, UINT16 wFlags) +{ + return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst, + dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags); +} + +/*********************************************************************** + * DrawDibGetPalette [MSVIDEO.108] + */ +HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) +{ + return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd))); +} + +/*********************************************************************** + * DrawDibSetPalette [MSVIDEO.110] + */ +BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) +{ + return DrawDibSetPalette(HDRAWDIB_32(hdd), HPALETTE_32(hpal)); +} + +/*********************************************************************** + * DrawDibRealize [MSVIDEO.112] + */ +UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, + BOOL16 fBackground) +{ + return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground); +} + +/************************************************************************* + * DrawDibStart [MSVIDEO.118] + */ +BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) +{ + return DrawDibStart(HDRAWDIB_32(hdd), rate); +} + +/************************************************************************* + * DrawDibStop [MSVIDEO.119] + */ +BOOL16 DrawDibStop16(HDRAWDIB16 hdd) +{ + return DrawDibStop(HDRAWDIB_32(hdd)); +} + +/*********************************************************************** + * ICOpen [MSVIDEO.203] + */ +HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode) +{ + return HIC_16(ICOpen(fccType, fccHandler, wMode)); +} + +/*********************************************************************** + * ICClose [MSVIDEO.204] + */ +LRESULT WINAPI ICClose16(HIC16 hic) +{ + return ICClose(HIC_32(hic)); +} + +/*********************************************************************** + * _ICMessage [MSVIDEO.207] + */ +LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ) +{ + LPWORD lpData; + SEGPTR segData; + LRESULT ret; + UINT16 i; + + lpData = HeapAlloc(GetProcessHeap(), 0, cb); + + TRACE("0x%08lx, %u, %u, ...)\n", (DWORD) hic, msg, cb); + + for (i = 0; i < cb / sizeof(WORD); i++) + { + lpData[i] = VA_ARG16(valist, WORD); + } + + segData = MapLS(lpData); + ret = ICSendMessage16(hic, msg, segData, (DWORD) cb); + UnMapLS(segData); + HeapFree(GetProcessHeap(), 0, lpData); + return ret; +} + +/*********************************************************************** + * ICGetInfo [MSVIDEO.212] + */ +LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb) +{ + LRESULT ret; + + TRACE("(0x%08lx,%p,%ld)\n", (DWORD) hic, picinfo, cb); + ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb); + TRACE(" -> 0x%08lx\n", ret); + return ret; +} + +/*********************************************************************** + * ICLocate [MSVIDEO.213] + */ +HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler, + LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, + WORD wFlags) +{ + return HIC_16(ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags)); +} + +/*********************************************************************** + * _ICCompress [MSVIDEO.224] + */ +DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags, + LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData, + LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, + LPDWORD lpckid, LPDWORD lpdwFlags, + LONG lFrameNum, DWORD dwFrameSize, + DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev, + LPVOID lpPrev) +{ + DWORD ret; + ICCOMPRESS iccmp; + SEGPTR seg_iccmp; + + TRACE("(0x%08lx,%ld,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags, + lpbiOutput, lpData, lpbiInput, lpBits); + + iccmp.dwFlags = dwFlags; + + iccmp.lpbiOutput = lpbiOutput; + iccmp.lpOutput = lpData; + iccmp.lpbiInput = lpbiInput; + iccmp.lpInput = lpBits; + + iccmp.lpckid = lpckid; + iccmp.lpdwFlags = lpdwFlags; + iccmp.lFrameNum = lFrameNum; + iccmp.dwFrameSize = dwFrameSize; + iccmp.dwQuality = dwQuality; + iccmp.lpbiPrev = lpbiPrev; + iccmp.lpPrev = lpPrev; + seg_iccmp = MapLS(&iccmp); + ret = ICSendMessage16(hic, ICM_COMPRESS, seg_iccmp, sizeof(ICCOMPRESS)); + UnMapLS(seg_iccmp); + return ret; +} + +/*********************************************************************** + * _ICDecompress [MSVIDEO.230] + */ +DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags, + LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, + LPBITMAPINFOHEADER lpbi, LPVOID lpBits) +{ + ICDECOMPRESS icd; + SEGPTR segptr; + DWORD ret; + + TRACE("(0x%08lx,%ld,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat, + lpData, lpbi, lpBits); + + icd.dwFlags = dwFlags; + icd.lpbiInput = lpbiFormat; + icd.lpInput = lpData; + icd.lpbiOutput = lpbi; + icd.lpOutput = lpBits; + icd.ckid = 0; + segptr = MapLS(&icd); + ret = ICSendMessage16(hic, ICM_DECOMPRESS, segptr, sizeof(ICDECOMPRESS)); + UnMapLS(segptr); + return ret; +} + +/*********************************************************************** + * _ICDrawBegin [MSVIDEO.232] + */ +DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */ + DWORD dwFlags, /* [in] flags */ + HPALETTE16 hpal, /* [in] palette to draw with */ + HWND16 hwnd, /* [in] window to draw to */ + HDC16 hdc, /* [in] HDC to draw to */ + INT16 xDst, /* [in] destination rectangle */ + INT16 yDst, /* [in] */ + INT16 dxDst, /* [in] */ + INT16 dyDst, /* [in] */ + LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw NOTE: SEGPTR */ + INT16 xSrc, /* [in] source rectangle */ + INT16 ySrc, /* [in] */ + INT16 dxSrc, /* [in] */ + INT16 dySrc, /* [in] */ + DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */ + DWORD dwScale) /* [in] */ +{ + DWORD ret; + ICDRAWBEGIN16 icdb; + SEGPTR seg_icdb; + + TRACE ("(0x%08lx,%ld,0x%08lx,0x%08lx,0x%08lx,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n", + (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc, + xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, + dwScale); + + icdb.dwFlags = dwFlags; + icdb.hpal = hpal; + icdb.hwnd = hwnd; + icdb.hdc = hdc; + icdb.xDst = xDst; + icdb.yDst = yDst; + icdb.dxDst = dxDst; + icdb.dyDst = dyDst; + icdb.lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */ + icdb.xSrc = xSrc; + icdb.ySrc = ySrc; + icdb.dxSrc = dxSrc; + icdb.dySrc = dySrc; + icdb.dwRate = dwRate; + icdb.dwScale = dwScale; + seg_icdb = MapLS(&icdb); + ret = (DWORD) ICSendMessage16(hic, ICM_DRAW_BEGIN, seg_icdb, + sizeof(ICDRAWBEGIN16)); + UnMapLS(seg_icdb); + return ret; +} + +/*********************************************************************** + * _ICDraw [MSVIDEO.234] + */ +DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags, + LPVOID lpFormat, /* [???] NOTE: SEGPTR */ + LPVOID lpData, /* [???] NOTE: SEGPTR */ + DWORD cbData, LONG lTime) +{ + DWORD ret; + ICDRAW icd; + SEGPTR seg_icd; + + TRACE("(0x%08lx,0x%08lx,%p,%p,%ld,%ld)\n", (DWORD) hic, dwFlags, + lpFormat, lpData, cbData, lTime); + icd.dwFlags = dwFlags; + icd.lpFormat = lpFormat; + icd.lpData = lpData; + icd.cbData = cbData; + icd.lTime = lTime; + seg_icd = MapLS(&icd); + ret = ICSendMessage16(hic, ICM_DRAW, seg_icd, sizeof(ICDRAW)); + UnMapLS(seg_icd); + return ret; +} + +/*********************************************************************** + * ICGetDisplayFormat [MSVIDEO.239] + */ +HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn, + LPBITMAPINFOHEADER lpbiOut, INT16 depth, + INT16 dx, INT16 dy) +{ + return HIC_16(ICGetDisplayFormat(HIC_32(hic), lpbiIn, lpbiOut, depth, + dx, dy)); +} + +#define COPY(x,y) (x->y = x##16->y); +#define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y)); + +/****************************************************************** + * MSVIDEO_MapICDEX16To32 + * + * + */ +static LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) +{ + LPVOID ret; + + ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX)); + ICDECOMPRESSEX16 *icdx16 = MapSL(*lParam); + ret = icdx16; + + COPY(icdx, dwFlags); + COPYPTR(icdx, lpbiSrc); + COPYPTR(icdx, lpSrc); + COPYPTR(icdx, lpbiDst); + COPYPTR(icdx, lpDst); + COPY(icdx, xDst); + COPY(icdx, yDst); + COPY(icdx, dxDst); + COPY(icdx, dyDst); + COPY(icdx, xSrc); + COPY(icdx, ySrc); + COPY(icdx, dxSrc); + COPY(icdx, dySrc); + + *lParam = (DWORD)(icdx); + return ret; +} + +/****************************************************************** + * MSVIDEO_MapMsg16To32 + * + * + */ +static LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) +{ + LPVOID ret = 0; + + TRACE("Mapping %d\n", msg); + + switch (msg) + { + case DRV_LOAD: + case DRV_ENABLE: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + case ICM_ABOUT: + case ICM_CONFIGURE: + case ICM_COMPRESS_END: + case ICM_DECOMPRESS_END: + case ICM_DECOMPRESSEX_END: + case ICM_SETQUALITY: + case ICM_DRAW_START_PLAY: + case ICM_DRAW_STOP_PLAY: + case ICM_DRAW_REALIZE: + case ICM_DRAW_RENDERBUFFER: + case ICM_DRAW_END: + break; + case DRV_OPEN: + case ICM_GETDEFAULTQUALITY: + case ICM_GETQUALITY: + case ICM_SETSTATE: + case ICM_DRAW_WINDOW: + case ICM_GETBUFFERSWANTED: + *lParam1 = (DWORD)MapSL(*lParam1); + break; + case ICM_GETINFO: + { + ICINFO *ici = HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO)); + ICINFO16 *ici16; + + ici16 = MapSL(*lParam1); + ret = ici16; + + ici->dwSize = sizeof(ICINFO); + COPY(ici, fccType); + COPY(ici, fccHandler); + COPY(ici, dwFlags); + COPY(ici, dwVersion); + COPY(ici, dwVersionICM); + MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 ); + MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 ); + MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 ); + *lParam1 = (DWORD)(ici); + *lParam2 = sizeof(ICINFO); + } + break; + case ICM_COMPRESS: + { + ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS)); + ICCOMPRESS *icc16; + + icc16 = MapSL(*lParam1); + ret = icc16; + + COPY(icc, dwFlags); + COPYPTR(icc, lpbiOutput); + COPYPTR(icc, lpOutput); + COPYPTR(icc, lpbiInput); + COPYPTR(icc, lpInput); + COPYPTR(icc, lpckid); + COPYPTR(icc, lpdwFlags); + COPY(icc, lFrameNum); + COPY(icc, dwFrameSize); + COPY(icc, dwQuality); + COPYPTR(icc, lpbiPrev); + COPYPTR(icc, lpPrev); + + *lParam1 = (DWORD)(icc); + *lParam2 = sizeof(ICCOMPRESS); + } + break; + case ICM_DECOMPRESS: + { + ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); + ICDECOMPRESS *icd16; /* Same structure except for the pointers */ + + icd16 = MapSL(*lParam1); + ret = icd16; + + COPY(icd, dwFlags); + COPYPTR(icd, lpbiInput); + COPYPTR(icd, lpInput); + COPYPTR(icd, lpbiOutput); + COPYPTR(icd, lpOutput); + COPY(icd, ckid); + + *lParam1 = (DWORD)(icd); + *lParam2 = sizeof(ICDECOMPRESS); + } + break; + case ICM_COMPRESS_BEGIN: + case ICM_COMPRESS_GET_FORMAT: + case ICM_COMPRESS_GET_SIZE: + case ICM_COMPRESS_QUERY: + case ICM_DECOMPRESS_GET_FORMAT: + case ICM_DECOMPRESS_QUERY: + case ICM_DECOMPRESS_BEGIN: + case ICM_DECOMPRESS_SET_PALETTE: + case ICM_DECOMPRESS_GET_PALETTE: + *lParam1 = (DWORD)MapSL(*lParam1); + *lParam2 = (DWORD)MapSL(*lParam2); + break; + case ICM_DECOMPRESSEX_QUERY: + if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0)) + WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16*)*lParam2); + /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16) + * This is because of ICMessage(). Special case it? + { + LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID)); + addr[0] = MSVIDEO_MapICDEX16To32(lParam1); + if (*lParam2) + addr[1] = MSVIDEO_MapICDEX16To32(lParam2); + else + addr[1] = 0; + + ret = addr; + } + break;*/ + case ICM_DECOMPRESSEX_BEGIN: + case ICM_DECOMPRESSEX: + ret = MSVIDEO_MapICDEX16To32(lParam1); + *lParam2 = sizeof(ICDECOMPRESSEX); + break; + case ICM_DRAW_BEGIN: + { + ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN)); + ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1); + ret = icdb16; + + COPY(icdb, dwFlags); + icdb->hpal = HPALETTE_32(icdb16->hpal); + icdb->hwnd = HWND_32(icdb16->hwnd); + icdb->hdc = HDC_32(icdb16->hdc); + COPY(icdb, xDst); + COPY(icdb, yDst); + COPY(icdb, dxDst); + COPY(icdb, dyDst); + COPYPTR(icdb, lpbi); + COPY(icdb, xSrc); + COPY(icdb, ySrc); + COPY(icdb, dxSrc); + COPY(icdb, dySrc); + COPY(icdb, dwRate); + COPY(icdb, dwScale); + + *lParam1 = (DWORD)(icdb); + *lParam2 = sizeof(ICDRAWBEGIN); + } + break; + case ICM_DRAW_SUGGESTFORMAT: + { + ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST)); + ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1); + + ret = icds16; + + COPY(icds, dwFlags); + COPYPTR(icds, lpbiIn); + COPYPTR(icds, lpbiSuggest); + COPY(icds, dxSrc); + COPY(icds, dySrc); + COPY(icds, dxDst); + COPY(icds, dyDst); + icds->hicDecompressor = HIC_32(icds16->hicDecompressor); + + *lParam1 = (DWORD)(icds); + *lParam2 = sizeof(ICDRAWSUGGEST); + } + break; + case ICM_DRAW: + { + ICDRAW *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW)); + ICDRAW *icd16 = MapSL(*lParam1); + ret = icd16; + + COPY(icd, dwFlags); + COPYPTR(icd, lpFormat); + COPYPTR(icd, lpData); + COPY(icd, cbData); + COPY(icd, lTime); + + *lParam1 = (DWORD)(icd); + *lParam2 = sizeof(ICDRAW); + } + break; + case ICM_DRAW_START: + case ICM_DRAW_STOP: + break; + default: + FIXME("%d is not yet handled. Expect a crash.\n", msg); + } + return ret; +} + +#undef COPY +#undef COPYPTR + +/****************************************************************** + * MSVIDEO_UnmapMsg16To32 + * + * + */ +static void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2) +{ + TRACE("Unmapping %d\n", msg); + +#define UNCOPY(x, y) (x##16->y = x->y); + + switch (msg) + { + case ICM_GETINFO: + { + ICINFO *ici = (ICINFO*)(*lParam1); + ICINFO16 *ici16 = (ICINFO16*)data16; + + UNCOPY(ici, fccType); + UNCOPY(ici, fccHandler); + UNCOPY(ici, dwFlags); + UNCOPY(ici, dwVersion); + UNCOPY(ici, dwVersionICM); + WideCharToMultiByte( CP_ACP, 0, ici->szName, -1, ici16->szName, + sizeof(ici16->szName), NULL, NULL ); + ici16->szName[sizeof(ici16->szName)-1] = 0; + WideCharToMultiByte( CP_ACP, 0, ici->szDescription, -1, ici16->szDescription, + sizeof(ici16->szDescription), NULL, NULL ); + ici16->szDescription[sizeof(ici16->szDescription)-1] = 0; + /* This just gives garbage for some reason - BB + lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/ + + HeapFree(GetProcessHeap(), 0, ici); + } + break; + case ICM_DECOMPRESS_QUERY: + /*{ + LPVOID* x = data16; + HeapFree(GetProcessHeap(), 0, x[0]); + if (x[1]) + HeapFree(GetProcessHeap(), 0, x[1]); + } + break;*/ + case ICM_COMPRESS: + case ICM_DECOMPRESS: + case ICM_DECOMPRESSEX_QUERY: + case ICM_DECOMPRESSEX_BEGIN: + case ICM_DECOMPRESSEX: + case ICM_DRAW_BEGIN: + case ICM_DRAW_SUGGESTFORMAT: + case ICM_DRAW: + HeapFree(GetProcessHeap(), 0, data16); + break; + default: + ERR("Unmapping unmapped msg %d\n", msg); + } +#undef UNCOPY +} + +/*********************************************************************** + * ICInfo [MSVIDEO.200] + */ +BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16 *lpicinfo) +{ + BOOL16 ret; + LPVOID lpv; + DWORD lParam = (DWORD)lpicinfo; + DWORD size = ((ICINFO*)(MapSL((SEGPTR)lpicinfo)))->dwSize; + + /* Use the mapping functions to map the ICINFO structure */ + lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO, &lParam, &size); + + ret = ICInfo(fccType, fccHandler, (ICINFO*)lParam); + + MSVIDEO_UnmapMsg16To32(ICM_GETINFO, lpv, &lParam, &size); + + return ret; +} + +/****************************************************************** + * IC_Callback3216 + * + * + */ +static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2) +{ + WINE_HIC* whic; + LRESULT ret = 0; + WORD args[8]; + + whic = MSVIDEO_GetHicPtr(hic); + if (whic) + { + switch (msg) + { + case DRV_OPEN: + lp2 = (DWORD)MapLS((void*)lp2); + break; + } + args[7] = HIWORD(hic); + args[6] = LOWORD(hic); + args[5] = HDRVR_16(whic->hdrv); + args[4] = msg; + args[3] = HIWORD(lp1); + args[2] = LOWORD(lp1); + args[1] = HIWORD(lp2); + args[0] = LOWORD(lp2); + WOWCallback16Ex( (DWORD)whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &ret ); + + switch (msg) + { + case DRV_OPEN: + UnMapLS(lp2); + break; + } + } + else ret = ICERR_BADHANDLE; + return ret; +} + +/*********************************************************************** + * ICOpenFunction [MSVIDEO.206] + */ +HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler) +{ + HIC hic32; + + hic32 = MSVIDEO_OpenFunction(fccType, fccHandler, wMode, + (DRIVERPROC)IC_Callback3216, (DWORD)lpfnHandler); + return HIC_16(hic32); +} + +/*********************************************************************** + * ICSendMessage [MSVIDEO.205] + */ +LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) +{ + LRESULT ret = ICERR_BADHANDLE; + WINE_HIC* whic; + + whic = MSVIDEO_GetHicPtr(HIC_32(hic)); + if (whic) + { + /* we've got a 16 bit driver proc... call it directly */ + if (whic->driverproc16) + { + WORD args[8]; + + /* FIXME: original code was passing hdrv first and hic second */ + /* but this doesn't match what IC_Callback3216 does */ + args[7] = HIWORD(hic); + args[6] = LOWORD(hic); + args[5] = HDRVR_16(whic->hdrv); + args[4] = msg; + args[3] = HIWORD(lParam1); + args[2] = LOWORD(lParam1); + args[1] = HIWORD(lParam2); + args[0] = LOWORD(lParam2); + WOWCallback16Ex( (DWORD)whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &ret ); + } + else + { + /* map the message for a 32 bit infrastructure, and pass it along */ + void* data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2); + + ret = MSVIDEO_SendMessage(whic, msg, lParam1, lParam2); + if (data16) + MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2); + } + } + return ret; +} + +/*********************************************************************** + * VideoCapDriverDescAndVer [MSVIDEO.22] + */ +DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len, + LPSTR buf2, WORD buf2len) +{ + DWORD verhandle; + DWORD infosize; + UINT subblocklen; + char *s, buf[2048], fn[260]; + LPBYTE infobuf; + LPVOID subblock; + DWORD i, cnt = 0, lRet; + DWORD bufLen, fnLen; + FILETIME lastWrite; + HKEY hKey; + BOOL found = FALSE; + + TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len); + lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); + if (lRet == ERROR_SUCCESS) + { + RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); + for (i = 0; i < cnt; i++) + { + bufLen = sizeof(buf) / sizeof(buf[0]); + lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); + if (lRet != ERROR_SUCCESS) continue; + if (strncasecmp(buf, "vid", 3)) continue; + if (nr--) continue; + fnLen = sizeof(fn); + lRet = RegQueryValueExA(hKey, buf, 0, 0, fn, &fnLen); + if (lRet == ERROR_SUCCESS) found = TRUE; + break; + } + RegCloseKey( hKey ); + } + + /* search system.ini if not found in the registry */ + if (!found && GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini")) + { + for (s = buf; *s; s += strlen(s) + 1) + { + if (strncasecmp(s, "vid", 3)) continue; + if (nr--) continue; + if (GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini")) + found = TRUE; + break; + } + } + + if (nr || !found) + { + TRACE("No more VID* entries found nr=%d\n", nr); + return 20; + } + infosize = GetFileVersionInfoSizeA(fn, &verhandle); + if (!infosize) + { + TRACE("%s has no fileversioninfo.\n", fn); + return 18; + } + infobuf = HeapAlloc(GetProcessHeap(), 0, infosize); + if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf)) + { + char vbuf[200]; + /* Yes, two space behind : */ + /* FIXME: test for buflen */ + sprintf(vbuf, "Version: %d.%d.%d.%d\n", + ((WORD*)infobuf)[0x0f], + ((WORD*)infobuf)[0x0e], + ((WORD*)infobuf)[0x11], + ((WORD*)infobuf)[0x10] + ); + TRACE("version of %s is %s\n", fn, vbuf); + strncpy(buf2, vbuf, buf2len); + } + else + { + TRACE("GetFileVersionInfoA failed for %s.\n", fn); + strncpy(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/ + } + /* FIXME: language problem? */ + if (VerQueryValueA( infobuf, + "\\StringFileInfo\\040904E4\\FileDescription", + &subblock, + &subblocklen + )) + { + TRACE("VQA returned %s\n", (LPCSTR)subblock); + strncpy(buf1, subblock, buf1len); + } + else + { + TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n"); + strncpy(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/ + } + HeapFree(GetProcessHeap(), 0, infobuf); + return 0; +} + +/****************************************************************** + * IC_CallTo16 + * + * + */ +static LRESULT CALLBACK IC_CallTo16(HDRVR hdrv, HIC hic, UINT msg, LPARAM lp1, LPARAM lp2) +{ +#if 0 + WINE_HIC* whic = IC_GetPtr(hic); + LRESULT ret = 0; + + + if (whic->driverproc) + { + ret = whic->driverproc(hic, whic->hdrv, msg, lParam1, lParam2); + } + else + { + ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2); + } +#else + FIXME("No 32=>16 conversion yet\n"); +#endif + return 0; +} + +/************************************************************************** + * DllEntryPoint (MSVIDEO.300) + * + * MSVIDEO DLL entry point + * + */ +BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, + WORD wHeapSize, DWORD dwReserved1, WORD wReserved2) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + /* hook in our 16 bit management functions */ + pFnCallTo16 = IC_CallTo16; + break; + case DLL_PROCESS_DETACH: + /* remove our 16 bit management functions */ + pFnCallTo16 = NULL; + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} diff --git a/reactos/lib/msvideo/msvideo_main.c b/reactos/lib/msvideo/msvideo_main.c new file mode 100644 index 00000000000..0d918edb32c --- /dev/null +++ b/reactos/lib/msvideo/msvideo_main.c @@ -0,0 +1,1184 @@ +/* + * Copyright 1998 Marcus Meissner + * Copyright 2000 Bradley Baetz + * Copyright 2003 Michael Günnewig + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * FIXME: This all assumes 32 bit codecs + * Win95 appears to prefer 32 bit codecs, even from 16 bit code. + * There is the ICOpenFunction16 to worry about still, though. + * + * TODO + * - no thread safety + */ + +#include +#include + +#include "msvideo_private.h" +#include "winnls.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" + +#include "windowsx.h" + +#include "wine/debug.h" + +/* Drivers32 settings */ +#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32" + +WINE_DEFAULT_DEBUG_CHANNEL(msvideo); + +static inline const char *wine_dbgstr_fcc( DWORD fcc ) +{ + return wine_dbg_sprintf("%c%c%c%c", + LOBYTE(LOWORD(fcc)), HIBYTE(LOWORD(fcc)), + LOBYTE(HIWORD(fcc)), HIBYTE(HIWORD(fcc))); +} + +LRESULT (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM) = NULL; + +static WINE_HIC* MSVIDEO_FirstHic /* = NULL */; + +typedef struct _reg_driver reg_driver; +struct _reg_driver +{ + DWORD fccType; + DWORD fccHandler; + DRIVERPROC proc; + LPWSTR name; + reg_driver* next; +}; + +static reg_driver* reg_driver_list = NULL; + +/* This one is a macro such that it works for both ASCII and Unicode */ +#define fourcc_to_string(str, fcc) do { \ + (str)[0] = LOBYTE(LOWORD(fcc)); \ + (str)[1] = HIBYTE(LOWORD(fcc)); \ + (str)[2] = LOBYTE(HIWORD(fcc)); \ + (str)[3] = HIBYTE(HIWORD(fcc)); \ + } while(0) + +HMODULE MSVFW32_hModule; + +BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) +{ + TRACE("%p,%lx,%p\n", hinst, reason, reserved); + + switch(reason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinst); + MSVFW32_hModule = (HMODULE)hinst; + break; + } + return TRUE; +} + +static int compare_fourcc(DWORD fcc1, DWORD fcc2) +{ + char fcc_str1[4]; + char fcc_str2[4]; + fourcc_to_string(fcc_str1, fcc1); + fourcc_to_string(fcc_str2, fcc2); + return strncasecmp(fcc_str1, fcc_str2, 4); +} + +typedef BOOL (*enum_handler_t)(const char*, int, void*); + +static BOOL enum_drivers(DWORD fccType, enum_handler_t handler, void* param) +{ + CHAR buf[2048], fccTypeStr[5], *s; + DWORD i, cnt = 0, bufLen, lRet; + BOOL result = FALSE; + FILETIME lastWrite; + HKEY hKey; + + fourcc_to_string(fccTypeStr, fccType); + fccTypeStr[4] = '.'; + + /* first, go through the registry entries */ + lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); + if (lRet == ERROR_SUCCESS) + { + RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); + for (i = 0; i < cnt; i++) + { + bufLen = sizeof(buf) / sizeof(buf[0]); + lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); + if (lRet != ERROR_SUCCESS) continue; + if (strncasecmp(buf, fccTypeStr, 5) || buf[9] != '=') continue; + if ((result = handler(buf, i, param))) break; + } + RegCloseKey( hKey ); + } + if (result) return result; + + /* if that didn't work, go through the values in system.ini */ + if (GetPrivateProfileSectionA("drivers32", buf, sizeof(buf), "system.ini")) + { + for (s = buf; *s; cnt++, s += strlen(s) + 1) + { + if (strncasecmp(s, fccTypeStr, 5) || s[9] != '=') continue; + if ((result = handler(s, cnt, param))) break; + } + } + + return result; +} + +/****************************************************************** + * MSVIDEO_GetHicPtr + * + * + */ +WINE_HIC* MSVIDEO_GetHicPtr(HIC hic) +{ + WINE_HIC* whic; + + for (whic = MSVIDEO_FirstHic; whic && whic->hic != hic; whic = whic->next); + return whic; +} + +/*********************************************************************** + * VideoForWindowsVersion [MSVFW32.2] + * VideoForWindowsVersion [MSVIDEO.2] + * Returns the version in major.minor form. + * In Windows95 this returns 0x040003b6 (4.950) + */ +DWORD WINAPI VideoForWindowsVersion(void) +{ + return 0x040003B6; /* 4.950 */ +} + +static BOOL ICInfo_enum_handler(const char *drv, int nr, void *param) +{ + ICINFO *lpicinfo = (ICINFO *)param; + DWORD fccHandler = mmioStringToFOURCCA(drv + 5, 0); + + /* exact match of fccHandler or nth driver found */ + if ((lpicinfo->fccHandler != nr) && (lpicinfo->fccHandler != fccHandler)) + return FALSE; + + lpicinfo->fccType = mmioStringToFOURCCA(drv, 0); + lpicinfo->fccHandler = fccHandler; + lpicinfo->dwFlags = 0; + lpicinfo->dwVersion = 0; + lpicinfo->dwVersionICM = 0x104; + lpicinfo->szName[0] = 0; + lpicinfo->szDescription[0] = 0; + MultiByteToWideChar(CP_ACP, 0, drv + 10, -1, lpicinfo->szDriver, + sizeof(lpicinfo->szDriver)/sizeof(WCHAR)); + + return TRUE; +} + +/*********************************************************************** + * ICInfo [MSVFW32.@] + * Get information about an installable compressor. Return TRUE if there + * is one. + * + * PARAMS + * fccType [I] type of compressor (e.g. 'vidc') + * fccHandler [I] real fcc for handler or th compressor + * lpicinfo [O] information about compressor + */ +BOOL VFWAPI ICInfo( DWORD fccType, DWORD fccHandler, ICINFO *lpicinfo) +{ + TRACE("(%s,%s/%08lx,%p)\n", + wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), fccHandler, lpicinfo); + + lpicinfo->fccHandler = fccHandler; + return enum_drivers(fccType, ICInfo_enum_handler, lpicinfo); +} + +static DWORD IC_HandleRef = 1; + +/*********************************************************************** + * ICInstall [MSVFW32.@] + */ +BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags) +{ + reg_driver* driver; + unsigned len; + + TRACE("(%s,%s,%p,%p,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), (void*)lParam, szDesc, wFlags); + + /* Check if a driver is already registered */ + for (driver = reg_driver_list; driver; driver = driver->next) + { + if (!compare_fourcc(fccType, driver->fccType) && + !compare_fourcc(fccHandler, driver->fccHandler)) + break; + } + if (driver) return FALSE; + + /* Register the driver */ + driver = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(reg_driver)); + if (!driver) goto oom; + driver->fccType = fccType; + driver->fccHandler = fccHandler; + + switch(wFlags) + { + case ICINSTALL_FUNCTION: + driver->proc = (DRIVERPROC)lParam; + driver->name = NULL; + break; + case ICINSTALL_DRIVER: + driver->proc = NULL; + len = MultiByteToWideChar(CP_ACP, 0, (char*)lParam, -1, NULL, 0); + driver->name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (!driver->name) goto oom; + MultiByteToWideChar(CP_ACP, 0, (char*)lParam, -1, driver->name, len); + break; + default: + ERR("Invalid flags!\n"); + HeapFree(GetProcessHeap(), 0, driver); + return FALSE; + } + + /* Insert our driver in the list*/ + driver->next = reg_driver_list; + reg_driver_list = driver; + + return TRUE; + oom: + if (driver) HeapFree(GetProcessHeap(), 0, driver); + return FALSE; +} + +/*********************************************************************** + * ICRemove [MSVFW32.@] + */ +BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags) +{ + reg_driver** pdriver; + + TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wFlags); + + /* Check if a driver is already registered */ + for (pdriver = ®_driver_list; *pdriver; pdriver = &(*pdriver)->next) + { + if (!compare_fourcc(fccType, (*pdriver)->fccType) && + !compare_fourcc(fccHandler, (*pdriver)->fccHandler)) + break; + } + if (!*pdriver) + return FALSE; + + /* Remove the driver from the list */ + *pdriver = (*pdriver)->next; + if ((*pdriver)->name) + HeapFree(GetProcessHeap(), 0, (*pdriver)->name); + HeapFree(GetProcessHeap(), 0, *pdriver); + + return TRUE; +} + + +/*********************************************************************** + * ICOpen [MSVFW32.@] + * Opens an installable compressor. Return special handle. + */ +HIC VFWAPI ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode) +{ + WCHAR codecname[10]; + ICOPEN icopen; + HDRVR hdrv; + WINE_HIC* whic; + BOOL bIs16; + static const WCHAR drv32W[] = {'d','r','i','v','e','r','s','3','2','\0'}; + reg_driver* driver; + + TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wMode); + + /* Check if there is a registered driver that matches */ + driver = reg_driver_list; + while(driver) + if (!compare_fourcc(fccType, driver->fccType) && + !compare_fourcc(fccHandler, driver->fccHandler)) + break; + else + driver = driver->next; + + if (driver && driver->proc) + /* The driver has been registered at runtime with its driverproc */ + return MSVIDEO_OpenFunction(fccType, fccHandler, wMode, (DRIVERPROC)driver->proc, (DWORD)NULL); + + /* Well, lParam2 is in fact a LPVIDEO_OPEN_PARMS, but it has the + * same layout as ICOPEN + */ + icopen.dwSize = sizeof(ICOPEN); + icopen.fccType = fccType; + icopen.fccHandler = fccHandler; + icopen.dwVersion = 0x00001000; /* FIXME */ + icopen.dwFlags = wMode; + icopen.dwError = 0; + icopen.pV1Reserved = NULL; + icopen.pV2Reserved = NULL; + icopen.dnDevNode = 0; /* FIXME */ + + if (!driver) { + /* The driver is registered in the registry */ + fourcc_to_string(codecname, fccType); + codecname[4] = '.'; + fourcc_to_string(codecname + 5, fccHandler); + codecname[9] = '\0'; + + hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen); + if (!hdrv) + { + if (fccType == streamtypeVIDEO) + { + codecname[0] = 'v'; + codecname[1] = 'i'; + codecname[2] = 'd'; + codecname[3] = 'c'; + + fccType = ICTYPE_VIDEO; + hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen); + } + if (!hdrv) + return 0; + } + } else { + /* The driver has been registered at runtime with its name */ + hdrv = OpenDriver(driver->name, NULL, (LPARAM)&icopen); + if (!hdrv) + return 0; + } + bIs16 = GetDriverFlags(hdrv) & 0x10000000; /* undocumented flag: WINE_GDF_16BIT */ + + if (bIs16 && !pFnCallTo16) + { + FIXME("Got a 16 bit driver, but no 16 bit support in msvfw\n"); + return 0; + } + whic = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_HIC)); + if (!whic) + { + CloseDriver(hdrv, 0, 0); + return FALSE; + } + whic->hdrv = hdrv; + /* FIXME: is the signature the real one ? */ + whic->driverproc = bIs16 ? (DRIVERPROC)pFnCallTo16 : NULL; + whic->driverproc16 = 0; + whic->type = fccType; + whic->handler = fccHandler; + while (MSVIDEO_GetHicPtr(HIC_32(IC_HandleRef)) != NULL) IC_HandleRef++; + whic->hic = HIC_32(IC_HandleRef++); + whic->next = MSVIDEO_FirstHic; + MSVIDEO_FirstHic = whic; + + TRACE("=> %p\n", whic->hic); + return whic->hic; +} + +/*********************************************************************** + * MSVIDEO_OpenFunction + */ +HIC MSVIDEO_OpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, + DRIVERPROC lpfnHandler, DWORD lpfnHandler16) +{ + ICOPEN icopen; + WINE_HIC* whic; + + TRACE("(%s,%s,%d,%p,%08lx)\n", + wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wMode, lpfnHandler, lpfnHandler16); + + icopen.dwSize = sizeof(ICOPEN); + icopen.fccType = fccType; + icopen.fccHandler = fccHandler; + icopen.dwVersion = 0x00001000; /* FIXME */ + icopen.dwFlags = wMode; + icopen.dwError = 0; + icopen.pV1Reserved = NULL; + icopen.pV2Reserved = NULL; + icopen.dnDevNode = 0; /* FIXME */ + + whic = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_HIC)); + if (!whic) return 0; + + whic->driverproc = lpfnHandler; + whic->driverproc16 = lpfnHandler16; + while (MSVIDEO_GetHicPtr(HIC_32(IC_HandleRef)) != NULL) IC_HandleRef++; + whic->hic = HIC_32(IC_HandleRef++); + whic->next = MSVIDEO_FirstHic; + MSVIDEO_FirstHic = whic; + + /* Now try opening/loading the driver. Taken from DRIVER_AddToList */ + /* What if the function is used more than once? */ + + if (MSVIDEO_SendMessage(whic, DRV_LOAD, 0L, 0L) != DRV_SUCCESS) + { + WARN("DRV_LOAD failed for hic %p\n", whic->hic); + MSVIDEO_FirstHic = whic->next; + HeapFree(GetProcessHeap(), 0, whic); + return 0; + } + /* return value is not checked */ + MSVIDEO_SendMessage(whic, DRV_ENABLE, 0L, 0L); + + whic->driverId = (DWORD)MSVIDEO_SendMessage(whic, DRV_OPEN, 0, (DWORD)&icopen); + /* FIXME: What should we put here? */ + whic->hdrv = (HDRVR)0; + + if (whic->driverId == 0) + { + WARN("DRV_OPEN failed for hic %p\n", whic->hic); + MSVIDEO_FirstHic = whic->next; + HeapFree(GetProcessHeap(), 0, whic); + return 0; + } + + TRACE("=> %p\n", whic->hic); + return whic->hic; +} + +/*********************************************************************** + * ICOpenFunction [MSVFW32.@] + */ +HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler) +{ + return MSVIDEO_OpenFunction(fccType, fccHandler, wMode, (DRIVERPROC)lpfnHandler, 0); +} + +/*********************************************************************** + * ICGetInfo [MSVFW32.@] + */ +LRESULT VFWAPI ICGetInfo(HIC hic, ICINFO *picinfo, DWORD cb) +{ + LRESULT ret; + WINE_HIC* whic = MSVIDEO_GetHicPtr(hic); + + TRACE("(%p,%p,%ld)\n", hic, picinfo, cb); + + whic = MSVIDEO_GetHicPtr(hic); + if (!whic) return ICERR_BADHANDLE; + if (!picinfo) return MMSYSERR_INVALPARAM; + + /* (WS) The field szDriver should be initialized because the driver + * is not obliged and often will not do it. Some applications, like + * VirtualDub, rely on this field and will occasionally crash if it + * goes unitialized. + */ + if (cb >= sizeof(ICINFO)) picinfo->szDriver[0] = '\0'; + + ret = ICSendMessage(hic, ICM_GETINFO, (DWORD)picinfo, cb); + + /* (WS) When szDriver was not supplied by the driver itself, apparently + * Windows will set its value equal to the driver file name. This can + * be obtained from the registry as we do here. + */ + if (cb >= sizeof(ICINFO) && picinfo->szDriver[0] == 0) + { + ICINFO ii; + + memset(&ii, 0, sizeof(ii)); + ii.dwSize = sizeof(ii); + ICInfo(picinfo->fccType, picinfo->fccHandler, &ii); + lstrcpyW(picinfo->szDriver, ii.szDriver); + } + + TRACE(" -> 0x%08lx\n", ret); + return ret; +} + +typedef struct { + DWORD fccType; + DWORD fccHandler; + LPBITMAPINFOHEADER lpbiIn; + LPBITMAPINFOHEADER lpbiOut; + WORD wMode; + DWORD querymsg; + HIC hic; +} driver_info_t; + +static HIC try_driver(driver_info_t *info) +{ + HIC hic; + + if ((hic = ICOpen(info->fccType, info->fccHandler, info->wMode))) + { + if (!ICSendMessage(hic, info->querymsg, (DWORD)info->lpbiIn, (DWORD)info->lpbiOut)) + return hic; + ICClose(hic); + } + return 0; +} + +static BOOL ICLocate_enum_handler(const char *drv, int nr, void *param) +{ + driver_info_t *info = (driver_info_t *)param; + info->fccHandler = mmioStringToFOURCCA(drv + 5, 0); + info->hic = try_driver(info); + return info->hic != 0; +} + +/*********************************************************************** + * ICLocate [MSVFW32.@] + */ +HIC VFWAPI ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, + LPBITMAPINFOHEADER lpbiOut, WORD wMode) +{ + driver_info_t info; + + TRACE("(%s,%s,%p,%p,0x%04x)\n", + wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), lpbiIn, lpbiOut, wMode); + + info.fccType = fccType; + info.fccHandler = fccHandler; + info.lpbiIn = lpbiIn; + info.lpbiOut = lpbiOut; + info.wMode = wMode; + + switch (wMode) + { + case ICMODE_FASTCOMPRESS: + case ICMODE_COMPRESS: + info.querymsg = ICM_COMPRESS_QUERY; + break; + case ICMODE_FASTDECOMPRESS: + case ICMODE_DECOMPRESS: + info.querymsg = ICM_DECOMPRESS_QUERY; + break; + case ICMODE_DRAW: + info.querymsg = ICM_DRAW_QUERY; + break; + default: + WARN("Unknown mode (%d)\n", wMode); + return 0; + } + + /* Easy case: handler/type match, we just fire a query and return */ + info.hic = try_driver(&info); + /* If it didn't work, try each driver in turn. 32 bit codecs only. */ + /* FIXME: Move this to an init routine? */ + if (!info.hic) enum_drivers(fccType, ICLocate_enum_handler, &info); + + if (info.hic) + { + TRACE("=> %p\n", info.hic); + return info.hic; + } + + if (fccType == streamtypeVIDEO) + return ICLocate(ICTYPE_VIDEO, fccHandler, lpbiIn, lpbiOut, wMode); + + WARN("(%s,%s,%p,%p,0x%04x) not found!\n", + wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), lpbiIn, lpbiOut, wMode); + return 0; +} + +/*********************************************************************** + * ICGetDisplayFormat [MSVFW32.@] + */ +HIC VFWAPI ICGetDisplayFormat( + HIC hic,LPBITMAPINFOHEADER lpbiIn,LPBITMAPINFOHEADER lpbiOut, + INT depth,INT dx,INT dy) +{ + HIC tmphic = hic; + + TRACE("(%p,%p,%p,%d,%d,%d)!\n",hic,lpbiIn,lpbiOut,depth,dx,dy); + + if (!tmphic) { + tmphic=ICLocate(ICTYPE_VIDEO,0,lpbiIn,NULL,ICMODE_DECOMPRESS); + if (!tmphic) + return tmphic; + } + if ((dy == lpbiIn->biHeight) && (dx == lpbiIn->biWidth)) + dy = dx = 0; /* no resize needed */ + + /* Can we decompress it ? */ + if (ICDecompressQuery(tmphic,lpbiIn,NULL) != 0) + goto errout; /* no, sorry */ + + ICDecompressGetFormat(tmphic,lpbiIn,lpbiOut); + + if (lpbiOut->biCompression != 0) { + FIXME("Ooch, how come decompressor outputs compressed data (%ld)??\n", + lpbiOut->biCompression); + } + if (lpbiOut->biSize < sizeof(*lpbiOut)) { + FIXME("Ooch, size of output BIH is too small (%ld)\n", + lpbiOut->biSize); + lpbiOut->biSize = sizeof(*lpbiOut); + } + if (!depth) { + HDC hdc; + + hdc = GetDC(0); + depth = GetDeviceCaps(hdc,BITSPIXEL)*GetDeviceCaps(hdc,PLANES); + ReleaseDC(0,hdc); + if (depth==15) depth = 16; + if (depth<8) depth = 8; + } + if (lpbiIn->biBitCount == 8) + depth = 8; + + TRACE("=> %p\n", tmphic); + return tmphic; +errout: + if (hic!=tmphic) + ICClose(tmphic); + + TRACE("=> 0\n"); + return 0; +} + +/*********************************************************************** + * ICCompress [MSVFW32.@] + */ +DWORD VFWAPIV +ICCompress( + HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData, + LPBITMAPINFOHEADER lpbiInput,LPVOID lpBits,LPDWORD lpckid, + LPDWORD lpdwFlags,LONG lFrameNum,DWORD dwFrameSize,DWORD dwQuality, + LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev) +{ + ICCOMPRESS iccmp; + + TRACE("(%p,%ld,%p,%p,%p,%p,...)\n",hic,dwFlags,lpbiOutput,lpData,lpbiInput,lpBits); + + iccmp.dwFlags = dwFlags; + + iccmp.lpbiOutput = lpbiOutput; + iccmp.lpOutput = lpData; + iccmp.lpbiInput = lpbiInput; + iccmp.lpInput = lpBits; + + iccmp.lpckid = lpckid; + iccmp.lpdwFlags = lpdwFlags; + iccmp.lFrameNum = lFrameNum; + iccmp.dwFrameSize = dwFrameSize; + iccmp.dwQuality = dwQuality; + iccmp.lpbiPrev = lpbiPrev; + iccmp.lpPrev = lpPrev; + return ICSendMessage(hic,ICM_COMPRESS,(DWORD)&iccmp,sizeof(iccmp)); +} + +/*********************************************************************** + * ICDecompress [MSVFW32.@] + */ +DWORD VFWAPIV ICDecompress(HIC hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat, + LPVOID lpData,LPBITMAPINFOHEADER lpbi,LPVOID lpBits) +{ + ICDECOMPRESS icd; + DWORD ret; + + TRACE("(%p,%ld,%p,%p,%p,%p)\n",hic,dwFlags,lpbiFormat,lpData,lpbi,lpBits); + + TRACE("lpBits[0] == %lx\n",((LPDWORD)lpBits)[0]); + + icd.dwFlags = dwFlags; + icd.lpbiInput = lpbiFormat; + icd.lpInput = lpData; + + icd.lpbiOutput = lpbi; + icd.lpOutput = lpBits; + icd.ckid = 0; + ret = ICSendMessage(hic,ICM_DECOMPRESS,(DWORD)&icd,sizeof(ICDECOMPRESS)); + + TRACE("lpBits[0] == %lx\n",((LPDWORD)lpBits)[0]); + + TRACE("-> %ld\n",ret); + + return ret; +} + + +/*********************************************************************** + * ICCompressorChoose [MSVFW32.@] + */ +BOOL VFWAPI ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn, + LPVOID lpData, PCOMPVARS pc, LPSTR lpszTitle) +{ + FIXME("(%p,0x%X,%p,%p,%p,%s),stub!\n",hwnd,uiFlags,pvIn,lpData,pc,lpszTitle); + + if (pc == NULL || pc->cbSize != sizeof(COMPVARS)) + return FALSE; + + if ((pc->dwFlags & ICMF_COMPVARS_VALID) == 0) { + pc->dwFlags = 0; + pc->fccType = pc->fccHandler = 0; + pc->hic = NULL; + pc->lpbiOut = NULL; + pc->lpBitsOut = pc->lpBitsPrev = pc->lpState = NULL; + pc->lQ = ICQUALITY_DEFAULT; + pc->lKey = -1; + pc->lDataRate = 300; /* kB */ + pc->lpState = NULL; + pc->cbState = 0; + } + if (pc->fccType == 0) + pc->fccType = ICTYPE_VIDEO; + + /* FIXME */ + + return FALSE; +} + + +/*********************************************************************** + * ICCompressorFree [MSVFW32.@] + */ +void VFWAPI ICCompressorFree(PCOMPVARS pc) +{ + TRACE("(%p)\n",pc); + + if (pc != NULL && pc->cbSize == sizeof(COMPVARS)) { + if (pc->hic != NULL) { + ICClose(pc->hic); + pc->hic = NULL; + } + if (pc->lpbiOut != NULL) { + GlobalFreePtr(pc->lpbiOut); + pc->lpbiOut = NULL; + } + if (pc->lpBitsOut != NULL) { + GlobalFreePtr(pc->lpBitsOut); + pc->lpBitsOut = NULL; + } + if (pc->lpBitsPrev != NULL) { + GlobalFreePtr(pc->lpBitsPrev); + pc->lpBitsPrev = NULL; + } + if (pc->lpState != NULL) { + GlobalFreePtr(pc->lpBitsPrev); + pc->lpState = NULL; + } + pc->dwFlags = 0; + } +} + + +/****************************************************************** + * MSVIDEO_SendMessage + * + * + */ +LRESULT MSVIDEO_SendMessage(WINE_HIC* whic, UINT msg, DWORD lParam1, DWORD lParam2) +{ + LRESULT ret; + +#define XX(x) case x: TRACE("(%p,"#x",0x%08lx,0x%08lx)\n",whic,lParam1,lParam2); break; + + switch (msg) { + /* DRV_* */ + XX(DRV_LOAD); + XX(DRV_ENABLE); + XX(DRV_OPEN); + XX(DRV_CLOSE); + XX(DRV_DISABLE); + XX(DRV_FREE); + /* ICM_RESERVED+X */ + XX(ICM_ABOUT); + XX(ICM_CONFIGURE); + XX(ICM_GET); + XX(ICM_GETINFO); + XX(ICM_GETDEFAULTQUALITY); + XX(ICM_GETQUALITY); + XX(ICM_GETSTATE); + XX(ICM_SETQUALITY); + XX(ICM_SET); + XX(ICM_SETSTATE); + /* ICM_USER+X */ + XX(ICM_COMPRESS_FRAMES_INFO); + XX(ICM_COMPRESS_GET_FORMAT); + XX(ICM_COMPRESS_GET_SIZE); + XX(ICM_COMPRESS_QUERY); + XX(ICM_COMPRESS_BEGIN); + XX(ICM_COMPRESS); + XX(ICM_COMPRESS_END); + XX(ICM_DECOMPRESS_GET_FORMAT); + XX(ICM_DECOMPRESS_QUERY); + XX(ICM_DECOMPRESS_BEGIN); + XX(ICM_DECOMPRESS); + XX(ICM_DECOMPRESS_END); + XX(ICM_DECOMPRESS_SET_PALETTE); + XX(ICM_DECOMPRESS_GET_PALETTE); + XX(ICM_DRAW_QUERY); + XX(ICM_DRAW_BEGIN); + XX(ICM_DRAW_GET_PALETTE); + XX(ICM_DRAW_START); + XX(ICM_DRAW_STOP); + XX(ICM_DRAW_END); + XX(ICM_DRAW_GETTIME); + XX(ICM_DRAW); + XX(ICM_DRAW_WINDOW); + XX(ICM_DRAW_SETTIME); + XX(ICM_DRAW_REALIZE); + XX(ICM_DRAW_FLUSH); + XX(ICM_DRAW_RENDERBUFFER); + XX(ICM_DRAW_START_PLAY); + XX(ICM_DRAW_STOP_PLAY); + XX(ICM_DRAW_SUGGESTFORMAT); + XX(ICM_DRAW_CHANGEPALETTE); + XX(ICM_GETBUFFERSWANTED); + XX(ICM_GETDEFAULTKEYFRAMERATE); + XX(ICM_DECOMPRESSEX_BEGIN); + XX(ICM_DECOMPRESSEX_QUERY); + XX(ICM_DECOMPRESSEX); + XX(ICM_DECOMPRESSEX_END); + XX(ICM_SET_STATUS_PROC); + default: + FIXME("(%p,0x%08lx,0x%08lx,0x%08lx) unknown message\n",whic,(DWORD)msg,lParam1,lParam2); + } + +#undef XX + + if (whic->driverproc) { + /* dwDriverId parameter is the value returned by the DRV_OPEN */ + ret = whic->driverproc(whic->driverId, whic->hdrv, msg, lParam1, lParam2); + } else { + ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2); + } + + TRACE(" -> 0x%08lx\n", ret); + return ret; +} + +/*********************************************************************** + * ICSendMessage [MSVFW32.@] + */ +LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD lParam1, DWORD lParam2) +{ + WINE_HIC* whic = MSVIDEO_GetHicPtr(hic); + + if (!whic) return ICERR_BADHANDLE; + return MSVIDEO_SendMessage(whic, msg, lParam1, lParam2); +} + +/*********************************************************************** + * ICDrawBegin [MSVFW32.@] + */ +DWORD VFWAPIV ICDrawBegin( + HIC hic, /* [in] */ + DWORD dwFlags, /* [in] flags */ + HPALETTE hpal, /* [in] palette to draw with */ + HWND hwnd, /* [in] window to draw to */ + HDC hdc, /* [in] HDC to draw to */ + INT xDst, /* [in] destination rectangle */ + INT yDst, /* [in] */ + INT dxDst, /* [in] */ + INT dyDst, /* [in] */ + LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw */ + INT xSrc, /* [in] source rectangle */ + INT ySrc, /* [in] */ + INT dxSrc, /* [in] */ + INT dySrc, /* [in] */ + DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */ + DWORD dwScale) /* [in] */ +{ + + ICDRAWBEGIN icdb; + + TRACE("(%p,%ld,%p,%p,%p,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n", + hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst, + lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale); + + icdb.dwFlags = dwFlags; + icdb.hpal = hpal; + icdb.hwnd = hwnd; + icdb.hdc = hdc; + icdb.xDst = xDst; + icdb.yDst = yDst; + icdb.dxDst = dxDst; + icdb.dyDst = dyDst; + icdb.lpbi = lpbi; + icdb.xSrc = xSrc; + icdb.ySrc = ySrc; + icdb.dxSrc = dxSrc; + icdb.dySrc = dySrc; + icdb.dwRate = dwRate; + icdb.dwScale = dwScale; + return ICSendMessage(hic,ICM_DRAW_BEGIN,(DWORD)&icdb,sizeof(icdb)); +} + +/*********************************************************************** + * ICDraw [MSVFW32.@] + */ +DWORD VFWAPIV ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime) { + ICDRAW icd; + + TRACE("(%p,%ld,%p,%p,%ld,%ld)\n",hic,dwFlags,lpFormat,lpData,cbData,lTime); + + icd.dwFlags = dwFlags; + icd.lpFormat = lpFormat; + icd.lpData = lpData; + icd.cbData = cbData; + icd.lTime = lTime; + + return ICSendMessage(hic,ICM_DRAW,(DWORD)&icd,sizeof(icd)); +} + +/*********************************************************************** + * ICClose [MSVFW32.@] + */ +LRESULT WINAPI ICClose(HIC hic) +{ + WINE_HIC* whic = MSVIDEO_GetHicPtr(hic); + WINE_HIC** p; + + TRACE("(%p)\n",hic); + + if (!whic) return ICERR_BADHANDLE; + + if (whic->driverproc) + { + MSVIDEO_SendMessage(whic, DRV_CLOSE, 0, 0); + MSVIDEO_SendMessage(whic, DRV_DISABLE, 0, 0); + MSVIDEO_SendMessage(whic, DRV_FREE, 0, 0); + } + else + { + CloseDriver(whic->hdrv, 0, 0); + } + + /* remove whic from list */ + for (p = &MSVIDEO_FirstHic; *p != NULL; p = &((*p)->next)) + { + if ((*p) == whic) + { + *p = whic->next; + break; + } + } + + HeapFree(GetProcessHeap(), 0, whic); + return 0; +} + + + +/*********************************************************************** + * ICImageCompress [MSVFW32.@] + */ +HANDLE VFWAPI ICImageCompress( + HIC hic, UINT uiFlags, + LPBITMAPINFO lpbiIn, LPVOID lpBits, + LPBITMAPINFO lpbiOut, LONG lQuality, + LONG* plSize) +{ + FIXME("(%p,%08x,%p,%p,%p,%ld,%p)\n", + hic, uiFlags, lpbiIn, lpBits, lpbiOut, lQuality, plSize); + + return NULL; +} + +/*********************************************************************** + * ICImageDecompress [MSVFW32.@] + */ + +HANDLE VFWAPI ICImageDecompress( + HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn, + LPVOID lpBits, LPBITMAPINFO lpbiOut) +{ + HGLOBAL hMem = NULL; + BYTE* pMem = NULL; + BOOL bReleaseIC = FALSE; + BYTE* pHdr = NULL; + LONG cbHdr = 0; + BOOL bSucceeded = FALSE; + BOOL bInDecompress = FALSE; + DWORD biSizeImage; + + TRACE("(%p,%08x,%p,%p,%p)\n", + hic, uiFlags, lpbiIn, lpBits, lpbiOut); + + if ( hic == NULL ) + { + hic = ICDecompressOpen( ICTYPE_VIDEO, 0, &lpbiIn->bmiHeader, (lpbiOut != NULL) ? &lpbiOut->bmiHeader : NULL ); + if ( hic == NULL ) + { + WARN("no handler\n" ); + goto err; + } + bReleaseIC = TRUE; + } + if ( uiFlags != 0 ) + { + FIXME( "unknown flag %08x\n", uiFlags ); + goto err; + } + if ( lpbiIn == NULL || lpBits == NULL ) + { + WARN("invalid argument\n"); + goto err; + } + + if ( lpbiOut != NULL ) + { + if ( lpbiOut->bmiHeader.biSize != sizeof(BITMAPINFOHEADER) ) + goto err; + cbHdr = sizeof(BITMAPINFOHEADER); + if ( lpbiOut->bmiHeader.biCompression == 3 ) + cbHdr += sizeof(DWORD)*3; + else + if ( lpbiOut->bmiHeader.biBitCount <= 8 ) + { + if ( lpbiOut->bmiHeader.biClrUsed == 0 ) + cbHdr += sizeof(RGBQUAD) * (1<bmiHeader.biBitCount); + else + cbHdr += sizeof(RGBQUAD) * lpbiOut->bmiHeader.biClrUsed; + } + } + else + { + TRACE( "get format\n" ); + + cbHdr = ICDecompressGetFormatSize(hic,lpbiIn); + if ( cbHdr < sizeof(BITMAPINFOHEADER) ) + goto err; + pHdr = (BYTE*)HeapAlloc(GetProcessHeap(),0,cbHdr+sizeof(RGBQUAD)*256); + if ( pHdr == NULL ) + goto err; + ZeroMemory( pHdr, cbHdr+sizeof(RGBQUAD)*256 ); + if ( ICDecompressGetFormat( hic, lpbiIn, (BITMAPINFO*)pHdr ) != ICERR_OK ) + goto err; + lpbiOut = (BITMAPINFO*)pHdr; + if ( lpbiOut->bmiHeader.biBitCount <= 8 && + ICDecompressGetPalette( hic, lpbiIn, lpbiOut ) != ICERR_OK && + lpbiIn->bmiHeader.biBitCount == lpbiOut->bmiHeader.biBitCount ) + { + if ( lpbiIn->bmiHeader.biClrUsed == 0 ) + memcpy( lpbiOut->bmiColors, lpbiIn->bmiColors, sizeof(RGBQUAD)*(1<bmiHeader.biBitCount) ); + else + memcpy( lpbiOut->bmiColors, lpbiIn->bmiColors, sizeof(RGBQUAD)*lpbiIn->bmiHeader.biClrUsed ); + } + if ( lpbiOut->bmiHeader.biBitCount <= 8 && + lpbiOut->bmiHeader.biClrUsed == 0 ) + lpbiOut->bmiHeader.biClrUsed = 1<bmiHeader.biBitCount; + + lpbiOut->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + cbHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*lpbiOut->bmiHeader.biClrUsed; + } + + biSizeImage = lpbiOut->bmiHeader.biSizeImage; + if ( biSizeImage == 0 ) + biSizeImage = ((((lpbiOut->bmiHeader.biWidth * lpbiOut->bmiHeader.biBitCount + 7) >> 3) + 3) & (~3)) * abs(lpbiOut->bmiHeader.biHeight); + + TRACE( "call ICDecompressBegin\n" ); + + if ( ICDecompressBegin( hic, lpbiIn, lpbiOut ) != ICERR_OK ) + goto err; + bInDecompress = TRUE; + + TRACE( "cbHdr %ld, biSizeImage %ld\n", cbHdr, biSizeImage ); + + hMem = GlobalAlloc( GMEM_MOVEABLE|GMEM_ZEROINIT, cbHdr + biSizeImage ); + if ( hMem == NULL ) + { + WARN( "out of memory\n" ); + goto err; + } + pMem = (BYTE*)GlobalLock( hMem ); + if ( pMem == NULL ) + goto err; + memcpy( pMem, lpbiOut, cbHdr ); + + TRACE( "call ICDecompress\n" ); + if ( ICDecompress( hic, 0, &lpbiIn->bmiHeader, lpBits, &lpbiOut->bmiHeader, pMem+cbHdr ) != ICERR_OK ) + goto err; + + bSucceeded = TRUE; +err: + if ( bInDecompress ) + ICDecompressEnd( hic ); + if ( bReleaseIC ) + ICClose(hic); + if ( pHdr != NULL ) + HeapFree(GetProcessHeap(),0,pHdr); + if ( pMem != NULL ) + GlobalUnlock( hMem ); + if ( !bSucceeded && hMem != NULL ) + { + GlobalFree(hMem); hMem = NULL; + } + + return (HANDLE)hMem; +} + +static BOOL GetFileNamePreview(LPVOID lpofn,BOOL bSave,BOOL bUnicode) +{ + CHAR szFunctionName[20]; + BOOL (*fnGetFileName)(LPVOID); + HMODULE hComdlg32; + BOOL ret; + + FIXME("(%p,%d,%d), semi-stub!\n",lpofn,bSave,bUnicode); + + lstrcpyA(szFunctionName, (bSave ? "GetSaveFileName" : "GetOpenFileName")); + lstrcatA(szFunctionName, (bUnicode ? "W" : "A")); + + hComdlg32 = LoadLibraryA("COMDLG32.DLL"); + if (hComdlg32 == NULL) + return FALSE; + + fnGetFileName = (LPVOID)GetProcAddress(hComdlg32, szFunctionName); + if (fnGetFileName == NULL) + return FALSE; + + /* FIXME: need to add OFN_ENABLEHOOK and our own handler */ + ret = fnGetFileName(lpofn); + + FreeLibrary(hComdlg32); + return ret; +} + +/*********************************************************************** + * GetOpenFileNamePreviewA [MSVFW32.@] + */ +BOOL WINAPI GetOpenFileNamePreviewA(LPOPENFILENAMEA lpofn) +{ + FIXME("(%p), semi-stub!\n", lpofn); + + return GetFileNamePreview(lpofn, FALSE, FALSE); +} + +/*********************************************************************** + * GetOpenFileNamePreviewW [MSVFW32.@] + */ +BOOL WINAPI GetOpenFileNamePreviewW(LPOPENFILENAMEW lpofn) +{ + FIXME("(%p), semi-stub!\n", lpofn); + + return GetFileNamePreview(lpofn, FALSE, TRUE); +} + +/*********************************************************************** + * GetSaveFileNamePreviewA [MSVFW32.@] + */ +BOOL WINAPI GetSaveFileNamePreviewA(LPOPENFILENAMEA lpofn) +{ + FIXME("(%p), semi-stub!\n", lpofn); + + return GetFileNamePreview(lpofn, TRUE, FALSE); +} + +/*********************************************************************** + * GetSaveFileNamePreviewW [MSVFW32.@] + */ +BOOL WINAPI GetSaveFileNamePreviewW(LPOPENFILENAMEW lpofn) +{ + FIXME("(%p), semi-stub!\n", lpofn); + + return GetFileNamePreview(lpofn, TRUE, TRUE); +} diff --git a/reactos/lib/msvideo/msvideo_private.h b/reactos/lib/msvideo/msvideo_private.h new file mode 100644 index 00000000000..bf0544f2f5e --- /dev/null +++ b/reactos/lib/msvideo/msvideo_private.h @@ -0,0 +1,65 @@ +/* + * Copyright 1999 Marcus Meissner + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_MSVIDEO_PRIVATE_H +#define __WINE_MSVIDEO_PRIVATE_H + +#define COM_NO_WINDOWS_H +#include +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "commdlg.h" +#include "vfw.h" + +/* HIC struct (same layout as Win95 one) */ +typedef struct tagWINE_HIC { + DWORD magic; /* 00: 'Smag' */ + HANDLE curthread; /* 04: */ + DWORD type; /* 08: */ + DWORD handler; /* 0C: */ + HDRVR hdrv; /* 10: */ + DWORD private; /* 14:(handled by SendDriverMessage)*/ + DRIVERPROC driverproc; /* 18:(handled by SendDriverMessage)*/ + DWORD x1; /* 1c: name? */ + WORD x2; /* 20: */ + DWORD x3; /* 22: */ + /* 26: */ + DWORD driverproc16; /* Wine specific flags */ + HIC hic; + DWORD driverId; + struct tagWINE_HIC* next; +} WINE_HIC; + +HIC MSVIDEO_OpenFunction(DWORD, DWORD, UINT, DRIVERPROC, DWORD); +LRESULT MSVIDEO_SendMessage(WINE_HIC*, UINT, DWORD, DWORD); +WINE_HIC* MSVIDEO_GetHicPtr(HIC); + +extern LRESULT (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM); + +/* handle16 --> handle conversions */ +#define HDRAWDIB_32(h16) ((HDRAWDIB)(ULONG_PTR)(h16)) +#define HIC_32(h16) ((HIC)(ULONG_PTR)(h16)) + +/* handle --> handle16 conversions */ +#define HDRVR_16(h32) (LOWORD(h32)) +#define HDRAWDIB_16(h32) (LOWORD(h32)) +#define HIC_16(h32) (LOWORD(h32)) + +#endif /* __WINE_MSVIDEO_PRIVATE_H */ diff --git a/reactos/lib/msvideo/vfw16.h b/reactos/lib/msvideo/vfw16.h new file mode 100644 index 00000000000..3257ed00039 --- /dev/null +++ b/reactos/lib/msvideo/vfw16.h @@ -0,0 +1,130 @@ +/* + * Copyright 1999 Marcus Meissner + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_VFW16_H +#define __WINE_VFW16_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "vfw.h" +#include "wownt32.h" +#include "wine/windef16.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef HANDLE16 HDRAWDIB16; + +#include "pshpack1.h" + +typedef struct { + DWORD dwSize; + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwVersion; + DWORD dwVersionICM; + /* + * under Win16, normal chars are used + */ + CHAR szName[16]; + CHAR szDescription[128]; + CHAR szDriver[128]; +} ICINFO16; + +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiSrc; + LPVOID lpSrc; + LPBITMAPINFOHEADER lpbiDst; + LPVOID lpDst; + + INT16 xDst; /* destination rectangle */ + INT16 yDst; + INT16 dxDst; + INT16 dyDst; + + INT16 xSrc; /* source rectangle */ + INT16 ySrc; + INT16 dxSrc; + INT16 dySrc; +} ICDECOMPRESSEX16; + +typedef struct { + DWORD dwFlags; + HPALETTE16 hpal; + HWND16 hwnd; + HDC16 hdc; + INT16 xDst; + INT16 yDst; + INT16 dxDst; + INT16 dyDst; + LPBITMAPINFOHEADER lpbi; + INT16 xSrc; + INT16 ySrc; + INT16 dxSrc; + INT16 dySrc; + DWORD dwRate; + DWORD dwScale; +} ICDRAWBEGIN16; + +#include "poppack.h" + +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiIn; + LPBITMAPINFOHEADER lpbiSuggest; + INT16 dxSrc; + INT16 dySrc; + INT16 dxDst; + INT16 dyDst; + HIC16 hicDecompressor; +} ICDRAWSUGGEST16; + +DWORD VFWAPIV ICDraw16(HIC16,DWORD,LPVOID,LPVOID,DWORD,LONG); +DWORD VFWAPIV ICDrawBegin16(HIC16,DWORD,HPALETTE16,HWND16,HDC16,INT16, + INT16,INT16,INT16,LPBITMAPINFOHEADER, + INT16,INT16,INT16,INT16,DWORD,DWORD); +LRESULT WINAPI ICClose16(HIC16); +DWORD VFWAPIV ICCompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, + LPBITMAPINFOHEADER,LPVOID,LPDWORD, + LPDWORD,LONG,DWORD,DWORD, + LPBITMAPINFOHEADER,LPVOID); +DWORD VFWAPIV ICDecompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, + LPBITMAPINFOHEADER,LPVOID); +HIC16 VFWAPI ICGetDisplayFormat16(HIC16,LPBITMAPINFOHEADER, + LPBITMAPINFOHEADER,INT16,INT16, + INT16); +LRESULT VFWAPI ICGetInfo16(HIC16,ICINFO16 *,DWORD); +BOOL16 VFWAPI ICInfo16(DWORD,DWORD,ICINFO16 *); +HIC16 VFWAPI ICLocate16(DWORD,DWORD,LPBITMAPINFOHEADER, + LPBITMAPINFOHEADER,WORD); +LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ); +HIC16 VFWAPI ICOpen16(DWORD,DWORD,UINT16); +HIC16 VFWAPI ICOpenFunction16(DWORD,DWORD,UINT16,FARPROC16); +LRESULT VFWAPI ICSendMessage16(HIC16,UINT16,DWORD,DWORD); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __WINE_VFW16_H */ From c01cec79d95b443ecdc447004402b938b0376cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 10 Jul 2004 21:23:18 +0000 Subject: [PATCH 250/356] Roll back __USE_W32API test, add _tsplitpath definition svn path=/trunk/; revision=10069 --- reactos/include/tchar.h | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/reactos/include/tchar.h b/reactos/include/tchar.h index 0ac89e0cff1..5974117f4e5 100644 --- a/reactos/include/tchar.h +++ b/reactos/include/tchar.h @@ -29,21 +29,15 @@ * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * $Revision: 1.11 $ + * $Revision: 1.12 $ * $Author: gvg $ - * $Date: 2004/07/07 22:29:37 $ + * $Date: 2004/07/10 21:23:18 $ * */ #ifndef _ROS_TCHAR_H_ #define _ROS_TCHAR_H_ -#ifdef __USE_W32API - -#include_next - -#else /* Not __USE_W32API */ - #include /* @@ -155,6 +149,7 @@ typedef wchar_t TCHAR; #define _totlower towlower #define _ttoi _wtoi #define _tcsftime wcsftime +#define _tsplitpath _wsplitpath #else /* Not _UNICODE */ @@ -260,9 +255,8 @@ typedef char TCHAR; #define _totlower tolower #define _ttoi atoi #define _tcsftime strftime +#define _tsplitpath _splitpath #endif /* Not _UNICODE */ #endif /* Not _TCHAR_H_ */ - -#endif /* Not __USE_W32API */ From 14a26ef7bfda61328fbc68ef1a2041a7289d6faf Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Sat, 10 Jul 2004 21:44:14 +0000 Subject: [PATCH 251/356] added expand.exe and msvfw32.dll to the build. svn path=/trunk/; revision=10070 --- reactos/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/Makefile b/reactos/Makefile index 74d806db17a..37477547b37 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.234 2004/07/09 20:18:48 weiden Exp $ +# $Id: Makefile,v 1.235 2004/07/10 21:44:14 sedwards Exp $ # # Global makefile # @@ -45,7 +45,7 @@ DLLS_CPL = cpl # epsapi psapi richedit rpcrt4 secur32 user32 version ws2help ws2_32 wsock32 wshirda mswsock # imagehlp imm32 DLLS = acledit advapi32 cabinet cards comctl32 crtdll comdlg32 d3d8thk expat fmifs freetype gdi32 \ - imm32 iphlpapi kernel32 lzexpand mpr msafd msgina msimg32 msvcrt msvcrt20 mswsock \ + imm32 iphlpapi kernel32 lzexpand mpr msafd msgina msimg32 msvcrt msvcrt20 msvideo mswsock \ netapi32 ntdll ole32 oleaut32 oledlg packet psapi richedit rpcrt4 samlib secur32 \ setupapi shell32 shlwapi snmpapi syssetup twain unicode user32 userenv version wininet \ winmm winspool ws2help ws2_32 wsock32 wshirda imagehlp $(DLLS_KBD) $(DLLS_CPL) @@ -92,7 +92,7 @@ STORAGE_DRIVERS = atapi cdrom class2 disk floppy scsiport diskdump # System applications # autochk cmd format services setup usetup welcome winlogon -SYS_APPS = autochk cmd explorer format services setup taskmgr userinit usetup welcome vmwinst winlogon regedit +SYS_APPS = autochk cmd explorer expand format services setup taskmgr userinit usetup welcome vmwinst winlogon regedit # System services # rpcss eventlog From 7933210d3c38797333b003d02518caa796296641 Mon Sep 17 00:00:00 2001 From: Gero Kuehn Date: Sat, 10 Jul 2004 21:58:35 +0000 Subject: [PATCH 252/356] copied HalRequestSoftwareInterrupt from uniproc irql.c to fix SMP builds svn path=/trunk/; revision=10071 --- reactos/hal/halx86/mpsirql.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/reactos/hal/halx86/mpsirql.c b/reactos/hal/halx86/mpsirql.c index 42542359899..7f6b8f7c801 100644 --- a/reactos/hal/halx86/mpsirql.c +++ b/reactos/hal/halx86/mpsirql.c @@ -178,7 +178,6 @@ HalpLowerIrql(KIRQL NewIrql) VOID FASTCALL KfLowerIrql (KIRQL NewIrql) { - KIRQL OldIrql; if (NewIrql > KeGetCurrentIrql ()) { @@ -403,3 +402,22 @@ HalEnableSystemInterrupt (ULONG Vector, return TRUE; } + +VOID FASTCALL +HalRequestSoftwareInterrupt( + IN KIRQL Request) +{ + switch (Request) + { + case APC_LEVEL: + //ApcRequested = TRUE; + break; + + case DISPATCH_LEVEL: + //DpcRequested = TRUE; + break; + + default: + KEBUGCHECK(0); + } +} From 948db6b780beaad2239f7b33f0845121204327af Mon Sep 17 00:00:00 2001 From: Gero Kuehn Date: Sat, 10 Jul 2004 22:06:40 +0000 Subject: [PATCH 253/356] fixed PROPSHEETHEADER nPages calculation svn path=/trunk/; revision=10072 --- reactos/lib/cpl/access/access.c | 4 ++-- reactos/lib/cpl/appwiz/appwiz.c | 4 ++-- reactos/lib/cpl/cplsample/cplsample.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/lib/cpl/access/access.c b/reactos/lib/cpl/access/access.c index 69de779a790..2dc5d0c91c3 100644 --- a/reactos/lib/cpl/access/access.c +++ b/reactos/lib/cpl/access/access.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: access.c,v 1.1 2004/06/30 12:16:27 ekohl Exp $ +/* $Id: access.c,v 1.2 2004/07/10 22:06:39 kuehng Exp $ * * PROJECT: ReactOS System Control Panel * FILE: lib/cpl/system/sysdm.c @@ -111,7 +111,7 @@ SystemApplet(VOID) psh.hInstance = hApplet; psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLACCESS)); psh.pszCaption = Caption; - psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); psh.nStartPage = 0; psh.ppsp = psp; psh.pfnCallback = PropSheetProc; diff --git a/reactos/lib/cpl/appwiz/appwiz.c b/reactos/lib/cpl/appwiz/appwiz.c index c33f6c35a3b..6cf3f8aa04c 100644 --- a/reactos/lib/cpl/appwiz/appwiz.c +++ b/reactos/lib/cpl/appwiz/appwiz.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: appwiz.c,v 1.2 2004/06/30 12:11:11 ekohl Exp $ +/* $Id: appwiz.c,v 1.3 2004/07/10 22:06:39 kuehng Exp $ * * PROJECT: ReactOS Software Control Panel * FILE: lib/cpl/system/appwiz.c @@ -226,7 +226,7 @@ SystemApplet(VOID) psh.hInstance = hApplet; psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM)); psh.pszCaption = Caption; - psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); psh.nStartPage = 0; psh.ppsp = psp; psh.pfnCallback = NULL; diff --git a/reactos/lib/cpl/cplsample/cplsample.c b/reactos/lib/cpl/cplsample/cplsample.c index 19ad938163f..1bcf34d6c23 100644 --- a/reactos/lib/cpl/cplsample/cplsample.c +++ b/reactos/lib/cpl/cplsample/cplsample.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cplsample.c,v 1.2 2004/03/08 14:20:14 weiden Exp $ +/* $Id: cplsample.c,v 1.3 2004/07/10 22:06:40 kuehng Exp $ * * PROJECT: ReactOS Sample Control Panel * FILE: lib/cpl/cplsample/cplsample.c @@ -153,7 +153,7 @@ Applet1(VOID) psh.hInstance = hApplet; psh.u1.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON_1)); psh.pszCaption = Caption; - psh.nPages = sizeof(psp) / sizeof(PROPSHEETHEADER); + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); psh.u2.nStartPage = 0; psh.u3.ppsp = psp; psh.pfnCallback = PropSheetProc; From b563ceb9af9d81bed5bc497a694663e99b65ff8a Mon Sep 17 00:00:00 2001 From: Gero Kuehn Date: Sat, 10 Jul 2004 22:27:18 +0000 Subject: [PATCH 254/356] added SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall svn path=/trunk/; revision=10073 --- reactos/bootdata/hivesft.inf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 3814479b776..16bda7e32cd 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -19,11 +19,16 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Common Templates",0x00020000,"%ALLUSERSPROFILE%\Templates" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Personal",0x00020000,"%ALLUSERSPROFILE%\My Documents" +; Uninstall Application list +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",,0x00000010 + + ; Version Information HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentVersion",0x00020000,"4.0" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CSDVersion",0x00020000,"Service Pack 6" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00020000,"1381" + ; Image File Execution Options (NtGlobalFlag with FLG_SHOW_LDR_SNAPS set for loadlib.exe) HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00000000,"0x00000002" ;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00000000,"0x00000002" From 13eda5be1fbbaf66685ee11e634bac702c917f54 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 10 Jul 2004 23:23:06 +0000 Subject: [PATCH 255/356] added some missing definitions svn path=/trunk/; revision=10074 --- reactos/include/accctrl.h | 33 ++++++++++++++++++ reactos/w32api/include/accctrl.h | 60 ++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/reactos/include/accctrl.h b/reactos/include/accctrl.h index 2ffe9374e54..ac22ff7073e 100644 --- a/reactos/include/accctrl.h +++ b/reactos/include/accctrl.h @@ -44,6 +44,39 @@ typedef enum _SE_OBJECT_TYPE SE_REGISTRY_WOW64_32KEY } SE_OBJECT_TYPE; +typedef struct _SI_OBJECT_INFO +{ + DWORD dwFlags; + HINSTANCE hInstance; + LPWSTR pszServerName; + LPWSTR pszObjectName; + LPWSTR pszPageTitle; + GUID guidObjectType; +} SI_OBJECT_INFO, *PSI_OBJECT_INFO; + +typedef struct _SI_ACCESS +{ + const GUID *pguid; + ACCESS_MASK mask; + LPCWSTR pszName; + DWORD dwFlags; +} SI_ACCESS, *PSI_ACCESS; + +typedef struct _SI_INHERIT_TYPE +{ + const GUID *pguid; + ULONG dwFlags; + LPCWSTR pszName; +} SI_INHERIT_TYPE, *PSI_INHERIT_TYPE; + +typedef enum _SI_PAGE_TYPE +{ + SI_PAGE_PERM = 0, + SI_PAGE_ADVPERM, + SI_PAGE_AUDIT, + SI_PAGE_OWNER +} SI_PAGE_TYPE; + typedef enum _TRUSTEE_TYPE { TRUSTEE_IS_UNKNOWN, diff --git a/reactos/w32api/include/accctrl.h b/reactos/w32api/include/accctrl.h index 6f969042f3e..4bca4432334 100644 --- a/reactos/w32api/include/accctrl.h +++ b/reactos/w32api/include/accctrl.h @@ -102,6 +102,36 @@ extern "C" { #define INHERITED_PARENT 0x10000000 #define INHERITED_GRANDPARENT 0x20000000 +#define SI_EDIT_PERMS 0x00000000 +#define SI_EDIT_OWNER 0x00000001 +#define SI_EDIT_AUDITS 0x00000002 +#define SI_CONTAINER 0x00000004 +#define SI_READONLY 0x00000008 +#define SI_ADVANCED 0x00000010 +#define SI_RESET 0x00000020 +#define SI_OWNER_READONLY 0x00000040 +#define SI_EDIT_PROPERTIES 0x00000080 +#define SI_OWNER_RECURSE 0x00000100 +#define SI_NO_ACL_PROTECT 0x00000200 +#define SI_NO_TREE_APPLY 0x00000400 +#define SI_PAGE_TITLE 0x00000800 +#define SI_SERVER_IS_DC 0x00001000 +#define SI_RESET_DACL_TREE 0x00004000 +#define SI_RESET_SACL_TREE 0x00008000 +#define SI_OBJECT_GUID 0x00010000 +#define SI_EDIT_EFFECTIVE 0x00020000 +#define SI_RESET_DACL 0x00040000 +#define SI_RESET_SACL 0x00080000 +#define SI_RESET_OWNER 0x00100000 +#define SI_NO_ADDITIONAL_PERMISSION 0x00200000 +#define SI_MAY_WRITE 0x10000000 +#define SI_EDIT_ALL (SI_EDIT_OWNER |SI_EDIT_PERMS | SI_EDIT_AUDITS) + +#define SI_ACCESS_SPECIFIC 0x00010000 +#define SI_ACCESS_GENERAL 0x00020000 +#define SI_ACCESS_CONTAINER 0x00040000 +#define SI_ACCESS_PROPERTY 0x00080000 + typedef ULONG INHERIT_FLAGS, *PINHERIT_FLAGS; typedef ULONG ACCESS_RIGHTS, *PACCESS_RIGHTS; @@ -287,6 +317,36 @@ typedef struct { } INHERITED_FROMW, *PINHERITED_FROMW; #endif /* (_WIN32_WINNT >= 0x0501) */ +typedef struct _SI_OBJECT_INFO +{ + DWORD dwFlags; + HINSTANCE hInstance; + LPWSTR pszServerName; + LPWSTR pszObjectName; + LPWSTR pszPageTitle; + GUID guidObjectType; +} SI_OBJECT_INFO, *PSI_OBJECT_INFO; +typedef struct _SI_ACCESS +{ + const GUID *pguid; + ACCESS_MASK mask; + LPCWSTR pszName; + DWORD dwFlags; +} SI_ACCESS, *PSI_ACCESS; +typedef struct _SI_INHERIT_TYPE +{ + const GUID *pguid; + ULONG dwFlags; + LPCWSTR pszName; +} SI_INHERIT_TYPE, *PSI_INHERIT_TYPE; +typedef enum _SI_PAGE_TYPE +{ + SI_PAGE_PERM = 0, + SI_PAGE_ADVPERM, + SI_PAGE_AUDIT, + SI_PAGE_OWNER +} SI_PAGE_TYPE; + #ifdef UNICODE #define ACCCTRL_DEFAULT_PROVIDER ACCCTRL_DEFAULT_PROVIDERW typedef TRUSTEE_W TRUSTEE_, *PTRUSTEE_; From ce4aa8ef2e961cf9a6ae33f60749892ab732f65e Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 10 Jul 2004 23:25:17 +0000 Subject: [PATCH 256/356] added a key security editor (not yet working properly) svn path=/trunk/; revision=10075 --- reactos/subsys/system/regedit/En.rc | 25 ++ reactos/subsys/system/regedit/framewnd.c | 10 + reactos/subsys/system/regedit/main.c | 18 ++ reactos/subsys/system/regedit/makefile | 5 +- reactos/subsys/system/regedit/regproc.h | 12 + reactos/subsys/system/regedit/resource.h | 19 ++ reactos/subsys/system/regedit/security.c | 358 +++++++++++++++++++++++ reactos/subsys/system/regedit/security.h | 125 ++++++++ 8 files changed, 571 insertions(+), 1 deletion(-) create mode 100644 reactos/subsys/system/regedit/security.c create mode 100644 reactos/subsys/system/regedit/security.h diff --git a/reactos/subsys/system/regedit/En.rc b/reactos/subsys/system/regedit/En.rc index b3680cf3a2d..dca80da4476 100644 --- a/reactos/subsys/system/regedit/En.rc +++ b/reactos/subsys/system/regedit/En.rc @@ -69,6 +69,8 @@ BEGIN MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE END MENUITEM SEPARATOR + MENUITEM "&Permissions...", ID_EDIT_PERMISSIONS + MENUITEM SEPARATOR MENUITEM "&Delete\tDel", ID_EDIT_DELETE MENUITEM "&Rename", ID_EDIT_RENAME MENUITEM SEPARATOR @@ -289,6 +291,29 @@ BEGIN IDS_FLT_ALLFILES_FLT "*.*" END +STRINGTABLE DISCARDABLE +BEGIN + IDS_ACCESS_FULLCONTROL "Full Control" + IDS_ACCESS_READ "Read" + IDS_ACCESS_QUERYVALUE "Query Value" + IDS_ACCESS_SETVALUE "Set Value" + IDS_ACCESS_CREATESUBKEY "Create Subkey" + IDS_ACCESS_ENUMERATESUBKEYS "Enumerate Subkeys" + IDS_ACCESS_NOTIFY "Notify" + IDS_ACCESS_CREATELINK "Create Link" + IDS_ACCESS_DELETE "Delete" + IDS_ACCESS_WRITEDAC "Write DAC" + IDS_ACCESS_WRITEOWNER "Write Owner" + IDS_ACCESS_READCONTROL "Read Control" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_INHERIT_THISKEYONLY "This key only" + IDS_INHERIT_THISKEYANDSUBKEYS "This key and subkeys" + IDS_INHERIT_SUBKEYSONLY "Subkeys only" +END + /*****************************************************************/ diff --git a/reactos/subsys/system/regedit/framewnd.c b/reactos/subsys/system/regedit/framewnd.c index c29c8a107aa..93c7c02c8dd 100644 --- a/reactos/subsys/system/regedit/framewnd.c +++ b/reactos/subsys/system/regedit/framewnd.c @@ -597,6 +597,16 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_EDIT_COPYKEYNAME: CopyKeyName(hWnd, _T("")); break; + case ID_EDIT_PERMISSIONS: + if(keyPath != NULL && _tcslen(keyPath) > 0) + { + RegKeyEditPermissions(hWnd, hKey, NULL, keyPath); + } + else + { + MessageBeep(MB_ICONASTERISK); + } + break; case ID_REGISTRY_PRINTERSETUP: /*PRINTDLG pd;*/ /*PrintDlg(&pd);*/ diff --git a/reactos/subsys/system/regedit/main.c b/reactos/subsys/system/regedit/main.c index 520dd787060..40c9f2047f6 100644 --- a/reactos/subsys/system/regedit/main.c +++ b/reactos/subsys/system/regedit/main.c @@ -68,6 +68,8 @@ TCHAR szChildClass[MAX_LOADSTRING]; BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { + BOOL AclUiAvailable; + WNDCLASSEX wcFrame = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW/*style*/, @@ -111,6 +113,21 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) /* Initialize the Windows Common Controls DLL */ InitCommonControls(); + + AclUiAvailable = InitializeAclUiDll(); + if(!AclUiAvailable) + { + HMENU hEditMenu; + int mePos; + /* hide the Edit/Permissions... menu entry */ + hEditMenu = GetSubMenu(hMenuFrame, 1); + if(hEditMenu != NULL) + { + RemoveMenu(hEditMenu, ID_EDIT_PERMISSIONS, MF_BYCOMMAND); + /* remove the separator after the menu item */ + RemoveMenu(hEditMenu, 4, MF_BYPOSITION); + } + } nClipboardFormat = RegisterClipboardFormat(strClipboardFormat); /* if (nClipboardFormat == 0) { @@ -145,6 +162,7 @@ void ExitInstance(HINSTANCE hInstance) { UnregisterHexEditorClass(hInstance); DestroyMenu(hMenuFrame); + UnloadAclUiDll(); } BOOL TranslateChildTabMessage(MSG *msg) diff --git a/reactos/subsys/system/regedit/makefile b/reactos/subsys/system/regedit/makefile index f9e0b2ba8bb..901550b8ac5 100644 --- a/reactos/subsys/system/regedit/makefile +++ b/reactos/subsys/system/regedit/makefile @@ -14,7 +14,9 @@ TARGET_NAME = regedit TARGET_CFLAGS = -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -D__USE_W32API -TARGET_GCCLIBS = msvcrt advapi32 kernel32 comctl32 comdlg32 shell32 +TARGET_GCCLIBS = msvcrt advapi32 kernel32 comctl32 comdlg32 shell32 ole32 + +TARGET_SDKLIBS = kernel32.a advapi32.a user32.a gdi32.a wine_uuid.a ole32.a TARGET_OBJECTS = \ about.o \ @@ -26,6 +28,7 @@ TARGET_OBJECTS = \ main.o \ regedit.o \ regproc.o \ + security.o \ treeview.o include $(PATH_TO_TOP)/rules.mak diff --git a/reactos/subsys/system/regedit/regproc.h b/reactos/subsys/system/regedit/regproc.h index cc89aa0c575..72a41b2af26 100644 --- a/reactos/subsys/system/regedit/regproc.h +++ b/reactos/subsys/system/regedit/regproc.h @@ -26,6 +26,8 @@ #define SUCCESS 0 #define KEY_VALUE_ALREADY_SET 2 +extern HINSTANCE hInst; + typedef void (*CommandAPI)(LPSTR lpsLine); void doSetValue(LPSTR lpsLine); @@ -71,3 +73,13 @@ HRESULT setValue(LPSTR val_name, LPSTR val_data); * api queryValue prototypes */ void processQueryValue(LPSTR cmdline); + +/* + * Permission prototypes + */ + +BOOL InitializeAclUiDll(VOID); +VOID UnloadAclUiDll(VOID); +BOOL RegKeyEditPermissions(HWND hWndOwner, HKEY hKey, LPCTSTR lpMachine, LPCTSTR lpKeyName); + +/* EOF */ diff --git a/reactos/subsys/system/regedit/resource.h b/reactos/subsys/system/regedit/resource.h index f3f45b677ee..4de5df11d5b 100644 --- a/reactos/subsys/system/regedit/resource.h +++ b/reactos/subsys/system/regedit/resource.h @@ -127,6 +127,7 @@ #define IDS_ERR_RENVAL_CAPTION 32856 #define IDS_ERR_RENVAL_TOEMPTY 32857 #define ID_SWITCH_PANELS 32871 +#define ID_EDIT_PERMISSIONS 32872 #define IDS_FLT_REGFILES 31001 #define IDS_FLT_REGFILES_FLT 31002 @@ -135,6 +136,24 @@ #define IDS_FLT_ALLFILES 31005 #define IDS_FLT_ALLFILES_FLT 31006 +#define IDS_ACCESS_FULLCONTROL 31101 +#define IDS_ACCESS_READ 31102 +#define IDS_ACCESS_QUERYVALUE 31103 +#define IDS_ACCESS_SETVALUE 31104 +#define IDS_ACCESS_CREATESUBKEY 31105 +#define IDS_ACCESS_ENUMERATESUBKEYS 31106 +#define IDS_ACCESS_NOTIFY 31107 +#define IDS_ACCESS_CREATELINK 31108 +#define IDS_ACCESS_DELETE 31109 +#define IDS_ACCESS_WRITEDAC 31110 +#define IDS_ACCESS_WRITEOWNER 31111 +#define IDS_ACCESS_READCONTROL 31112 + +#define IDS_INHERIT_THISKEYONLY 31121 +#define IDS_INHERIT_THISKEYANDSUBKEYS 31122 +#define IDS_INHERIT_SUBKEYSONLY 31123 + + #define IDD_EDIT_STRING 2000 #define IDC_VALUE_NAME 2001 #define IDC_VALUE_DATA 2002 diff --git a/reactos/subsys/system/regedit/security.c b/reactos/subsys/system/regedit/security.c new file mode 100644 index 00000000000..216f389f744 --- /dev/null +++ b/reactos/subsys/system/regedit/security.c @@ -0,0 +1,358 @@ +/* + * Regedit ACL Editor for Registry Keys + * + * Copyright (C) 2004 Thomas Weidenmueller + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */ +#define INITGUID +#include +#include +#include +#include +#include +#include +#include +#include +#include "security.h" +#include "regproc.h" +#include "resource.h" + +/****************************************************************************** + Implementation of the CRegKeySecurity interface + ******************************************************************************/ + +SI_ACCESS RegAccess[] = { + {&GUID_NULL, KEY_ALL_ACCESS, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_FULLCONTROL), SI_ACCESS_GENERAL | SI_ACCESS_SPECIFIC}, + {&GUID_NULL, KEY_READ, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_READ), SI_ACCESS_GENERAL}, + {&GUID_NULL, KEY_QUERY_VALUE, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_QUERYVALUE), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, KEY_SET_VALUE, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_SETVALUE), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, KEY_CREATE_SUB_KEY, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_CREATESUBKEY), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, KEY_ENUMERATE_SUB_KEYS, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_ENUMERATESUBKEYS), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, KEY_NOTIFY, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_NOTIFY), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, KEY_CREATE_LINK, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_CREATELINK), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, DELETE, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_DELETE), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, WRITE_DAC, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_WRITEDAC), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, WRITE_OWNER, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_WRITEOWNER), SI_ACCESS_SPECIFIC}, + {&GUID_NULL, READ_CONTROL, (LPWSTR)MAKEINTRESOURCE(IDS_ACCESS_READCONTROL), SI_ACCESS_SPECIFIC}, +}; + +DWORD RegDefaultAccess = 1; /* KEY_READ */ + +GENERIC_MAPPING RegAccessMasks = { + KEY_READ, + KEY_WRITE, + KEY_EXECUTE, + KEY_ALL_ACCESS +}; + +SI_INHERIT_TYPE RegInheritTypes[] = { + {&GUID_NULL, 0, (LPWSTR)MAKEINTRESOURCE(IDS_INHERIT_THISKEYONLY)}, + {&GUID_NULL, CONTAINER_INHERIT_ACE, (LPWSTR)MAKEINTRESOURCE(IDS_INHERIT_THISKEYANDSUBKEYS)}, + {&GUID_NULL, INHERIT_ONLY_ACE | CONTAINER_INHERIT_ACE, (LPWSTR)MAKEINTRESOURCE(IDS_INHERIT_SUBKEYSONLY)}, +}; + + +LPREGKEYSECURITY CRegKeySecurity_fnConstructor(HANDLE Handle, SE_OBJECT_TYPE ObjectType, SI_OBJECT_INFO *ObjectInfo, BOOL *Btn) +{ + LPREGKEYSECURITY obj; + + obj = (LPREGKEYSECURITY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(REGKEYSECURITY)); + if(obj != NULL) + { + obj->ref = 1; + obj->lpVtbl = &efvt; + obj->Handle = Handle; + obj->ObjectType = ObjectType; + obj->ObjectInfo = *ObjectInfo; + obj->Btn = Btn; + } + + return obj; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnQueryInterface(LPREGKEYSECURITY this, + REFIID iid, + PVOID *pvObject) +{ + if(IsEqualGUID(iid, &IID_IUnknown) || + IsEqualGUID(iid, &IID_CRegKeySecurity)) + { + *pvObject = this; + return S_OK; + } + + *pvObject = NULL; + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE +CRegKeySecurity_fnAddRef(LPREGKEYSECURITY this) +{ + return (ULONG)InterlockedIncrement(&this->ref); +} + +ULONG STDMETHODCALLTYPE +CRegKeySecurity_fnRelease(LPREGKEYSECURITY this) +{ + ULONG rfc; + + rfc = (ULONG)InterlockedDecrement(&this->ref); + if(rfc == 0) + { + HeapFree(GetProcessHeap(), 0, this); + } + return rfc; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnGetObjectInformation(LPREGKEYSECURITY this, + PSI_OBJECT_INFO pObjectInfo) +{ + *pObjectInfo = this->ObjectInfo; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnGetSecurity(LPREGKEYSECURITY this, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR* ppSecurityDescriptor, + BOOL fDefault) +{ + /* FIXME */ + if(GetSecurityInfo(this->Handle, this->ObjectType, RequestedInformation, 0, 0, + 0, 0, ppSecurityDescriptor) == ERROR_SUCCESS) + { + return S_OK; + } + else + { + return E_ACCESSDENIED; + } +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnSetSecurity(LPREGKEYSECURITY this, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + /* FIXME */ + *this->Btn = TRUE; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnGetAccessRights(LPREGKEYSECURITY this, + const GUID* pguidObjectType, + DWORD dwFlags, + PSI_ACCESS* ppAccess, + ULONG* pcAccesses, + ULONG* piDefaultAccess) +{ + *ppAccess = RegAccess; + *pcAccesses = sizeof(RegAccess) / sizeof(SI_ACCESS); + *piDefaultAccess = RegDefaultAccess; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnMapGeneric(LPREGKEYSECURITY this, + const GUID* pguidObjectType, + UCHAR* pAceFlags, + ACCESS_MASK* pMask) +{ + MapGenericMask(pMask, (PGENERIC_MAPPING)&RegAccessMasks); + *pMask &= ~SYNCHRONIZE; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnGetInheritTypes(LPREGKEYSECURITY this, + PSI_INHERIT_TYPE* ppInheritTypes, + ULONG* pcInheritTypes) +{ + /* FIXME */ + if(this->ObjectInfo.dwFlags & SI_CONTAINER) + { + *ppInheritTypes = RegInheritTypes; + *pcInheritTypes = sizeof(RegInheritTypes) / sizeof(SI_INHERIT_TYPE); + return S_OK; + } + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE +CRegKeySecurity_fnPropertySheetPageCallback(LPREGKEYSECURITY this, + HWND hwnd, + UINT uMsg, + SI_PAGE_TYPE uPage) +{ + /* FIXME */ + return S_OK; +} + + +/******************************************************************************/ + +#define ACLUI_DLL _T("aclui.dll") +#define FN_EDITSECURITY "EditSecurity" /* no unicode, GetProcAddr doesn't accept unicode! */ + +typedef struct _CHANGE_CONTEXT +{ + HKEY hKey; + LPTSTR KeyString; +} CHANGE_CONTEXT, *PCHANGE_CONTEXT; + +typedef BOOL (WINAPI *PEDITSECURITY)(HWND hwndOwner, + LPREGKEYSECURITY psi); + +static PEDITSECURITY pfnEditSecurity; +static HMODULE hAclUiDll; + +BOOL +InitializeAclUiDll(VOID) +{ + if(!(hAclUiDll = LoadLibrary(ACLUI_DLL))) + { + return FALSE; + } + if(!(pfnEditSecurity = (PEDITSECURITY)GetProcAddress(hAclUiDll, FN_EDITSECURITY))) + { + FreeLibrary(hAclUiDll); + hAclUiDll = NULL; + return FALSE; + } + + return TRUE; +} + +VOID +UnloadAclUiDll(VOID) +{ + if(hAclUiDll != NULL) + { + FreeLibrary(hAclUiDll); + } +} + +BOOL +RegKeyEditPermissions(HWND hWndOwner, + HKEY hKey, + LPCTSTR lpMachine, + LPCTSTR lpKeyName) +{ + BOOL Result; + HMODULE hAclEditDll; + LPWSTR Machine, KeyName; + HKEY hInfoKey; + LPREGKEYSECURITY RegKeySecurity; + SI_OBJECT_INFO ObjectInfo; + + if(pfnEditSecurity == NULL) + { + return FALSE; + } + +#ifndef UNICODE + /* aclui.dll only accepts unicode strings, convert them */ + if(lpMachine != NULL) + { + int lnMachine = lstrlen(lpMachine); + if(!(Machine = HeapAlloc(GetProcessHeap(), 0, (lnMachine + 1) * sizeof(WCHAR)))) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + if(lnMachine > 0) + { + MultiByteToWideChar(CP_ACP, 0, lpMachine, -1, Machine, lnMachine + 1); + } + else + *Machine = L'\0'; + } + else + Machine = NULL; + + if(lpKeyName != NULL) + { + int lnKeyName = lstrlen(lpKeyName); + if(!(KeyName = HeapAlloc(GetProcessHeap(), 0, (lnKeyName + 1) * sizeof(WCHAR)))) + { + if(Machine != NULL) + { + HeapFree(GetProcessHeap(), 0, Machine); + } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + if(lnKeyName > 0) + { + MultiByteToWideChar(CP_ACP, 0, lpKeyName, -1, KeyName, lnKeyName + 1); + } + else + *KeyName = L'\0'; + } + else + KeyName = NULL; +#else + Machine = (LPWSTR)lpMachine; + KeyName = (LPWSTR)lpKeyName; +#endif + + /* try to open the key again with more access rights */ + if(RegOpenKeyEx(hKey, NULL, 0, READ_CONTROL, &hInfoKey) != ERROR_SUCCESS) + { + /* FIXME - print error with FormatMessage */ + return FALSE; + } + + ObjectInfo.dwFlags = SI_EDIT_ALL | SI_ADVANCED | SI_CONTAINER | SI_OWNER_RECURSE | SI_EDIT_PERMS; + ObjectInfo.hInstance = hInst; + ObjectInfo.pszServerName = Machine; + ObjectInfo.pszObjectName = KeyName; + ObjectInfo.pszPageTitle = KeyName; + + if(!(RegKeySecurity = CRegKeySecurity_fnConstructor(hInfoKey, SE_REGISTRY_KEY, &ObjectInfo, &Result))) + { + /* FIXME - print error with FormatMessage */ + return FALSE; + } + + /* display the security editor dialog */ + pfnEditSecurity(hWndOwner, RegKeySecurity); + + /* dereference the interface, it should be destroyed here */ + CRegKeySecurity_fnRelease(RegKeySecurity); + + RegCloseKey(hInfoKey); + +#ifndef UNICODE + if(Machine != NULL) + { + HeapFree(GetProcessHeap(), 0, Machine); + } + if(KeyName != NULL) + { + HeapFree(GetProcessHeap(), 0, KeyName); + } +#endif + + return Result; +} + +/* EOF */ diff --git a/reactos/subsys/system/regedit/security.h b/reactos/subsys/system/regedit/security.h new file mode 100644 index 00000000000..a0e9f832001 --- /dev/null +++ b/reactos/subsys/system/regedit/security.h @@ -0,0 +1,125 @@ +#ifndef _REGEXP_SECURITY_H +#define _REGEXP_SECURITY_H + +/* FIXME - remove the definition */ +DWORD STDCALL +GetSecurityInfo(HANDLE handle, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID* ppsidOwner, + PSID* ppsidGroup, + PACL* ppDacl, + PACL* ppSacl, + PSECURITY_DESCRIPTOR* ppSecurityDescriptor); + +DEFINE_GUID(IID_CRegKeySecurity, 0x965fc360, 0x16ff, 0x11d0, 0x0091, 0xcb,0x00,0xaa,0x00,0xbb,0xb7,0x23); + +/****************************************************************************** + CRegKeySecurity + ******************************************************************************/ + +typedef struct CRegKeySecurity *LPREGKEYSECURITY; + +typedef struct ifaceCRegKeySecurityVbtl ifaceCRegKeySecurityVbtl; +struct ifaceCRegKeySecurityVbtl +{ + /* IUnknown */ + HRESULT (STDMETHODCALLTYPE *QueryInterface)(LPREGKEYSECURITY this, + REFIID iid, + PVOID *pvObject); + ULONG (STDMETHODCALLTYPE *AddRef)(LPREGKEYSECURITY this); + ULONG (STDMETHODCALLTYPE *Release)(LPREGKEYSECURITY this); + + /* CRegKeySecurity */ + HRESULT (STDMETHODCALLTYPE *GetObjectInformation)(LPREGKEYSECURITY this, + PSI_OBJECT_INFO pObjectInfo); + HRESULT (STDMETHODCALLTYPE *GetSecurity)(LPREGKEYSECURITY this, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR* ppSecurityDescriptor, + BOOL fDefault); + HRESULT (STDMETHODCALLTYPE *SetSecurity)(LPREGKEYSECURITY this, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor); + HRESULT (STDMETHODCALLTYPE *GetAccessRights)(LPREGKEYSECURITY this, + const GUID* pguidObjectType, + DWORD dwFlags, + PSI_ACCESS* ppAccess, + ULONG* pcAccesses, + ULONG* piDefaultAccess); + HRESULT (STDMETHODCALLTYPE *MapGeneric)(LPREGKEYSECURITY this, + const GUID* pguidObjectType, + UCHAR* pAceFlags, + ACCESS_MASK* pMask); + HRESULT (STDMETHODCALLTYPE *GetInheritTypes)(LPREGKEYSECURITY this, + PSI_INHERIT_TYPE* ppInheritTypes, + ULONG* pcInheritTypes); + HRESULT (STDMETHODCALLTYPE *PropertySheetPageCallback)(LPREGKEYSECURITY this, + HWND hwnd, + UINT uMsg, + SI_PAGE_TYPE uPage); +}; + +typedef struct CRegKeySecurity +{ + /* IUnknown fields */ + ifaceCRegKeySecurityVbtl* lpVtbl; + DWORD ref; + /* CRegKeySecurity fields */ + HANDLE Handle; + SE_OBJECT_TYPE ObjectType; + SI_OBJECT_INFO ObjectInfo; + BOOL *Btn; +} REGKEYSECURITY; + +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnQueryInterface(LPREGKEYSECURITY this, + REFIID iid, + PVOID *pvObject); +ULONG STDMETHODCALLTYPE CRegKeySecurity_fnAddRef(LPREGKEYSECURITY this); +ULONG STDMETHODCALLTYPE CRegKeySecurity_fnRelease(LPREGKEYSECURITY this); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnGetObjectInformation(LPREGKEYSECURITY this, + PSI_OBJECT_INFO pObjectInfo); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnGetSecurity(LPREGKEYSECURITY this, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR* ppSecurityDescriptor, + BOOL fDefault); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnSetSecurity(LPREGKEYSECURITY this, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnGetAccessRights(LPREGKEYSECURITY this, + const GUID* pguidObjectType, + DWORD dwFlags, + PSI_ACCESS* ppAccess, + ULONG* pcAccesses, + ULONG* piDefaultAccess); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnMapGeneric(LPREGKEYSECURITY this, + const GUID* pguidObjectType, + UCHAR* pAceFlags, + ACCESS_MASK* pMask); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnGetInheritTypes(LPREGKEYSECURITY this, + PSI_INHERIT_TYPE* ppInheritTypes, + ULONG* pcInheritTypes); +HRESULT STDMETHODCALLTYPE CRegKeySecurity_fnPropertySheetPageCallback(LPREGKEYSECURITY this, + HWND hwnd, + UINT uMsg, + SI_PAGE_TYPE uPage); + +static ifaceCRegKeySecurityVbtl efvt = +{ + /* IUnknown methods */ + CRegKeySecurity_fnQueryInterface, + CRegKeySecurity_fnAddRef, + CRegKeySecurity_fnRelease, + + /* CRegKeySecurity methods */ + CRegKeySecurity_fnGetObjectInformation, + CRegKeySecurity_fnGetSecurity, + CRegKeySecurity_fnSetSecurity, + CRegKeySecurity_fnGetAccessRights, + CRegKeySecurity_fnMapGeneric, + CRegKeySecurity_fnGetInheritTypes, + CRegKeySecurity_fnPropertySheetPageCallback +}; + +#endif /* _REGEXP_SECURITY_H */ + +/* EOF */ From 85cec6dde56b8b5f03a4167b41b0ec2658edec74 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 11 Jul 2004 02:10:48 +0000 Subject: [PATCH 257/356] - Fixed locking in NtGdiGetCharWidth32. This caused problems with AbiWord reported by Jason Filby. svn path=/trunk/; revision=10076 --- reactos/subsys/win32k/objects/text.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 03291a23cf8..41637e9e6e2 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.103 2004/07/09 20:28:20 navaraf Exp $ */ +/* $Id: text.c,v 1.104 2004/07/11 02:10:48 navaraf Exp $ */ #include #include @@ -2016,10 +2016,17 @@ NtGdiGetCharWidth32(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } - TextObj = TEXTOBJ_LockText(hFont); hFont = dc->w.hFont; + TextObj = TEXTOBJ_LockText(hFont); DC_UnlockDc(hDC); + if (TextObj == NULL) + { + ExFreePool(SafeBuffer); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + if (!NT_SUCCESS(GetFontObjectsFromTextObj(TextObj, NULL, NULL, &FontGDI))) { ExFreePool(SafeBuffer); From f85cea6c2c58cf49cb4fd18bedec1b19e8a599f9 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 11 Jul 2004 13:31:28 +0000 Subject: [PATCH 258/356] register the winlogon application directly after startup svn path=/trunk/; revision=10078 --- reactos/subsys/system/winlogon/winlogon.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 9a3b4f4f891..5ad3267aa3c 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.32 2004/07/08 14:41:38 ekohl Exp $ +/* $Id: winlogon.c,v 1.33 2004/07/11 13:31:28 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -546,6 +546,14 @@ WinMain(HINSTANCE hInstance, hAppInstance = hInstance; + if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE)) + { + DbgPrint("WL: Could not register logon process\n"); + NtShutdownSystem(ShutdownNoReboot); + ExitProcess(0); + return 0; + } + #if START_LSASS if (StartProcess(L"StartLsass")) { @@ -565,14 +573,6 @@ WinMain(HINSTANCE hInstance, } WLSession->LogonStatus = LOGON_INITIALIZING; - - if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE)) - { - DbgPrint("WL: Could not register logon process\n"); - NtShutdownSystem(ShutdownNoReboot); - ExitProcess(0); - return 0; - } if(!WlxCreateWindowStationAndDesktops(WLSession)) { From 8d58125bdcae19bd5d3861fe296d4997a960ba0b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 11 Jul 2004 13:33:40 +0000 Subject: [PATCH 259/356] Fix typo in SetSecurityDescriptorOwner(). svn path=/trunk/; revision=10079 --- reactos/lib/advapi32/sec/sec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/advapi32/sec/sec.c b/reactos/lib/advapi32/sec/sec.c index 77d3b21f0d7..447fde72064 100644 --- a/reactos/lib/advapi32/sec/sec.c +++ b/reactos/lib/advapi32/sec/sec.c @@ -1,4 +1,4 @@ -/* $Id: sec.c,v 1.20 2004/03/25 11:30:07 ekohl Exp $ +/* $Id: sec.c,v 1.21 2004/07/11 13:33:40 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -358,7 +358,7 @@ SetSecurityDescriptorOwner ( { NTSTATUS Status; - Status = RtlSetGroupSecurityDescriptor (pSecurityDescriptor, + Status = RtlSetOwnerSecurityDescriptor (pSecurityDescriptor, pOwner, bOwnerDefaulted); if (!NT_SUCCESS(Status)) From 839cdb0644312945abe59ffe6a3dd00391d75d78 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 11 Jul 2004 16:09:37 +0000 Subject: [PATCH 260/356] Add missing security constants. svn path=/trunk/; revision=10080 --- reactos/include/ddk/setypes.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/include/ddk/setypes.h b/reactos/include/ddk/setypes.h index 087e110dbb6..b6a5e0e2e95 100644 --- a/reactos/include/ddk/setypes.h +++ b/reactos/include/ddk/setypes.h @@ -1,4 +1,4 @@ -/* $Id: setypes.h,v 1.14 2004/07/07 17:20:35 ekohl Exp $ +/* $Id: setypes.h,v 1.15 2004/07/11 16:09:37 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory for details * PROJECT: ReactOS kernel @@ -51,6 +51,7 @@ /* SECURITY_DESCRIPTOR_CONTROL */ #define SECURITY_DESCRIPTOR_REVISION (1) +#define SECURITY_DESCRIPTOR_REVISION1 (1) #define SECURITY_DESCRIPTOR_MIN_LENGTH (20) #define SE_OWNER_DEFAULTED (1) #define SE_GROUP_DEFAULTED (2) @@ -66,6 +67,10 @@ #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L) #define PRIVILEGE_SET_ALL_NECESSARY (0x1) +/* SID */ +#define SID_REVISION (1) +#define SID_MAX_SUB_AUTHORITIES (15) + typedef struct _ACCESS_TOKEN { TOKEN_SOURCE TokenSource; /* 0x00 */ From c8d9ece95d06417d75e4bb947cec53470a53b5e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 11 Jul 2004 16:13:44 +0000 Subject: [PATCH 261/356] Jens Collin Add PATHEXT env var and use it to locate command svn path=/trunk/; revision=10081 --- reactos/bootdata/hivesys.inf | 1 + reactos/subsys/system/cmd/misc.c | 9 +- reactos/subsys/system/cmd/where.c | 288 +++++++++++------------------- 3 files changed, 111 insertions(+), 187 deletions(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 91b22a28602..3864f4ab69e 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -103,6 +103,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","Path",0x000 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP" +HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00020000,".COM;.EXE;.BAT;.CMD" ; Known DLLs HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","DllDirectory",0x00020000,"%SystemRoot%\system32" diff --git a/reactos/subsys/system/cmd/misc.c b/reactos/subsys/system/cmd/misc.c index 4424e20c42f..454435e87d4 100644 --- a/reactos/subsys/system/cmd/misc.c +++ b/reactos/subsys/system/cmd/misc.c @@ -133,7 +133,7 @@ static BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry) return FALSE; } _tcscpy (q, entry); - + oldarg = *arg; *arg = realloc (oldarg, (*ac + 2) * sizeof (LPTSTR)); if (NULL == *arg) @@ -359,7 +359,8 @@ BOOL IsValidPathName (LPCTSTR pszPath) BOOL IsValidFileName (LPCTSTR pszPath) { - return (GetFileAttributes (pszPath) != 0xFFFFFFFF); + DWORD attr = GetFileAttributes (pszPath); + return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) ); } @@ -513,7 +514,7 @@ INT FilePromptYN (LPTSTR szFormat, ...) ConInKey (&ir); cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar); if (_tcschr (szKeys, cKey[0]) == NULL) - cKey = 0; + cKey = 0; } @@ -582,7 +583,7 @@ INT FilePromptYNA (LPTSTR szFormat, ...) ConInKey (&ir); cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar); if (_tcschr (szKeys, cKey[0]) == NULL) - cKey = 0; + cKey = 0; } diff --git a/reactos/subsys/system/cmd/where.c b/reactos/subsys/system/cmd/where.c index 04bcc195445..701b2cce5c7 100644 --- a/reactos/subsys/system/cmd/where.c +++ b/reactos/subsys/system/cmd/where.c @@ -67,6 +67,11 @@ * * 20-Apr-1999 (Eric Kohl ) * Some minor changes and improvements. + * + + * 10-Jul-2004 (Jens Collin ) + * Fixed searxhing for files with specific extensions in PATHEXT order.. + * */ #include "config.h" @@ -82,29 +87,23 @@ #define ENV_BUFFER_SIZE 1024 -static LPTSTR ext[] = {_T(".bat"), _T(".cmd"), _T(".com"), _T(".exe")}; -static INT nExtCount = sizeof(ext) / sizeof(LPTSTR); - - /* searches for file using path info. */ BOOL -SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) +SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension) { TCHAR szPathBuffer[MAX_PATH]; LPTSTR pszBuffer = NULL; DWORD dwBuffer, len; - INT n; - LPTSTR p,s,f; - - - /* initialize full name buffer */ + LPTSTR s,f; + // initialize full name buffer *pFullName = _T('\0'); #ifdef _DEBUG - DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName); + DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension); #endif + // Check if valid directly on specified path if (_tcschr (pFileName, _T('\\')) != NULL) { LPTSTR pFilePart; @@ -120,47 +119,45 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) if(pFilePart == 0) return FALSE; + // Add extension and test file: + if (pExtension) + _tcscat(szPathBuffer, pExtension); - - if (_tcschr (pFilePart, _T('.')) != NULL) - { + if (IsValidFileName (szPathBuffer)) + { #ifdef _DEBUG - DebugPrintf (_T("Filename extension!\n")); + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); #endif - _tcscpy (pFullName, szPathBuffer); - return TRUE; + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + return FALSE; + } - } - else - { + // search in current directory + len = GetCurrentDirectory (MAX_PATH, szPathBuffer); + if (szPathBuffer[len - 1] != _T('\\')) + { + szPathBuffer[len] = _T('\\'); + szPathBuffer[len + 1] = _T('\0'); + } + _tcscat (szPathBuffer, pFileName); + + if (pExtension) + _tcscat (szPathBuffer, pExtension); + + if (IsValidFileName (szPathBuffer)) + { #ifdef _DEBUG - DebugPrintf (_T("No filename extension!\n")); + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); #endif + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } - p = szPathBuffer + _tcslen (szPathBuffer); - for (n = 0; n < nExtCount; n++) - { - _tcscpy (p, ext[n]); -#ifdef _DEBUG - DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); -#endif - - if (IsValidFileName (szPathBuffer)) - { -#ifdef _DEBUG - DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); -#endif - _tcscpy (pFullName, szPathBuffer); - return TRUE; - } - } - return FALSE; - } - } - - /* load environment varable PATH into buffer */ + // load environment varable PATH into buffer pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); if (dwBuffer > ENV_BUFFER_SIZE) @@ -169,16 +166,26 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR)); } - if (!(p = _tcsrchr (pFileName, _T('.'))) || - _tcschr (p + 1, _T('\\'))) - { - /* There is no extension ==> test all the extensions. */ -#ifdef _DEBUG - DebugPrintf (_T("No filename extension!\n")); -#endif - /* search in current directory */ - len = GetCurrentDirectory (MAX_PATH, szPathBuffer); + // search in PATH + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; + } + else + { + _tcscpy (szPathBuffer, s); + s = NULL; + } + + len = _tcslen(szPathBuffer); if (szPathBuffer[len - 1] != _T('\\')) { szPathBuffer[len] = _T('\\'); @@ -186,95 +193,9 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) } _tcscat (szPathBuffer, pFileName); - p = szPathBuffer + _tcslen (szPathBuffer); + if (pExtension) + _tcscat (szPathBuffer, pExtension); - for (n = 0; n < nExtCount; n++) - { - _tcscpy (p, ext[n]); - -#ifdef _DEBUG - DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); -#endif - - if (IsValidFileName (szPathBuffer)) - { -#ifdef _DEBUG - DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); -#endif - free (pszBuffer); - _tcscpy (pFullName, szPathBuffer); - return TRUE; - } - } - - /* search in PATH */ - s = pszBuffer; - while (s && *s) - { - f = _tcschr (s, _T(';')); - - if (f) - { - _tcsncpy (szPathBuffer, s, (size_t)(f-s)); - szPathBuffer[f-s] = _T('\0'); - s = f + 1; - } - else - { - _tcscpy (szPathBuffer, s); - s = NULL; - } - - len = _tcslen(szPathBuffer); - if (szPathBuffer[len - 1] != _T('\\')) - { - szPathBuffer[len] = _T('\\'); - szPathBuffer[len + 1] = _T('\0'); - } - _tcscat (szPathBuffer, pFileName); - - p = szPathBuffer + _tcslen (szPathBuffer); - - for (n = 0; n < nExtCount; n++) - { - _tcscpy (p, ext[n]); - -#ifdef _DEBUG - DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); -#endif - - if (IsValidFileName (szPathBuffer)) - { -#ifdef _DEBUG - DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); -#endif - free (pszBuffer); - _tcscpy (pFullName, szPathBuffer); - return TRUE; - } - } - } - } - else - { - /* There is an extension and it is in the last path component, */ - /* so don't test all the extensions. */ -#ifdef _DEBUG - DebugPrintf (_T("Filename extension!\n")); -#endif - - /* search in current directory */ - len = GetCurrentDirectory (MAX_PATH, szPathBuffer); - if (szPathBuffer[len - 1] != _T('\\')) - { - szPathBuffer[len] = _T('\\'); - szPathBuffer[len + 1] = _T('\0'); - } - _tcscat (szPathBuffer, pFileName); - -#ifdef _DEBUG - DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); -#endif if (IsValidFileName (szPathBuffer)) { #ifdef _DEBUG @@ -284,50 +205,51 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) _tcscpy (pFullName, szPathBuffer); return TRUE; } - - - /* search in PATH */ - s = pszBuffer; - while (s && *s) - { - f = _tcschr (s, _T(';')); - - if (f) - { - _tcsncpy (szPathBuffer, s, (size_t)(f-s)); - szPathBuffer[f-s] = _T('\0'); - s = f + 1; - } - else - { - _tcscpy (szPathBuffer, s); - s = NULL; - } - - len = _tcslen(szPathBuffer); - if (szPathBuffer[len - 1] != _T('\\')) - { - szPathBuffer[len] = _T('\\'); - szPathBuffer[len + 1] = _T('\0'); - } - _tcscat (szPathBuffer, pFileName); - -#ifdef _DEBUG - DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer); -#endif - if (IsValidFileName (szPathBuffer)) - { -#ifdef _DEBUG - DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); -#endif - free (pszBuffer); - _tcscpy (pFullName, szPathBuffer); - return TRUE; - } - } } - free (pszBuffer); - + return FALSE; +} + + +BOOL +SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) +{ + LPTSTR pszBuffer = NULL; + LPTSTR pCh; + DWORD dwBuffer; +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName); +#endif + // check the filename directly + if (SearchForExecutableSingle(pFileName, pFullName, NULL)) + { + return TRUE; + } + + // load environment varable PATHEXT + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer * sizeof (TCHAR)); + } + +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer); +#endif + + pCh = _tcstok(pszBuffer, ";"); + while (pCh) + { + if (SearchForExecutableSingle(pFileName, pFullName, pCh)) + { + free(pszBuffer); + return TRUE; + } + pCh = _tcstok(NULL, ";"); + } + + free(pszBuffer); return FALSE; } From 093e925a663cbb3989f10b0d249dea276390d733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 11 Jul 2004 16:23:12 +0000 Subject: [PATCH 262/356] Use default PATHEXT if none found in environment svn path=/trunk/; revision=10082 --- reactos/subsys/system/cmd/where.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/reactos/subsys/system/cmd/where.c b/reactos/subsys/system/cmd/where.c index 701b2cce5c7..9d6cfd8611b 100644 --- a/reactos/subsys/system/cmd/where.c +++ b/reactos/subsys/system/cmd/where.c @@ -96,14 +96,14 @@ SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtensio LPTSTR pszBuffer = NULL; DWORD dwBuffer, len; LPTSTR s,f; - // initialize full name buffer + /* initialize full name buffer */ *pFullName = _T('\0'); #ifdef _DEBUG DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension); #endif - // Check if valid directly on specified path + /* Check if valid directly on specified path */ if (_tcschr (pFileName, _T('\\')) != NULL) { LPTSTR pFilePart; @@ -119,7 +119,7 @@ SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtensio if(pFilePart == 0) return FALSE; - // Add extension and test file: + /* Add extension and test file: */ if (pExtension) _tcscat(szPathBuffer, pExtension); @@ -134,7 +134,7 @@ SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtensio return FALSE; } - // search in current directory + /* search in current directory */ len = GetCurrentDirectory (MAX_PATH, szPathBuffer); if (szPathBuffer[len - 1] != _T('\\')) { @@ -157,7 +157,7 @@ SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtensio - // load environment varable PATH into buffer + /* load environment varable PATH into buffer */ pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); if (dwBuffer > ENV_BUFFER_SIZE) @@ -167,7 +167,7 @@ SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtensio } - // search in PATH + /* search in PATH */ s = pszBuffer; while (s && *s) { @@ -214,19 +214,20 @@ SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtensio BOOL SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) { + static TCHAR pszDefaultPathExt[] = _T(".COM;.EXE;.BAT;.CMD"); LPTSTR pszBuffer = NULL; LPTSTR pCh; DWORD dwBuffer; #ifdef _DEBUG DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName); #endif - // check the filename directly + /* check the filename directly */ if (SearchForExecutableSingle(pFileName, pFullName, NULL)) { return TRUE; } - // load environment varable PATHEXT + /* load environment varable PATHEXT */ pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE); if (dwBuffer > ENV_BUFFER_SIZE) @@ -234,6 +235,10 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer * sizeof (TCHAR)); } + else if (0 == dwBuffer) + { + _tcscpy(pszBuffer, pszDefaultPathExt); + } #ifdef _DEBUG DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer); From 02c02382be619ce45080cce86e7fdfc43d64f69a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 11 Jul 2004 22:35:07 +0000 Subject: [PATCH 263/356] do not statically link to ole32.dll, import the functions dynamically instead. This is required since winlogon statically links to userenv.dll and then ole32.dll would automatically be loaded which causes ole32.dll to register a window class before the first window station is created (-> the ole32 window class(es) couldn't be registered). Besides it's bad to have winlogon depend on ole32.dll svn path=/trunk/; revision=10083 --- reactos/lib/userenv/desktop.c | 47 ++++++++++++++--------- reactos/lib/userenv/internal.h | 32 +++++++++++++++- reactos/lib/userenv/makefile | 2 +- reactos/lib/userenv/misc.c | 69 +++++++++++++++++++++++++++++++++- 4 files changed, 130 insertions(+), 20 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index 6163db7411e..942b5ac4df6 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.6 2004/05/07 11:18:53 ekohl Exp $ +/* $Id: desktop.c,v 1.7 2004/07/11 22:35:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -150,6 +150,7 @@ AddDesktopItemW (BOOL bCommonDesktop, WORD wHotKey, INT iShowCmd) { + DYN_FUNCS Ole32; WCHAR szLinkPath[MAX_PATH]; WCHAR szArguments[MAX_PATH]; WCHAR szCommand[MAX_PATH]; @@ -216,16 +217,20 @@ AddDesktopItemW (BOOL bCommonDesktop, DPRINT ("szCommand: '%S'\n", szCommand); DPRINT ("szArguments: '%S'\n", szArguments); - CoInitialize(NULL); + /* dynamically load ole32.dll */ + LoadDynamicImports(&DynOle32, &Ole32); - hr = CoCreateInstance(&CLSID_ShellLink, - NULL, - CLSCTX_INPROC_SERVER, - &IID_IShellLinkW, - (LPVOID*)&psl); + Ole32.fn.CoInitialize(NULL); + + hr = Ole32.fn.CoCreateInstance(&CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IShellLinkW, + (LPVOID*)&psl); if (!SUCCEEDED(hr)) { - CoUninitialize(); + Ole32.fn.CoUninitialize(); + UnloadDynamicImports(&Ole32); return FALSE; } @@ -275,7 +280,9 @@ AddDesktopItemW (BOOL bCommonDesktop, psl->lpVtbl->Release(psl); - CoUninitialize(); + Ole32.fn.CoUninitialize(); + + UnloadDynamicImports(&Ole32); DPRINT ("AddDesktopItemW() done\n"); @@ -428,6 +435,7 @@ AddItemW (LPCWSTR lpGroupName, WORD wHotKey, INT iShowCmd) { + DYN_FUNCS Ole32; WCHAR szLinkPath[MAX_PATH]; WCHAR szArguments[MAX_PATH]; WCHAR szCommand[MAX_PATH]; @@ -499,16 +507,20 @@ AddItemW (LPCWSTR lpGroupName, DPRINT ("szCommand: '%S'\n", szCommand); DPRINT ("szArguments: '%S'\n", szArguments); - CoInitialize(NULL); + /* dynamically load ole32.dll */ + LoadDynamicImports(&DynOle32, &Ole32); - hr = CoCreateInstance(&CLSID_ShellLink, - NULL, - CLSCTX_INPROC_SERVER, - &IID_IShellLinkW, - (LPVOID*)&psl); + Ole32.fn.CoInitialize(NULL); + + hr = Ole32.fn.CoCreateInstance(&CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IShellLinkW, + (LPVOID*)&psl); if (!SUCCEEDED(hr)) { - CoUninitialize(); + Ole32.fn.CoUninitialize(); + UnloadDynamicImports(&Ole32); return FALSE; } @@ -558,7 +570,8 @@ AddItemW (LPCWSTR lpGroupName, psl->lpVtbl->Release(psl); - CoUninitialize(); + Ole32.fn.CoUninitialize(); + UnloadDynamicImports(&Ole32); DPRINT ("AddItemW() done\n"); diff --git a/reactos/lib/userenv/internal.h b/reactos/lib/userenv/internal.h index 8343e2d4354..fdeecd9924a 100644 --- a/reactos/lib/userenv/internal.h +++ b/reactos/lib/userenv/internal.h @@ -1,4 +1,4 @@ -/* $Id: internal.h,v 1.6 2004/05/07 11:18:53 ekohl Exp $ +/* $Id: internal.h,v 1.7 2004/07/11 22:35:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -37,6 +37,36 @@ BOOL RemoveDirectoryPath (LPCWSTR lpPathName); /* misc.c */ +typedef struct _DYN_FUNCS +{ + HMODULE hModule; + union + { + PVOID foo; + struct + { + HRESULT (STDCALL *CoInitialize)(LPVOID pvReserved); + HRESULT (STDCALL *CoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID * ppv); + HRESULT (STDCALL *CoUninitialize)(VOID); + }; + } fn; +} DYN_FUNCS, *PDYN_FUNCS; + +typedef struct _DYN_MODULE +{ + LPWSTR Library; /* dll file name */ + int nFunctions; /* number of functions in the Functions array */ + LPSTR *Functions; /* function names */ +} DYN_MODULE, *PDYN_MODULE; + +extern DYN_MODULE DynOle32; + +BOOL +LoadDynamicImports(PDYN_MODULE Module, PDYN_FUNCS DynFuncs); + +VOID +UnloadDynamicImports(PDYN_FUNCS DynFuncs); + LPWSTR AppendBackslash (LPWSTR String); diff --git a/reactos/lib/userenv/makefile b/reactos/lib/userenv/makefile index 18c5e800746..ba98f620ce5 100644 --- a/reactos/lib/userenv/makefile +++ b/reactos/lib/userenv/makefile @@ -13,7 +13,7 @@ TARGET_CFLAGS += -DUNICODE -D_UNICODE -Wall -Werror TARGET_LFLAGS = -nostdlib -nostartfiles -TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a ole32.a wine_uuid.a +TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a wine_uuid.a TARGET_OBJECTS = desktop.o directory.o environment.o profile.o misc.o \ registry.o setup.o userenv.o diff --git a/reactos/lib/userenv/misc.c b/reactos/lib/userenv/misc.c index 4548eaa98ff..d57f89b2e98 100644 --- a/reactos/lib/userenv/misc.c +++ b/reactos/lib/userenv/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.2 2004/03/13 20:49:07 ekohl Exp $ +/* $Id: misc.c,v 1.3 2004/07/11 22:35:07 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -91,4 +91,71 @@ GetUserSidFromToken (HANDLE hToken, return TRUE; } +/* Dynamic DLL loading interface **********************************************/ + +/* OLE32.DLL import table */ +LPSTR Ole32Imports[] = +{ + "CoInitialize", + "CoCreateInstance", + "CoUninitialize", +}; + +DYN_MODULE DynOle32 = +{ + L"ole32.dll", + sizeof(Ole32Imports) / sizeof(LPSTR), + Ole32Imports +}; + +/* + Use this function to load functions from other modules. We cannot statically + link to e.g. ole32.dll because those dlls would get loaded on startup with + winlogon and they may try to register classes etc when not even a window station + has been created! +*/ + +BOOL +LoadDynamicImports(PDYN_MODULE Module, PDYN_FUNCS DynFuncs) +{ + int i; + PVOID *fn; + + ZeroMemory(DynFuncs, sizeof(DYN_FUNCS)); + + DynFuncs->hModule = LoadLibraryW(Module->Library); + if(!DynFuncs->hModule) + { + return FALSE; + } + + /* begin with the first function */ + fn = &DynFuncs->fn.foo; /* warning: assignment from incompatible pointer type */ + + /* load the imports */ + for(i = 0; i < Module->nFunctions; i++) + { + *fn = GetProcAddress(DynFuncs->hModule, Module->Functions[i]); + if(*fn == NULL) + { + FreeLibrary(DynFuncs->hModule); + DynFuncs->hModule = (HMODULE)0; + return FALSE; + } + fn++; + } + + return TRUE; +} + +VOID +UnloadDynamicImports(PDYN_FUNCS DynFuncs) +{ + if(DynFuncs->hModule) + { + FreeLibrary(DynFuncs->hModule); + DynFuncs->hModule = (HMODULE)0; + } +} + /* EOF */ From 6535d130b795bc97d4f8f3306d97bf927e2afabc Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sun, 11 Jul 2004 23:08:31 +0000 Subject: [PATCH 264/356] removed wrong comments svn path=/trunk/; revision=10085 --- reactos/lib/userenv/misc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/lib/userenv/misc.c b/reactos/lib/userenv/misc.c index d57f89b2e98..1e1eb99ac24 100644 --- a/reactos/lib/userenv/misc.c +++ b/reactos/lib/userenv/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.3 2004/07/11 22:35:07 weiden Exp $ +/* $Id: misc.c,v 1.4 2004/07/11 23:08:31 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -129,8 +129,7 @@ LoadDynamicImports(PDYN_MODULE Module, PDYN_FUNCS DynFuncs) return FALSE; } - /* begin with the first function */ - fn = &DynFuncs->fn.foo; /* warning: assignment from incompatible pointer type */ + fn = &DynFuncs->fn.foo; /* load the imports */ for(i = 0; i < Module->nFunctions; i++) From ad9cdc4edc68fb1a44c20aab2c991dbddaab43ed Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Jul 2004 10:33:04 +0000 Subject: [PATCH 265/356] simplified dynamic loading of dlls svn path=/trunk/; revision=10086 --- reactos/lib/userenv/desktop.c | 14 +++++++++++--- reactos/lib/userenv/internal.h | 5 ++--- reactos/lib/userenv/misc.c | 23 ++++++++++------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/reactos/lib/userenv/desktop.c b/reactos/lib/userenv/desktop.c index 942b5ac4df6..b7be157e1a8 100644 --- a/reactos/lib/userenv/desktop.c +++ b/reactos/lib/userenv/desktop.c @@ -1,4 +1,4 @@ -/* $Id: desktop.c,v 1.7 2004/07/11 22:35:07 weiden Exp $ +/* $Id: desktop.c,v 1.8 2004/07/12 10:33:04 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -218,7 +218,11 @@ AddDesktopItemW (BOOL bCommonDesktop, DPRINT ("szArguments: '%S'\n", szArguments); /* dynamically load ole32.dll */ - LoadDynamicImports(&DynOle32, &Ole32); + if(!LoadDynamicImports(&DynOle32, &Ole32)) + { + DPRINT1("USERENV: Unable to load OLE32.DLL\n"); + return FALSE; + } Ole32.fn.CoInitialize(NULL); @@ -508,7 +512,11 @@ AddItemW (LPCWSTR lpGroupName, DPRINT ("szArguments: '%S'\n", szArguments); /* dynamically load ole32.dll */ - LoadDynamicImports(&DynOle32, &Ole32); + if(!LoadDynamicImports(&DynOle32, &Ole32)) + { + DPRINT1("USERENV: Unable to load OLE32.DLL\n"); + return FALSE; + } Ole32.fn.CoInitialize(NULL); diff --git a/reactos/lib/userenv/internal.h b/reactos/lib/userenv/internal.h index fdeecd9924a..f540e1922b6 100644 --- a/reactos/lib/userenv/internal.h +++ b/reactos/lib/userenv/internal.h @@ -1,4 +1,4 @@ -/* $Id: internal.h,v 1.7 2004/07/11 22:35:07 weiden Exp $ +/* $Id: internal.h,v 1.8 2004/07/12 10:33:04 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -55,8 +55,7 @@ typedef struct _DYN_FUNCS typedef struct _DYN_MODULE { LPWSTR Library; /* dll file name */ - int nFunctions; /* number of functions in the Functions array */ - LPSTR *Functions; /* function names */ + LPSTR Functions[]; /* function names */ } DYN_MODULE, *PDYN_MODULE; extern DYN_MODULE DynOle32; diff --git a/reactos/lib/userenv/misc.c b/reactos/lib/userenv/misc.c index 1e1eb99ac24..3830baec420 100644 --- a/reactos/lib/userenv/misc.c +++ b/reactos/lib/userenv/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.4 2004/07/11 23:08:31 weiden Exp $ +/* $Id: misc.c,v 1.5 2004/07/12 10:33:04 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -94,18 +94,15 @@ GetUserSidFromToken (HANDLE hToken, /* Dynamic DLL loading interface **********************************************/ /* OLE32.DLL import table */ -LPSTR Ole32Imports[] = -{ - "CoInitialize", - "CoCreateInstance", - "CoUninitialize", -}; - DYN_MODULE DynOle32 = { L"ole32.dll", - sizeof(Ole32Imports) / sizeof(LPSTR), - Ole32Imports + { + "CoInitialize", + "CoCreateInstance", + "CoUninitialize", + NULL + } }; /* @@ -118,7 +115,7 @@ DYN_MODULE DynOle32 = BOOL LoadDynamicImports(PDYN_MODULE Module, PDYN_FUNCS DynFuncs) { - int i; + LPSTR *fname; PVOID *fn; ZeroMemory(DynFuncs, sizeof(DYN_FUNCS)); @@ -132,9 +129,9 @@ LoadDynamicImports(PDYN_MODULE Module, PDYN_FUNCS DynFuncs) fn = &DynFuncs->fn.foo; /* load the imports */ - for(i = 0; i < Module->nFunctions; i++) + for(fname = Module->Functions; *fname != NULL; fname++) { - *fn = GetProcAddress(DynFuncs->hModule, Module->Functions[i]); + *fn = GetProcAddress(DynFuncs->hModule, *fname); if(*fn == NULL) { FreeLibrary(DynFuncs->hModule); From 72b6ef30e795c6d9e9c888458ab92f8fb5a577e9 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 12 Jul 2004 12:05:49 +0000 Subject: [PATCH 266/356] Fix NtAccessCheck() prototype. svn path=/trunk/; revision=10087 --- reactos/include/ntos/zw.h | 15 +++++++++------ reactos/include/wine/winternl.h | 2 +- reactos/lib/advapi32/token/token.c | 16 +++++++++++++--- reactos/ntoskrnl/se/semgr.c | 6 +++--- reactos/w32api/include/ddk/ntapi.h | 2 +- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/reactos/include/ntos/zw.h b/reactos/include/ntos/zw.h index cfb24fa142c..58622d3295f 100755 --- a/reactos/include/ntos/zw.h +++ b/reactos/include/ntos/zw.h @@ -1,5 +1,5 @@ -/* $Id: zw.h,v 1.25 2004/06/13 10:35:51 navaraf Exp $ +/* $Id: zw.h,v 1.26 2004/07/12 12:00:15 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -4544,7 +4544,10 @@ NtQueryOleDirectoryFile ( * ReturnLength = Bytes written * GrantedAccess = * AccessStatus = Indicates if the ClientToken allows the requested access - * REMARKS: The arguments map to the win32 AccessCheck + * REMARKS: The arguments map to the win32 AccessCheck + * Gary Nebbett is wrong: + * The 7th argument is a PACCESS_MASK, not a PULONG. + * The 8th argument is a PNTSTATUS, not a PBOOLEAN. * RETURNS: Status */ @@ -4557,8 +4560,8 @@ NtAccessCheck( IN PGENERIC_MAPPING GenericMapping, OUT PPRIVILEGE_SET PrivilegeSet, OUT PULONG ReturnLength, - OUT PULONG GrantedAccess, - OUT PBOOLEAN AccessStatus + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus ); NTSTATUS @@ -4570,8 +4573,8 @@ ZwAccessCheck( IN PGENERIC_MAPPING GenericMapping, OUT PPRIVILEGE_SET PrivilegeSet, OUT PULONG ReturnLength, - OUT PULONG GrantedAccess, - OUT PBOOLEAN AccessStatus + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus ); NTSTATUS diff --git a/reactos/include/wine/winternl.h b/reactos/include/wine/winternl.h index 7e6e09fc562..d122c540aff 100644 --- a/reactos/include/wine/winternl.h +++ b/reactos/include/wine/winternl.h @@ -966,7 +966,7 @@ void WINAPI LdrInitializeThunk(HANDLE,LPVOID,ULONG,ULONG); NTSTATUS WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*); void WINAPI LdrShutdownProcess(void); void WINAPI LdrShutdownThread(void); -NTSTATUS WINAPI NtAccessCheck(PSECURITY_DESCRIPTOR,HANDLE,ACCESS_MASK,PGENERIC_MAPPING,PPRIVILEGE_SET,PULONG,PULONG,PBOOLEAN); +NTSTATUS WINAPI NtAccessCheck(PSECURITY_DESCRIPTOR,HANDLE,ACCESS_MASK,PGENERIC_MAPPING,PPRIVILEGE_SET,PULONG,PACCESS_MASK,PNTSTATUS); NTSTATUS WINAPI NtAdjustPrivilegesToken(HANDLE,BOOLEAN,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD); NTSTATUS WINAPI NtAllocateVirtualMemory(HANDLE,PVOID*,PVOID,ULONG*,ULONG,ULONG); NTSTATUS WINAPI NtCancelTimer(HANDLE, BOOLEAN*); diff --git a/reactos/lib/advapi32/token/token.c b/reactos/lib/advapi32/token/token.c index 97a8e191d2c..de3c63dd10a 100644 --- a/reactos/lib/advapi32/token/token.c +++ b/reactos/lib/advapi32/token/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.11 2004/07/06 22:07:25 gvg Exp $ +/* $Id: token.c,v 1.12 2004/07/12 12:05:49 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -143,6 +143,7 @@ AccessCheck (PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL AccessStatus) { NTSTATUS Status; + NTSTATUS AccessStat; Status = NtAccessCheck (pSecurityDescriptor, ClientToken, @@ -150,14 +151,23 @@ AccessCheck (PSECURITY_DESCRIPTOR pSecurityDescriptor, GenericMapping, PrivilegeSet, (PULONG)PrivilegeSetLength, - (PULONG)GrantedAccess, - (PBOOLEAN)AccessStatus); + (PACCESS_MASK)GrantedAccess, + &AccessStat); if (!NT_SUCCESS (Status)) { SetLastError (RtlNtStatusToDosError (Status)); return FALSE; } + if (!NT_SUCCESS (AccessStat)) + { + SetLastError (RtlNtStatusToDosError (Status)); + *AccessStatus = FALSE; + return TRUE; + } + + *AccessStatus = TRUE; + return TRUE; } diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index fc08889145b..47f8e98b696 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -1,4 +1,4 @@ -/* $Id: semgr.c,v 1.30 2004/05/20 12:42:11 ekohl Exp $ +/* $Id: semgr.c,v 1.31 2004/07/12 12:04:17 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -208,8 +208,8 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PGENERIC_MAPPING GenericMapping, OUT PPRIVILEGE_SET PrivilegeSet, OUT PULONG ReturnLength, - OUT PULONG GrantedAccess, - OUT PBOOLEAN AccessStatus) + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus) { UNIMPLEMENTED; return(STATUS_NOT_IMPLEMENTED); diff --git a/reactos/w32api/include/ddk/ntapi.h b/reactos/w32api/include/ddk/ntapi.h index eedf2daba30..5ef36597f6a 100644 --- a/reactos/w32api/include/ddk/ntapi.h +++ b/reactos/w32api/include/ddk/ntapi.h @@ -2402,7 +2402,7 @@ ZwAccessCheck( IN PPRIVILEGE_SET PrivilegeSet, IN PULONG PrivilegeSetLength, OUT PACCESS_MASK GrantedAccess, - OUT PBOOLEAN AccessStatus); + OUT PNTSTATUS AccessStatus); NTOSAPI NTSTATUS From 32e7b224daefb64701ddfc052a2513becca5453f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 12 Jul 2004 13:51:29 +0000 Subject: [PATCH 267/356] Define missing PNTSTATUS. svn path=/trunk/; revision=10088 --- reactos/include/wine/winternl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/wine/winternl.h b/reactos/include/wine/winternl.h index d122c540aff..0f5b7aa8371 100644 --- a/reactos/include/wine/winternl.h +++ b/reactos/include/wine/winternl.h @@ -33,7 +33,7 @@ extern "C" { * Fundamental types and data structures */ -typedef LONG NTSTATUS; +typedef LONG NTSTATUS, *PNTSTATUS; typedef CONST char *PCSZ; From ef8c92364bde11a2c3b04b04a5372033ad24a50c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Jul 2004 15:08:43 +0000 Subject: [PATCH 268/356] added stubs for the Hid User Library (hid.dll) svn path=/trunk/; revision=10089 --- reactos/lib/hid/.cvsignore | 8 + reactos/lib/hid/Makefile | 50 +++ reactos/lib/hid/hid.c | 112 +++++ reactos/lib/hid/hid.def | 48 +++ reactos/lib/hid/hid.edf | 48 +++ reactos/lib/hid/hid.rc | 39 ++ reactos/lib/hid/internal.h | 8 + reactos/lib/hid/stubs.c | 655 +++++++++++++++++++++++++++++ reactos/w32api/include/ddk/hidpi.h | 33 +- 9 files changed, 1000 insertions(+), 1 deletion(-) create mode 100644 reactos/lib/hid/.cvsignore create mode 100644 reactos/lib/hid/Makefile create mode 100644 reactos/lib/hid/hid.c create mode 100644 reactos/lib/hid/hid.def create mode 100644 reactos/lib/hid/hid.edf create mode 100644 reactos/lib/hid/hid.rc create mode 100644 reactos/lib/hid/internal.h create mode 100644 reactos/lib/hid/stubs.c diff --git a/reactos/lib/hid/.cvsignore b/reactos/lib/hid/.cvsignore new file mode 100644 index 00000000000..9103a525d39 --- /dev/null +++ b/reactos/lib/hid/.cvsignore @@ -0,0 +1,8 @@ +*.coff +*.dll +*.d +*.a +*.o +*.sym +*.map +*.tmp diff --git a/reactos/lib/hid/Makefile b/reactos/lib/hid/Makefile new file mode 100644 index 00000000000..fa7242cda46 --- /dev/null +++ b/reactos/lib/hid/Makefile @@ -0,0 +1,50 @@ +# $Id: Makefile,v 1.1 2004/07/12 15:08:43 weiden Exp $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = hid + +TARGET_INSTALLDIR = system32 + +TARGET_BASE = $(TARGET_BASE_LIB_ACLEDIT) + +TARGET_CFLAGS = \ + -D_WIN32_IE=0x0600 \ + -D_WIN32_WINNT=0x0501 \ + -I./include \ + -DUNICODE \ + -D_UNICODE \ + -D__REACTOS__ \ + -D__USE_W32API \ + -D_HIDPI_ \ + -D_HIDPI_NO_FUNCTION_MACROS_ \ + -Wall \ + -Werror \ + -fno-builtin + +TARGET_LFLAGS = -nostartfiles -nostdlib + +TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a + +TARGET_GCCLIBS = gcc + +TARGET_PCH = + +TARGET_CLEAN = + +TARGET_OBJECTS = hid.o stubs.o + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +include $(TOOLS_PATH)/depend.mk + +%/TAGS: + etags -o $(@D)/TAGS $(@D)/\*.c + +etags: ./TAGS diff --git a/reactos/lib/hid/hid.c b/reactos/lib/hid/hid.c new file mode 100644 index 00000000000..0ac91303b8c --- /dev/null +++ b/reactos/lib/hid/hid.c @@ -0,0 +1,112 @@ +/* + * ReactOS kernel + * Copyright (C) 2004 ReactOS Team + * + * 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. + */ +/* $Id: hid.c,v 1.1 2004/07/12 15:08:43 weiden Exp $ + * + * PROJECT: ReactOS Hid User Library + * FILE: lib/hid/hid.c + * PURPOSE: ReactOS Hid User Library + * + * UPDATE HISTORY: + * 07/12/2004 Created + */ +#include +#include +#include "internal.h" + +HINSTANCE hDllInstance; + +BOOL STDCALL +DllMain(HINSTANCE hinstDLL, + DWORD dwReason, + LPVOID lpvReserved) +{ + switch(dwReason) + { + case DLL_PROCESS_ATTACH: + hDllInstance = hinstDLL; + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +/* + * HidP_GetButtonCaps EXPORTED + * + * @implemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetButtonCaps(IN HIDP_REPORT_TYPE ReportType, + OUT PHIDP_BUTTON_CAPS ButtonCaps, + IN OUT PULONG ButtonCapsLength, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + return HidP_GetSpecificButtonCaps(ReportType, 0, 0, 0, ButtonCaps, ButtonCapsLength, PreparsedData); +} + + +/* + * HidP_GetValueCaps EXPORTED + * + * @implemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetValueCaps(IN HIDP_REPORT_TYPE ReportType, + OUT PHIDP_VALUE_CAPS ValueCaps, + IN OUT PULONG ValueCapsLength, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + return HidP_GetSpecificValueCaps (ReportType, 0, 0, 0, ValueCaps, ValueCapsLength, PreparsedData); +} + + +/* + * HidD_Hello EXPORTED + * + * Undocumented easter egg function. It fills the buffer with "Hello\nI hate Jello\n" + * and returns number of bytes filled in (lstrlen(Buffer) + 1 == 20) + * + * Bugs: - doesn't check Buffer for NULL + * - always returns 20 even if BufferLength < 20 but doesn't produce a buffer overflow + * + * @implemented + */ +HIDAPI +ULONG DDKAPI +HidD_Hello(OUT PCHAR Buffer, + IN ULONG BufferLength) +{ + const PCHAR const HelloString = "Hello\nI hate Jello\n"; + int StrSize = lstrlenA(HelloString) + sizeof(CHAR); + + memcpy(Buffer, HelloString, min(StrSize, BufferLength)); + return StrSize; +} + +/* EOF */ diff --git a/reactos/lib/hid/hid.def b/reactos/lib/hid/hid.def new file mode 100644 index 00000000000..4b20fa5ef9c --- /dev/null +++ b/reactos/lib/hid/hid.def @@ -0,0 +1,48 @@ +LIBRARY hid.dll + +EXPORTS +HidD_FlushQueue@4 +HidD_FreePreparsedData@4 +HidD_GetAttributes@8 +HidD_GetConfiguration@12 +HidD_GetFeature@12 +HidD_GetHidGuid@4 +HidD_GetIndexedString@16 +HidD_GetInputReport@12 +HidD_GetManufacturerString@12 +HidD_GetMsGenreDescriptor@12 +HidD_GetNumInputBuffers@8 +HidD_GetPhysicalDescriptor@12 +HidD_GetPreparsedData@8 +HidD_GetProductString@12 +HidD_GetSerialNumberString@12 +HidD_Hello@8 +HidD_SetConfiguration@12 +HidD_SetFeature@12 +HidP_GetButtonCaps@16 +HidP_GetCaps@8 +HidP_GetData@24 +HidP_GetExtendedAttributes@20 +HidP_GetLinkCollectionNodes@12 +HidP_GetScaledUsageValue@32 +HidP_GetSpecificButtonCaps@28 +HidP_GetSpecificValueCaps@28 +HidP_GetUsageValue@32 +HidP_GetUsageValueArray@36 +HidP_GetUsages@32 +HidP_GetUsagesEx@28 +HidP_GetValueCaps@16 +HidP_InitializeReportForID@20 +HidP_MaxDataListLength@8 +HidP_MaxUsageListLength@12 +HidP_SetData@24 +HidP_SetScaledUsageValue@32 +HidP_SetUsageValue@32 +HidP_SetUsageValueArray@36 +HidP_SetUsages@32 +HidP_TranslateUsagesToI8042ScanCodes@24 +HidP_UnsetUsages@32 +HidP_UsageListDifference@20 +;HidservInstaller@0 + +; EOF diff --git a/reactos/lib/hid/hid.edf b/reactos/lib/hid/hid.edf new file mode 100644 index 00000000000..0439b56dc2c --- /dev/null +++ b/reactos/lib/hid/hid.edf @@ -0,0 +1,48 @@ +LIBRARY hid.dll + +EXPORTS +HidD_FlushQueue=HidD_FlushQueue@4 +HidD_FreePreparsedData=HidD_FreePreparsedData@4 +HidD_GetAttributes=HidD_GetAttributes@8 +HidD_GetConfiguration=HidD_GetConfiguration@12 +HidD_GetFeature=HidD_GetFeature@12 +HidD_GetHidGuid=HidD_GetHidGuid@4 +HidD_GetIndexedString=HidD_GetIndexedString@16 +HidD_GetInputReport=HidD_GetInputReport@12 +HidD_GetManufacturerString=HidD_GetManufacturerString@12 +HidD_GetMsGenreDescriptor=HidD_GetMsGenreDescriptor@12 +HidD_GetNumInputBuffers=HidD_GetNumInputBuffers@8 +HidD_GetPhysicalDescriptor=HidD_GetPhysicalDescriptor@12 +HidD_GetPreparsedData=HidD_GetPreparsedData@8 +HidD_GetProductString=HidD_GetProductString@12 +HidD_GetSerialNumberString=HidD_GetSerialNumberString@12 +HidD_Hello=HidD_Hello@8 +HidD_SetConfiguration=HidD_SetConfiguration@12 +HidD_SetFeature=HidD_SetFeature@12 +HidP_GetButtonCaps=HidP_GetButtonCaps@16 +HidP_GetCaps=HidP_GetCaps@8 +HidP_GetData=HidP_GetData@24 +HidP_GetExtendedAttributes=HidP_GetExtendedAttributes@20 +HidP_GetLinkCollectionNodes=HidP_GetLinkCollectionNodes@12 +HidP_GetScaledUsageValue=HidP_GetScaledUsageValue@32 +HidP_GetSpecificButtonCaps=HidP_GetSpecificButtonCaps@28 +HidP_GetSpecificValueCaps=HidP_GetSpecificValueCaps@28 +HidP_GetUsageValue=HidP_GetUsageValue@32 +HidP_GetUsageValueArray=HidP_GetUsageValueArray@36 +HidP_GetUsages=HidP_GetUsages@32 +HidP_GetUsagesEx=HidP_GetUsagesEx@28 +HidP_GetValueCaps=HidP_GetValueCaps@16 +HidP_InitializeReportForID=HidP_InitializeReportForID@20 +HidP_MaxDataListLength=HidP_MaxDataListLength@8 +HidP_MaxUsageListLength=HidP_MaxUsageListLength@12 +HidP_SetData=HidP_SetData@24 +HidP_SetScaledUsageValue=HidP_SetScaledUsageValue@32 +HidP_SetUsageValue=HidP_SetUsageValue@32 +HidP_SetUsageValueArray=HidP_SetUsageValueArray@36 +HidP_SetUsages=HidP_SetUsages@32 +HidP_TranslateUsagesToI8042ScanCodes=HidP_TranslateUsagesToI8042ScanCodes@24 +HidP_UnsetUsages=HidP_UnsetUsages@32 +HidP_UsageListDifference=HidP_UsageListDifference@20 +;HidservInstaller=HidservInstaller@0 + +; EOF diff --git a/reactos/lib/hid/hid.rc b/reactos/lib/hid/hid.rc new file mode 100644 index 00000000000..bafd3927031 --- /dev/null +++ b/reactos/lib/hid/hid.rc @@ -0,0 +1,39 @@ +#include +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +VS_VERSION_INFO VERSIONINFO + FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD + PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", RES_STR_COMPANY_NAME + VALUE "FileDescription", "ReactOS Hid User Library\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "hid\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "hid.dll\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + diff --git a/reactos/lib/hid/internal.h b/reactos/lib/hid/internal.h new file mode 100644 index 00000000000..114b97b8bb5 --- /dev/null +++ b/reactos/lib/hid/internal.h @@ -0,0 +1,8 @@ +#ifndef __HIDINTERNAL_H +#define __HIDINTERNAL_H + +extern HINSTANCE hDllInstance; + +#endif /* __HIDINTERNAL_H */ + +/* EOF */ diff --git a/reactos/lib/hid/stubs.c b/reactos/lib/hid/stubs.c new file mode 100644 index 00000000000..25b5f8d915a --- /dev/null +++ b/reactos/lib/hid/stubs.c @@ -0,0 +1,655 @@ +/* $Id: stubs.c,v 1.1 2004/07/12 15:08:43 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Hid User Library + * FILE: lib/hid/stubs.c + * PURPOSE: hid.dll stubs + * NOTES: If you implement a function, remove it from this file + * + * UPDATE HISTORY: + * 07/12/2004 Created + */ +#include +#include +#include "internal.h" + +#define UNIMPLEMENTED \ + DbgPrint("HID: %s at %s:%d is UNIMPLEMENTED!\n",__FUNCTION__,__FILE__,__LINE__) + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_FlushQueue(IN HANDLE HidDeviceObject) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_FreePreparsedData(IN PHIDP_PREPARSED_DATA PreparsedData) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetAttributes(IN HANDLE HidDeviceObject, + OUT PHIDD_ATTRIBUTES Attributes) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetConfiguration(IN HANDLE HidDeviceObject, + OUT PHIDD_CONFIGURATION Configuration, + IN ULONG ConfigurationLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetFeature(IN HANDLE HidDeviceObject, + OUT PVOID ReportBuffer, + IN ULONG ReportBufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +VOID DDKAPI +HidD_GetHidGuid(OUT LPGUID HidGuid) +{ + UNIMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetIndexedString(IN HANDLE HidDeviceObject, + IN ULONG StringIndex, + OUT PVOID Buffer, + IN ULONG BufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetInputReport(IN HANDLE HidDeviceObject, + IN OUT PVOID ReportBuffer, + IN ULONG ReportBufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetManufacturerString(IN HANDLE HidDeviceObject, + OUT PVOID Buffer, + IN ULONG BufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetMsGenreDescriptor(IN HANDLE HidDeviceObject, + OUT PVOID Buffer, + IN ULONG BufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetNumInputBuffers(IN HANDLE HidDeviceObject, + OUT PULONG NumberBuffers) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetPhysicalDescriptor(IN HANDLE HidDeviceObject, + OUT PVOID Buffer, + IN ULONG BufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetPreparsedData(IN HANDLE HidDeviceObject, + OUT PHIDP_PREPARSED_DATA *PreparsedData) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetProductString(IN HANDLE HidDeviceObject, + OUT PVOID Buffer, + IN ULONG BufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_GetSerialNumberString(IN HANDLE HidDeviceObject, + OUT PVOID Buffer, + IN ULONG BufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_SetConfiguration(IN HANDLE HidDeviceObject, + IN PHIDD_CONFIGURATION Configuration, + IN ULONG ConfigurationLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_SetFeature(IN HANDLE HidDeviceObject, + IN PVOID ReportBuffer, + IN ULONG ReportBufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_SetNumInputBuffers(IN HANDLE HidDeviceObject, + OUT ULONG NumberBuffers) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +BOOLEAN DDKAPI +HidD_SetOutputReport(IN HANDLE HidDeviceObject, + IN PVOID ReportBuffer, + IN ULONG ReportBufferLength) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetCaps(IN PHIDP_PREPARSED_DATA PreparsedData, + OUT PHIDP_CAPS Capabilities) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetData(IN HIDP_REPORT_TYPE ReportType, + OUT PHIDP_DATA DataList, + IN OUT PULONG DataLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetExtendedAttributes(IN HIDP_REPORT_TYPE ReportType, + IN USHORT DataIndex, + IN PHIDP_PREPARSED_DATA PreparsedData, + OUT PHIDP_EXTENDED_ATTRIBUTES Attributes, + IN OUT PULONG LengthAttributes) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetLinkCollectionNodes(OUT PHIDP_LINK_COLLECTION_NODE LinkCollectionNodes, + IN OUT PULONG LinkCollectionNodesLength, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetScaledUsageValue(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + IN USAGE Usage, + OUT PLONG UsageValue, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetSpecificButtonCaps(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection, + IN USAGE Usage, + OUT PHIDP_BUTTON_CAPS ButtonCaps, + IN OUT PULONG ButtonCapsLength, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetSpecificValueCaps(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection, + IN USAGE Usage, + OUT PHIDP_VALUE_CAPS ValueCaps, + IN OUT PULONG ValueCapsLength, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetUsageValue(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection, + IN USAGE Usage, + OUT PULONG UsageValue, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetUsageValueArray(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + IN USAGE Usage, + OUT PCHAR UsageValue, + IN USHORT UsageValueByteLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetUsages(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + OUT USAGE *UsageList, + IN OUT ULONG *UsageLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_GetUsagesEx(IN HIDP_REPORT_TYPE ReportType, + IN USHORT LinkCollection, + OUT PUSAGE_AND_PAGE ButtonList, + IN OUT ULONG *UsageLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_InitializeReportForID(IN HIDP_REPORT_TYPE ReportType, + IN UCHAR ReportID, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +ULONG DDKAPI +HidP_MaxDataListLength(IN HIDP_REPORT_TYPE ReportType, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + UNIMPLEMENTED; + return 0; +} + + +/* + * @unimplemented + */ +HIDAPI +ULONG DDKAPI +HidP_MaxUsageListLength(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage OPTIONAL, + IN PHIDP_PREPARSED_DATA PreparsedData) +{ + UNIMPLEMENTED; + return 0; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_SetData(IN HIDP_REPORT_TYPE ReportType, + IN PHIDP_DATA DataList, + IN OUT PULONG DataLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_SetScaledUsageValue(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + IN USAGE Usage, + IN LONG UsageValue, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_SetUsageValue(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection, + IN USAGE Usage, + IN ULONG UsageValue, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_SetUsageValueArray(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + IN USAGE Usage, + IN PCHAR UsageValue, + IN USHORT UsageValueByteLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_SetUsages(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + IN PUSAGE UsageList, + IN OUT PULONG UsageLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_TranslateUsagesToI8042ScanCodes(IN PUSAGE ChangedUsageList, + IN ULONG UsageListLength, + IN HIDP_KEYBOARD_DIRECTION KeyAction, + IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState, + IN PHIDP_INSERT_SCANCODES InsertCodesProcedure, + IN PVOID InsertCodesContext) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_UnsetUsages(IN HIDP_REPORT_TYPE ReportType, + IN USAGE UsagePage, + IN USHORT LinkCollection OPTIONAL, + IN PUSAGE UsageList, + IN OUT PULONG UsageLength, + IN PHIDP_PREPARSED_DATA PreparsedData, + IN OUT PCHAR Report, + IN ULONG ReportLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +HIDAPI +NTSTATUS DDKAPI +HidP_UsageListDifference(IN PUSAGE PreviousUsageList, + IN PUSAGE CurrentUsageList, + OUT PUSAGE BreakUsageList, + OUT PUSAGE MakeUsageList, + IN ULONG UsageListLength) +{ + UNIMPLEMENTED; + return HIDP_STATUS_NOT_IMPLEMENTED; +} + +/* EOF */ diff --git a/reactos/w32api/include/ddk/hidpi.h b/reactos/w32api/include/ddk/hidpi.h index d6021782f20..a9ac5bc9df8 100644 --- a/reactos/w32api/include/ddk/hidpi.h +++ b/reactos/w32api/include/ddk/hidpi.h @@ -84,6 +84,19 @@ typedef struct _USAGE_AND_PAGE { USAGE UsagePage; } USAGE_AND_PAGE, *PUSAGE_AND_PAGE; +typedef struct _HIDD_ATTRIBUTES { + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; + +typedef struct _HIDD_CONFIGURATION { + PVOID cookie; + ULONG size; + ULONG RingBufferSize; +} HIDD_CONFIGURATION, *PHIDD_CONFIGURATION; + HIDAPI NTSTATUS DDKAPI @@ -256,7 +269,7 @@ typedef enum _HIDP_REPORT_TYPE { #define HIDP_STATUS_I8242_TRANS_UNKNOWN HIDP_STATUS_I8042_TRANS_UNKNOWN - +#if !defined(_HIDPI_NO_FUNCTION_MACROS_) /* * NTSTATUS * HidP_GetButtonCaps( @@ -301,6 +314,8 @@ typedef enum _HIDP_REPORT_TYPE { #define HidP_GetButtonsEx(RT, LC, BL, UL, PD, R, RL) \ HidP_GetUsagesEx(RT, LC, BL, UL, PD, R, RL) +#endif /* _HIDPI_NO_FUNCTION_MACROS_ */ + HIDAPI NTSTATUS DDKAPI @@ -426,6 +441,8 @@ HidP_GetUsageValueArray( IN PCHAR Report, IN ULONG ReportLength); +#if !defined(_HIDPI_NO_FUNCTION_MACROS_) + /* * NTSTATUS * HidP_GetValueCaps( @@ -437,6 +454,8 @@ HidP_GetUsageValueArray( #define HidP_GetValueCaps(_Type_, _Caps_, _Len_, _Data_) \ HidP_GetSpecificValueCaps (_Type_, 0, 0, 0, _Caps_, _Len_, _Data_) +#endif /* _HIDPI_NO_FUNCTION_MACROS_ */ + HIDAPI NTSTATUS DDKAPI @@ -447,6 +466,8 @@ HidP_InitializeReportForID( IN OUT PCHAR Report, IN ULONG ReportLength); +#if !defined(_HIDPI_NO_FUNCTION_MACROS_) + /* * BOOLEAN * HidP_IsSameUsageAndPage( @@ -455,6 +476,8 @@ HidP_InitializeReportForID( */ #define HidP_IsSameUsageAndPage(u1, u2) ((* (PULONG) &u1) == (* (PULONG) &u2)) +#endif /* _HIDPI_NO_FUNCTION_MACROS_ */ + HIDAPI ULONG DDKAPI @@ -470,6 +493,8 @@ HidP_MaxUsageListLength( IN USAGE UsagePage OPTIONAL, IN PHIDP_PREPARSED_DATA PreparsedData); +#if !defined(_HIDPI_NO_FUNCTION_MACROS_) + /* * NTSTATUS * HidP_SetButtons( @@ -485,6 +510,8 @@ HidP_MaxUsageListLength( #define HidP_SetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \ HidP_SetUsages(RT, UP, LC, UL1, UL2, PD, R, RL) +#endif /* _HIDPI_NO_FUNCTION_MACROS_ */ + HIDAPI NTSTATUS DDKAPI @@ -549,6 +576,8 @@ HidP_SetUsageValueArray( OUT PCHAR Report, IN ULONG ReportLength); +#if !defined(_HIDPI_NO_FUNCTION_MACROS_) + /* * NTSTATUS * HidP_UnsetButtons( @@ -564,6 +593,8 @@ HidP_SetUsageValueArray( #define HidP_UnsetButtons(RT, UP, LC, UL1, UL2, PD, R, RL) \ HidP_UnsetUsages(RT, UP, LC, UL1, UL2, PD, R, RL) +#endif /* _HIDPI_NO_FUNCTION_MACROS_ */ + HIDAPI NTSTATUS DDKAPI From 32b2a4dc1ad3aef91b46e4a2db687f6379f7f603 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Jul 2004 16:04:37 +0000 Subject: [PATCH 269/356] implementation of HidD_GetHidGuid() svn path=/trunk/; revision=10090 --- reactos/lib/hid/hid.c | 21 +++++++++++++++++++-- reactos/lib/hid/internal.h | 1 + reactos/lib/hid/stubs.c | 13 +------------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/reactos/lib/hid/hid.c b/reactos/lib/hid/hid.c index 0ac91303b8c..4a071eb0489 100644 --- a/reactos/lib/hid/hid.c +++ b/reactos/lib/hid/hid.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: hid.c,v 1.1 2004/07/12 15:08:43 weiden Exp $ +/* $Id: hid.c,v 1.2 2004/07/12 16:04:37 weiden Exp $ * * PROJECT: ReactOS Hid User Library * FILE: lib/hid/hid.c @@ -31,6 +31,9 @@ HINSTANCE hDllInstance; +/* device interface GUID for HIDClass devices */ +const GUID HidClassGuid = {0x4D1E55B2, 0xF16F, 0x11CF, {0x88,0xCB,0x00,0x11,0x11,0x00,0x00,0x30}}; + BOOL STDCALL DllMain(HINSTANCE hinstDLL, DWORD dwReason, @@ -54,6 +57,7 @@ DllMain(HINSTANCE hinstDLL, return TRUE; } + /* * HidP_GetButtonCaps EXPORTED * @@ -70,6 +74,19 @@ HidP_GetButtonCaps(IN HIDP_REPORT_TYPE ReportType, } +/* + * HidD_GetHidGuid EXPORTED + * + * @implemented + */ +HIDAPI +VOID DDKAPI +HidD_GetHidGuid(OUT LPGUID HidGuid) +{ + *HidGuid = HidClassGuid; +} + + /* * HidP_GetValueCaps EXPORTED * @@ -103,7 +120,7 @@ HidD_Hello(OUT PCHAR Buffer, IN ULONG BufferLength) { const PCHAR const HelloString = "Hello\nI hate Jello\n"; - int StrSize = lstrlenA(HelloString) + sizeof(CHAR); + ULONG StrSize = lstrlenA(HelloString) + sizeof(CHAR); memcpy(Buffer, HelloString, min(StrSize, BufferLength)); return StrSize; diff --git a/reactos/lib/hid/internal.h b/reactos/lib/hid/internal.h index 114b97b8bb5..a80c88a1c89 100644 --- a/reactos/lib/hid/internal.h +++ b/reactos/lib/hid/internal.h @@ -2,6 +2,7 @@ #define __HIDINTERNAL_H extern HINSTANCE hDllInstance; +extern const GUID HidClassGuid; #endif /* __HIDINTERNAL_H */ diff --git a/reactos/lib/hid/stubs.c b/reactos/lib/hid/stubs.c index 25b5f8d915a..99fc32e5b4e 100644 --- a/reactos/lib/hid/stubs.c +++ b/reactos/lib/hid/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.1 2004/07/12 15:08:43 weiden Exp $ +/* $Id: stubs.c,v 1.2 2004/07/12 16:04:37 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Hid User Library @@ -82,17 +82,6 @@ HidD_GetFeature(IN HANDLE HidDeviceObject, } -/* - * @unimplemented - */ -HIDAPI -VOID DDKAPI -HidD_GetHidGuid(OUT LPGUID HidGuid) -{ - UNIMPLEMENTED; -} - - /* * @unimplemented */ From 11997022fdd98d02792e531c1b5f4dfc7708e64b Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 12 Jul 2004 16:27:46 +0000 Subject: [PATCH 270/356] forgot to export 2 functions svn path=/trunk/; revision=10091 --- reactos/lib/hid/hid.def | 2 ++ reactos/lib/hid/hid.edf | 2 ++ 2 files changed, 4 insertions(+) diff --git a/reactos/lib/hid/hid.def b/reactos/lib/hid/hid.def index 4b20fa5ef9c..7fe843f0237 100644 --- a/reactos/lib/hid/hid.def +++ b/reactos/lib/hid/hid.def @@ -19,6 +19,8 @@ HidD_GetSerialNumberString@12 HidD_Hello@8 HidD_SetConfiguration@12 HidD_SetFeature@12 +HidD_SetNumInputBuffers@8 +HidD_SetOutputReport@12 HidP_GetButtonCaps@16 HidP_GetCaps@8 HidP_GetData@24 diff --git a/reactos/lib/hid/hid.edf b/reactos/lib/hid/hid.edf index 0439b56dc2c..fd2ac9549ce 100644 --- a/reactos/lib/hid/hid.edf +++ b/reactos/lib/hid/hid.edf @@ -19,6 +19,8 @@ HidD_GetSerialNumberString=HidD_GetSerialNumberString@12 HidD_Hello=HidD_Hello@8 HidD_SetConfiguration=HidD_SetConfiguration@12 HidD_SetFeature=HidD_SetFeature@12 +HidD_SetNumInputBuffers=HidD_SetNumInputBuffers@8 +HidD_SetOutputReport=HidD_SetOutputReport@12 HidP_GetButtonCaps=HidP_GetButtonCaps@16 HidP_GetCaps=HidP_GetCaps@8 HidP_GetData=HidP_GetData@24 From 16a868a4e7407afbc19d47ba2bfc19bc2263bd4c Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 12 Jul 2004 19:39:29 +0000 Subject: [PATCH 271/356] Replace hardcoded values by new constants. svn path=/trunk/; revision=10092 --- reactos/lib/rtl/sid.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/lib/rtl/sid.c b/reactos/lib/rtl/sid.c index 60e742b1c68..77f01a21439 100644 --- a/reactos/lib/rtl/sid.c +++ b/reactos/lib/rtl/sid.c @@ -1,4 +1,4 @@ -/* $Id: sid.c,v 1.3 2004/07/10 13:11:18 ekohl Exp $ +/* $Id: sid.c,v 1.4 2004/07/12 19:39:29 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,8 +24,8 @@ BOOLEAN STDCALL RtlValidSid(IN PSID Sid) { - if (((Sid->Revision & 0xf) != 1) || - (Sid->SubAuthorityCount > 15)) + if ((Sid->Revision != SID_REVISION) || + (Sid->SubAuthorityCount > SID_MAX_SUB_AUTHORITIES)) { return FALSE; } @@ -52,7 +52,7 @@ RtlInitializeSid(IN PSID Sid, IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, IN UCHAR SubAuthorityCount) { - Sid->Revision = 1; + Sid->Revision = SID_REVISION; Sid->SubAuthorityCount = SubAuthorityCount; memcpy(&Sid->IdentifierAuthority, IdentifierAuthority, @@ -215,7 +215,7 @@ RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, if (pSid == NULL) return STATUS_NO_MEMORY; - pSid->Revision = 1; + pSid->Revision = SID_REVISION; pSid->SubAuthorityCount = SubAuthorityCount; memcpy(&pSid->IdentifierAuthority, IdentifierAuthority, From 4ce7742222b1de82f599d9d12ca79051840a013a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 20:09:35 +0000 Subject: [PATCH 272/356] Shutdown step 1: inform winlogon svn path=/trunk/; revision=10094 --- reactos/include/reactos/winlogon.h | 28 ++++++ reactos/lib/user32/misc/exit.c | 56 ++++++++++- reactos/lib/user32/misc/misc.c | 31 +++++- reactos/subsys/csrss/api/user.c | 13 +-- reactos/subsys/csrss/include/api.h | 5 +- reactos/subsys/csrss/init.c | 3 +- reactos/subsys/csrss/makefile | 4 +- reactos/subsys/csrss/win32csr/Makefile | 6 +- reactos/subsys/csrss/win32csr/dllmain.c | 5 +- reactos/subsys/csrss/win32csr/exitros.c | 112 ++++++++++++++++++++++ reactos/subsys/system/winlogon/makefile | 9 +- reactos/subsys/system/winlogon/sas.c | 111 +++++++++++++++++---- reactos/subsys/system/winlogon/setup.c | 8 +- reactos/subsys/system/winlogon/winlogon.c | 27 ++---- reactos/subsys/system/winlogon/winlogon.h | 5 +- reactos/subsys/system/winlogon/wlx.c | 13 ++- reactos/subsys/win32k/ntuser/csr.c | 4 +- reactos/subsys/win32k/ntuser/misc.c | 21 +++- 18 files changed, 385 insertions(+), 76 deletions(-) create mode 100644 reactos/include/reactos/winlogon.h create mode 100644 reactos/subsys/csrss/win32csr/exitros.c diff --git a/reactos/include/reactos/winlogon.h b/reactos/include/reactos/winlogon.h new file mode 100644 index 00000000000..9c385be649e --- /dev/null +++ b/reactos/include/reactos/winlogon.h @@ -0,0 +1,28 @@ +/* $Id: winlogon.h,v 1.1 2004/07/12 20:09:35 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: include/reactos/winlogon.h + * PURPOSE: Interface to winlogon + * PROGRAMMER: David Welch (welch@mcmail.com) + * REVISIONS: + * 1999-11-06 (ea) + * Moved from include/internal in include/reactos + * to be used by buildno. + * 2002-01-17 (ea) + * KERNEL_VERSION removed. Use + * reactos/buildno.h:KERNEL_VERSION_STR instead. + */ + +#ifndef REACTOS_WINLOGON_H_INCLUDED +#define REACTOS_WINLOGON_H_INCLUDED + +#define WINLOGON_DESKTOP L"Winlogon" +#define WINLOGON_SAS_CLASS L"SAS window class" +#define WINLOGON_SAS_TITLE L"SAS" + +#define PM_WINLOGON_EXITWINDOWS WM_APP + +#endif /* REACTOS_WINLOGON_H_INCLUDED */ + +/* EOF */ diff --git a/reactos/lib/user32/misc/exit.c b/reactos/lib/user32/misc/exit.c index aecca3bf529..138d68cae46 100644 --- a/reactos/lib/user32/misc/exit.c +++ b/reactos/lib/user32/misc/exit.c @@ -1,4 +1,4 @@ -/* $Id: exit.c,v 1.4 2004/04/09 20:03:14 navaraf Exp $ +/* $Id: exit.c,v 1.5 2004/07/12 20:09:34 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -13,6 +13,60 @@ #include #include +/* + * Sequence of events: + * + * - App (usually explorer) calls ExitWindowsEx() + * - ExitWindowsEx() sends a message to CSRSS (note: investigation shows it + * doesn't transfer to kernel mode) + * - CSRSS impersonates the caller and sends a message to a hidden WinLogon window + * - WinLogon sends a SAS event to the GINA, asking for permission (e.g. if the + * required rights are granted) to proceed + * - WinLogon enters pending log-out state + * - WinLogon impersonates the interactive user and calls ExitWindowsEx() again, + * passing some special internal flags + * - CSRSS loops over all processes of the interactive user (sorted by their + * SetProcessShutdownParameters() level), sending WM_QUERYENDSESSION and + * WM_ENDSESSION messages to its top-level windows. If the messages aren't + * processed within the timeout period (registry key HKCU\Control Panel\Desktop\HungAppTimeout) + * CSRSS will put up a dialog box asking if the process should be terminated. + * Using the registry key HKCU\Control Panel\Desktop\AutoEndTask you can + * specify that the dialog box shouldn't be shown and CSRSS should just + * terminates the thread. If the the WM_ENDSESSION message is processed + * but the thread doesn't terminate within the timeout specified by + * HKCU\Control Panel\Desktop\WaitToKillAppTimeout CSRSS will terminate + * the thread. When all the top-level windows have been destroyed CSRSS + * will terminate the process. + * If the process is a console process, CSRSS will send a CTRL_LOGOFF_EVENT + * to the console control handler on logoff. No event is sent on shutdown. + * If the handler doesn't respond in time the same activities as for GUI + * apps (i.e. display dialog box etc) take place. This also happens if + * the handler returns TRUE. + * - This ends the processing for the first ExitWindowsEx() call from WinLogon. + * Execution continues in WinLogon, which calls ExitWindowsEx() again to + * terminate COM processes in the interactive user's session. + * - WinLogon stops impersonating the interactive user (whos processes are + * all dead by now). and enters log-out state + * - If the ExitWindowsEx() request was for a logoff, WinLogon sends a SAS + * event (to display the "press ctrl+alt+del") to the GINA. WinLogon then + * waits for the GINA to send a SAS event to login. + * - If the ExitWindowsEx() request was for shutdown/restart, WinLogon calls + * ExitWindowsEx() again in the system process context. + * - CSRSS goes through the motions of sending WM_QUERYENDSESSION/WM_ENDSESSION + * to GUI processes running in the system process context but won't display + * dialog boxes or kill threads/processes. Same for console processes, + * using the CTRL_SHUTDOWN_EVENT. The Service Control Manager is one of + * these console processes and has a special timeout value WaitToKillServiceTimeout. + * - WinLogon calls ADVAPI32.InitiateSystemShutdown() + * - ADVAPI32.InitiateSystemShutdown*() issues a "InitiateSystemShutdown" request + * to the SM (SMSS API # 1) + * - the SM propagates the shutdown request to every environment subsystem it + * started since bootstrap time (still active ones, of course) + * - each environment subsystem, on shutdown request, releases every resource + * it aquired during its life (processes, memory etc), then dies + * - when every environment subsystem has gone to bed, the SM actually initiates + * to shutdown the kernel and executive by calling NtShutdownSystem. + */ /* * @implemented */ diff --git a/reactos/lib/user32/misc/misc.c b/reactos/lib/user32/misc/misc.c index 1ad07afabed..6327c48bc25 100644 --- a/reactos/lib/user32/misc/misc.c +++ b/reactos/lib/user32/misc/misc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: misc.c,v 1.6 2004/07/08 14:35:10 ekohl Exp $ +/* $Id: misc.c,v 1.7 2004/07/12 20:09:34 gvg Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/misc.c @@ -31,6 +31,7 @@ #include #include #include +#include /* FUNCTIONS *****************************************************************/ @@ -76,3 +77,31 @@ RegisterLogonProcess(DWORD dwProcessId, BOOL bRegister) (DWORD)bRegister, TWOPARAM_ROUTINE_REGISTERLOGONPROC); } + +/* + * @implemented + */ +BOOL +STDCALL +SetLogonNotifyWindow (HWND Wnd, HWINSTA WinSta) +{ + /* Maybe we should call NtUserSetLogonNotifyWindow and let that one inform CSRSS??? */ + CSRSS_API_REQUEST Request; + CSRSS_API_REPLY Reply; + NTSTATUS Status; + + Request.Type = CSRSS_SET_LOGON_NOTIFY_WINDOW; + Request.Data.SetLogonNotifyWindowRequest.LogonNotifyWindow = Wnd; + + Status = CsrClientCallServer(&Request, + &Reply, + sizeof(CSRSS_API_REQUEST), + sizeof(CSRSS_API_REPLY)); + if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return(FALSE); + } + + return(TRUE); +} diff --git a/reactos/subsys/csrss/api/user.c b/reactos/subsys/csrss/api/user.c index 9a8b9760b08..5b5969b5c7c 100644 --- a/reactos/subsys/csrss/api/user.c +++ b/reactos/subsys/csrss/api/user.c @@ -1,4 +1,4 @@ -/* $Id: user.c,v 1.3 2004/04/09 20:03:15 navaraf Exp $ +/* $Id: user.c,v 1.4 2004/07/12 20:09:34 gvg Exp $ * * reactos/subsys/csrss/api/user.c * @@ -51,15 +51,4 @@ CSR_API(CsrRegisterServicesProcess) return(Status); } - -CSR_API(CsrExitReactos) -{ - Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); - Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; - - Reply->Status = STATUS_NOT_IMPLEMENTED; - - return(STATUS_NOT_IMPLEMENTED); -} - /* EOF */ diff --git a/reactos/subsys/csrss/include/api.h b/reactos/subsys/csrss/include/api.h index 5aa8f6f3090..aac6096faac 100644 --- a/reactos/subsys/csrss/include/api.h +++ b/reactos/subsys/csrss/include/api.h @@ -1,4 +1,4 @@ -/* $Id: api.h,v 1.5 2004/07/03 17:15:02 hbirr Exp $ +/* $Id: api.h,v 1.6 2004/07/12 20:09:34 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -131,6 +131,9 @@ CSR_API(CsrExitReactos); CSR_API(CsrGetShutdownParameters); CSR_API(CsrSetShutdownParameters); +CSR_API(CsrSetLogonNotifyWindow); +CSR_API(CsrRegisterLogonProcess); + #endif /* ndef API_H_INCLUDED */ /* EOF */ diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index 220e88383b0..ac08b1e4bdf 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.28 2004/07/03 17:15:02 hbirr Exp $ +/* $Id: init.c,v 1.29 2004/07/12 20:09:34 gvg Exp $ * * reactos/subsys/csrss/init.c * @@ -207,7 +207,6 @@ CSRSS_API_DEFINITION NativeDefinitions[] = CSRSS_DEFINE_API(CSRSS_TERMINATE_PROCESS, CsrTerminateProcess), CSRSS_DEFINE_API(CSRSS_CONNECT_PROCESS, CsrConnectProcess), CSRSS_DEFINE_API(CSRSS_REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess), - CSRSS_DEFINE_API(CSRSS_EXIT_REACTOS, CsrExitReactos), CSRSS_DEFINE_API(CSRSS_GET_SHUTDOWN_PARAMETERS, CsrGetShutdownParameters), CSRSS_DEFINE_API(CSRSS_SET_SHUTDOWN_PARAMETERS, CsrSetShutdownParameters), CSRSS_DEFINE_API(CSRSS_GET_INPUT_HANDLE, CsrGetInputHandle), diff --git a/reactos/subsys/csrss/makefile b/reactos/subsys/csrss/makefile index 886a8af589b..351a67b221e 100644 --- a/reactos/subsys/csrss/makefile +++ b/reactos/subsys/csrss/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.29 2004/05/28 21:33:41 gvg Exp $ +# $Id: makefile,v 1.30 2004/07/12 20:09:34 gvg Exp $ PATH_TO_TOP = ../.. @@ -13,7 +13,7 @@ TARGET_SDKLIBS = rosrtl.a ntdll.a TARGET_INSTALLDIR = system32 -TARGET_CFLAGS = -D__NTAPP__ -Wall -Werror -Iinclude +TARGET_CFLAGS = -D__NTAPP__ -D__USE_W32API -Wall -Werror -Iinclude TARGET_LFLAGS = -nostdlib diff --git a/reactos/subsys/csrss/win32csr/Makefile b/reactos/subsys/csrss/win32csr/Makefile index 084a56bcc13..778dd782218 100644 --- a/reactos/subsys/csrss/win32csr/Makefile +++ b/reactos/subsys/csrss/win32csr/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.3 2004/01/11 17:31:15 gvg Exp $ +# $Id: Makefile,v 1.4 2004/07/12 20:09:34 gvg Exp $ PATH_TO_TOP = ../../.. @@ -9,13 +9,13 @@ TARGET_NAME = win32csr TARGET_BASE = 0x5ffb0000 # require os code to explicitly request A/W version of structs/functions -TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror -I../include +TARGET_CFLAGS += -D__USE_W32API -D_DISABLE_TIDENTS -Wall -Werror -I../include TARGET_LFLAGS = -nostartfiles -nostdlib TARGET_SDKLIBS = ntdll.a kernel32.a user32.a gdi32.a -TARGET_OBJECTS = dllmain.o conio.o desktopbg.o guiconsole.o tuiconsole.o +TARGET_OBJECTS = dllmain.o conio.o desktopbg.o exitros.o guiconsole.o tuiconsole.o TARGET_ENTRY = _DllMain@12 diff --git a/reactos/subsys/csrss/win32csr/dllmain.c b/reactos/subsys/csrss/win32csr/dllmain.c index 2de47cf71e8..a084b5b55dd 100644 --- a/reactos/subsys/csrss/win32csr/dllmain.c +++ b/reactos/subsys/csrss/win32csr/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.5 2004/05/28 21:33:41 gvg Exp $ +/* $Id: dllmain.c,v 1.6 2004/07/12 20:09:34 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -55,6 +55,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(CSRSS_READ_CONSOLE_OUTPUT_CHAR, CsrReadConsoleOutputChar), CSRSS_DEFINE_API(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB, CsrReadConsoleOutputAttrib), CSRSS_DEFINE_API(CSRSS_GET_NUM_INPUT_EVENTS, CsrGetNumberOfConsoleInputEvents), + CSRSS_DEFINE_API(CSRSS_EXIT_REACTOS, CsrExitReactos), CSRSS_DEFINE_API(CSRSS_PEEK_CONSOLE_INPUT, CsrPeekConsoleInput), CSRSS_DEFINE_API(CSRSS_READ_CONSOLE_OUTPUT, CsrReadConsoleOutput), CSRSS_DEFINE_API(CSRSS_WRITE_CONSOLE_INPUT, CsrWriteConsoleInput), @@ -62,6 +63,8 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(CSRSS_CREATE_DESKTOP, CsrCreateDesktop), CSRSS_DEFINE_API(CSRSS_SHOW_DESKTOP, CsrShowDesktop), CSRSS_DEFINE_API(CSRSS_HIDE_DESKTOP, CsrHideDesktop), + CSRSS_DEFINE_API(CSRSS_SET_LOGON_NOTIFY_WINDOW, CsrSetLogonNotifyWindow), + CSRSS_DEFINE_API(CSRSS_REGISTER_LOGON_PROCESS, CsrRegisterLogonProcess), { 0, 0, 0, NULL } }; diff --git a/reactos/subsys/csrss/win32csr/exitros.c b/reactos/subsys/csrss/win32csr/exitros.c new file mode 100644 index 00000000000..523ae875d72 --- /dev/null +++ b/reactos/subsys/csrss/win32csr/exitros.c @@ -0,0 +1,112 @@ +/* $Id: exitros.c,v 1.1 2004/07/12 20:09:34 gvg Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS CSRSS subsystem + * FILE: subsys/csrss/win32csr/exitros.c + * PURPOSE: Logout/shutdown + */ + +/* INCLUDES ******************************************************************/ + +#include +#include +#include "api.h" +#include "win32csr.h" + +#define NDEBUG +#include + +static HWND LogonNotifyWindow = NULL; +static DWORD LogonProcess = 0; + +CSR_API(CsrRegisterLogonProcess) +{ + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; + + if (Request->Data.RegisterLogonProcessRequest.Register) + { + if (0 != LogonProcess) + { + Reply->Status = STATUS_LOGON_SESSION_EXISTS; + return Reply->Status; + } + LogonProcess = Request->Data.RegisterLogonProcessRequest.ProcessId; + } + else + { + if ((DWORD) Request->Header.ClientId.UniqueProcess != LogonProcess) + { + DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n", + LogonProcess, Request->Header.ClientId.UniqueProcess); + Reply->Status = STATUS_NOT_LOGON_PROCESS; + return Reply->Status; + } + LogonProcess = 0; + } + + Reply->Status = STATUS_SUCCESS; + + return Reply->Status; +} + +CSR_API(CsrSetLogonNotifyWindow) +{ + DWORD WindowCreator; + + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; + + if (0 == GetWindowThreadProcessId(Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow, + &WindowCreator)) + { + DPRINT1("Can't get window creator\n"); + Reply->Status = STATUS_INVALID_HANDLE; + return Reply->Status; + } + if (WindowCreator != LogonProcess) + { + DPRINT1("Trying to register window not created by winlogon as notify window\n"); + Reply->Status = STATUS_ACCESS_DENIED; + return Reply->Status; + } + + LogonNotifyWindow = Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow; + + Reply->Status = STATUS_SUCCESS; + + return Reply->Status; +} + +CSR_API(CsrExitReactos) +{ + Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY); + Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) - LPC_MESSAGE_BASE_SIZE; + + if (NULL == LogonNotifyWindow) + { + DPRINT1("No LogonNotifyWindow registered\n"); + Reply->Status = STATUS_NOT_FOUND; + return Reply->Status; + } + + /* FIXME Inside 2000 says we should impersonate the caller here */ + Reply->Status = SendMessageW(LogonNotifyWindow, PM_WINLOGON_EXITWINDOWS, + (WPARAM) Request->Header.ClientId.UniqueProcess, + (LPARAM) Request->Data.ExitReactosRequest.Flags); + /* If the message isn't handled, the return value is 0, so 0 doesn't indicate success. + Success is indicated by a 1 return value, if anything besides 0 or 1 it's a + NTSTATUS value */ + if (1 == Reply->Status) + { + Reply->Status = STATUS_SUCCESS; + } + else if (0 == Reply->Status) + { + Reply->Status = STATUS_NOT_IMPLEMENTED; + } + + return Reply->Status; +} + +/* EOF */ diff --git a/reactos/subsys/system/winlogon/makefile b/reactos/subsys/system/winlogon/makefile index 54cc7098998..6470e0be2c9 100644 --- a/reactos/subsys/system/winlogon/makefile +++ b/reactos/subsys/system/winlogon/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.10 2004/03/28 12:21:41 weiden Exp $ +# $Id: makefile,v 1.11 2004/07/12 20:09:35 gvg Exp $ PATH_TO_TOP = ../../.. @@ -14,10 +14,15 @@ TARGET_SDKLIBS = ntdll.a kernel32.a user32.a advapi32.a userenv.a secur32.a TARGET_OBJECTS = setup.o winlogon.o wlx.o sas.o -TARGET_CFLAGS = -Wall -Werror -DUNICODE -D_UNICODE -I./ -I../../../include +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -DUNICODE -D_UNICODE -I./ include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk +# Automatic dependency tracking +DEP_OBJECTS := $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/tools/depend.mk + # EOF diff --git a/reactos/subsys/system/winlogon/sas.c b/reactos/subsys/system/winlogon/sas.c index 739baaf39b1..db26fecf1b9 100644 --- a/reactos/subsys/system/winlogon/sas.c +++ b/reactos/subsys/system/winlogon/sas.c @@ -1,4 +1,4 @@ -/* $Id: sas.c,v 1.1 2004/03/28 12:21:41 weiden Exp $ +/* $Id: sas.c,v 1.2 2004/07/12 20:09:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,15 +16,22 @@ #include #include #include +#include #include "setup.h" #include "winlogon.h" #include "resource.h" -#define SAS_CLASS L"SAS window class" +#define NDEBUG +#include + #define HK_CTRL_ALT_DEL 0 #define HK_CTRL_SHIFT_ESC 1 +#ifdef __USE_W32API +extern BOOL STDCALL SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta); +#endif + void DispatchSAS(PWLSESSION Session, DWORD dwSasType) { @@ -48,7 +55,7 @@ SetupSAS(PWLSESSION Session, HWND hwndSAS) /* Register Ctrl+Alt+Del Hotkey */ if(!RegisterHotKey(hwndSAS, HK_CTRL_ALT_DEL, MOD_CONTROL | MOD_ALT, VK_DELETE)) { - DbgPrint("WL-SAS: Unable to register Ctrl+Alt+Del hotkey!\n"); + DPRINT1("WL-SAS: Unable to register Ctrl+Alt+Del hotkey!\n"); return FALSE; } @@ -56,7 +63,7 @@ SetupSAS(PWLSESSION Session, HWND hwndSAS) Session->TaskManHotkey = RegisterHotKey(hwndSAS, HK_CTRL_SHIFT_ESC, MOD_CONTROL | MOD_SHIFT, VK_ESCAPE); if(!Session->TaskManHotkey) { - DbgPrint("WL-SAS: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n"); + DPRINT1("WL-SAS: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n"); } return TRUE; } @@ -76,6 +83,78 @@ DestroySAS(PWLSESSION Session, HWND hwndSAS) return TRUE; } +#define EWX_ACTION_MASK 0x0b +static LRESULT +HandleExitWindows(DWORD RequestingProcessId, UINT Flags) +{ + UINT Action; + HANDLE Process; + HANDLE Token; + BOOL CheckResult; + PPRIVILEGE_SET PrivSet; + + /* Check parameters */ + Action = Flags & EWX_ACTION_MASK; + if (EWX_LOGOFF != Action && EWX_SHUTDOWN != Action && EWX_REBOOT != Action + && EWX_POWEROFF != Action) + { + DPRINT1("Invalid ExitWindows action 0x%x\n", Action); + return STATUS_INVALID_PARAMETER; + } + + /* Check privilege */ + if (EWX_LOGOFF != Action) + { + Process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, RequestingProcessId); + if (NULL == Process) + { + DPRINT1("OpenProcess failed with error %d\n", GetLastError()); + return STATUS_INVALID_HANDLE; + } + if (! OpenProcessToken(Process, TOKEN_QUERY, &Token)) + { + DPRINT1("OpenProcessToken failed with error %d\n", GetLastError()); + CloseHandle(Process); + return STATUS_INVALID_HANDLE; + } + CloseHandle(Process); + PrivSet = HeapAlloc(GetProcessHeap(), 0, sizeof(PRIVILEGE_SET) + sizeof(LUID_AND_ATTRIBUTES)); + if (NULL == PrivSet) + { + DPRINT1("Failed to allocate mem for privilege set\n"); + CloseHandle(Token); + return STATUS_NO_MEMORY; + } + PrivSet->PrivilegeCount = 1; + PrivSet->Control = PRIVILEGE_SET_ALL_NECESSARY; + if (! LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &PrivSet->Privilege[0].Luid)) + { + DPRINT1("LookupPrivilegeValue failed with error %d\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, PrivSet); + CloseHandle(Token); + return STATUS_UNSUCCESSFUL; + } + if (! PrivilegeCheck(Token, PrivSet, &CheckResult)) + { + DPRINT1("PrivilegeCheck failed with error %d\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, PrivSet); + CloseHandle(Token); + return STATUS_ACCESS_DENIED; + } + HeapFree(GetProcessHeap(), 0, PrivSet); + CloseHandle(Token); + if (! CheckResult) + { + DPRINT1("SE_SHUTDOWN privilege not enabled\n"); + return STATUS_ACCESS_DENIED; + } + } + + /* FIXME actually start logoff/shutdown now */ + + return 1; +} + LRESULT CALLBACK SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -91,10 +170,10 @@ SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(wParam) { case HK_CTRL_ALT_DEL: - DbgPrint("SAS: CTR+ALT+DEL\n"); + DPRINT1("SAS: CTR+ALT+DEL\n"); break; case HK_CTRL_SHIFT_ESC: - DbgPrint("SAS: CTR+SHIFT+ESC\n"); + DPRINT1("SAS: CTR+SHIFT+ESC\n"); break; } return 0; @@ -108,6 +187,10 @@ SASProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } return 0; } + case PM_WINLOGON_EXITWINDOWS: + { + return HandleExitWindows((DWORD) wParam, (UINT) lParam); + } case WM_DESTROY: { DestroySAS(Session, hwnd); @@ -134,33 +217,29 @@ InitializeSAS(PWLSESSION Session) swc.hCursor = NULL; swc.hbrBackground = NULL; swc.lpszMenuName = NULL; - swc.lpszClassName = SAS_CLASS; + swc.lpszClassName = WINLOGON_SAS_CLASS; swc.hIconSm = NULL; RegisterClassEx(&swc); /* create invisible SAS window */ - Session->SASWindow = CreateWindowEx(0, SAS_CLASS, L"SAS", WS_OVERLAPPEDWINDOW, + Session->SASWindow = CreateWindowEx(0, WINLOGON_SAS_CLASS, WINLOGON_SAS_TITLE, WS_POPUP, 0, 0, 0, 0, 0, 0, hAppInstance, NULL); if(!Session->SASWindow) { - DbgPrint("WL: Failed to create SAS window\n"); + DPRINT1("WL: Failed to create SAS window\n"); return FALSE; } /* Save the Session pointer so the window proc can access it */ SetWindowLong(Session->SASWindow, GWL_USERDATA, (LONG)Session); - #if 0 - /* Register SAS window to receive SAS notifications - FIXME - SetLogonNotifyWindow() takes only one parameter, - definition in funcs.h is wrong! */ - if(!SetLogonNotifyWindow(Session->SASWindow)) + /* Register SAS window to receive SAS notifications */ + if(!SetLogonNotifyWindow(Session->SASWindow, Session->InteractiveWindowStation)) { UninitSAS(Session); - DbgPrint("WL: Failed to register SAS window\n"); + DPRINT1("WL: Failed to register SAS window\n"); return FALSE; } - #endif return TRUE; } diff --git a/reactos/subsys/system/winlogon/setup.c b/reactos/subsys/system/winlogon/setup.c index 610f0b9d2b8..70ea348b37c 100644 --- a/reactos/subsys/system/winlogon/setup.c +++ b/reactos/subsys/system/winlogon/setup.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: setup.c,v 1.3 2004/06/04 23:46:02 navaraf Exp $ +/* $Id: setup.c,v 1.4 2004/07/12 20:09:35 gvg Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS winlogon * FILE: subsys/system/winlogon/setup.h @@ -43,7 +43,7 @@ DWORD GetSetupType(VOID) { DWORD dwError; - HANDLE hKey; + HKEY hKey; DWORD dwType; DWORD dwSize; DWORD dwSetupType; @@ -79,7 +79,7 @@ BOOL SetSetupType (DWORD dwSetupType) { DWORD dwError; - HANDLE hKey; + HKEY hKey; dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\Setup", //TEXT("SYSTEM\\Setup"), @@ -116,7 +116,7 @@ RunSetup (VOID) WCHAR CommandLine[MAX_PATH]; BOOLEAN Result; DWORD dwError; - HANDLE hKey; + HKEY hKey; DWORD dwType; DWORD dwSize; DWORD dwExitCode; diff --git a/reactos/subsys/system/winlogon/winlogon.c b/reactos/subsys/system/winlogon/winlogon.c index 5ad3267aa3c..61aae7db220 100644 --- a/reactos/subsys/system/winlogon/winlogon.c +++ b/reactos/subsys/system/winlogon/winlogon.c @@ -1,4 +1,4 @@ -/* $Id: winlogon.c,v 1.33 2004/07/11 13:31:28 weiden Exp $ +/* $Id: winlogon.c,v 1.34 2004/07/12 20:09:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -219,7 +219,7 @@ StartLsass (VOID) static BOOLEAN -OpenRegistryKey (HANDLE *WinLogonKey) +OpenRegistryKey (HKEY *WinLogonKey) { return ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\ReactOS\\Windows NT\\CurrentVersion\\WinLogon", @@ -232,7 +232,7 @@ OpenRegistryKey (HANDLE *WinLogonKey) static BOOLEAN StartProcess(PWCHAR ValueName) { BOOL StartIt; - HANDLE WinLogonKey; + HKEY WinLogonKey; DWORD Type; DWORD Size; DWORD StartValue; @@ -262,7 +262,7 @@ static BOOLEAN StartProcess(PWCHAR ValueName) /* static BOOL RestartShell(void) { - HANDLE WinLogonKey; + HKEY WinLogonKey; DWORD Type, Size, Value; if(OpenRegistryKey(&WinLogonKey)) @@ -338,7 +338,7 @@ HandleHotKey(MSG *Msg) #if SUPPORT_CONSOLESTART static BOOL StartIntoGUI(VOID) { - HANDLE WinLogonKey; + HKEY WinLogonKey; DWORD Type, Size, Value; if(OpenRegistryKey(&WinLogonKey)) @@ -366,7 +366,7 @@ static BOOL StartIntoGUI(VOID) static PWCHAR GetShell (WCHAR *CommandLine) { - HANDLE WinLogonKey; + HKEY WinLogonKey; BOOL GotCommandLine; DWORD Type; DWORD Size; @@ -492,10 +492,6 @@ DoLogonUser (PWCHAR Name, return FALSE; } - /* Process the global hotkeys on #if 0 */ -#if 0 - WaitForSingleObject (ProcessInformation.hProcess, INFINITE); -#else RegisterHotKeys(); while (WaitForSingleObject (ProcessInformation.hProcess, 100) != WAIT_OBJECT_0) @@ -510,7 +506,7 @@ DoLogonUser (PWCHAR Name, } UnregisterHotKeys(); -#endif + CloseHandle (ProcessInformation.hProcess); CloseHandle (ProcessInformation.hThread); @@ -543,7 +539,7 @@ WinMain(HINSTANCE hInstance, ULONG AuthenticationPackage; #endif NTSTATUS Status; - + hAppInstance = hInstance; if(!RegisterLogonProcess(GetCurrentProcessId(), TRUE)) @@ -614,18 +610,13 @@ WinMain(HINSTANCE hInstance, #if SUPPORT_CONSOLESTART StartConsole = !StartIntoGUI(); - if(!StartConsole) - { #endif - if(!InitializeSAS(WLSession)) + if(!InitializeSAS(WLSession)) { DbgPrint("WL: Failed to initialize SAS\n"); ExitProcess(2); return 2; } -#if SUPPORT_CONSOLESTART - } -#endif InitServices(); diff --git a/reactos/subsys/system/winlogon/winlogon.h b/reactos/subsys/system/winlogon/winlogon.h index be205c49a5c..b6aaeebaa0f 100644 --- a/reactos/subsys/system/winlogon/winlogon.h +++ b/reactos/subsys/system/winlogon/winlogon.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: winlogon.h,v 1.3 2004/03/28 12:21:41 weiden Exp $ +/* $Id: winlogon.h,v 1.4 2004/07/12 20:09:35 gvg Exp $ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS winlogon * FILE: subsys/system/winlogon/winlogon.h @@ -110,7 +110,7 @@ typedef struct _MSGINAFUNCTIONS typedef struct _MSGINAINSTANCE { - HANDLE hDllInstance; + HMODULE hDllInstance; MSGINAFUNCTIONS Functions; PVOID Context; DWORD Version; @@ -125,6 +125,7 @@ typedef struct _WLSESSION BOOL TaskManHotkey; HWND SASWindow; HWINSTA InteractiveWindowStation; + LPWSTR InteractiveWindowStationName; HDESK ApplicationDesktop; HDESK WinlogonDesktop; HDESK ScreenSaverDesktop; diff --git a/reactos/subsys/system/winlogon/wlx.c b/reactos/subsys/system/winlogon/wlx.c index 494bb7916d9..1be312b0ca8 100644 --- a/reactos/subsys/system/winlogon/wlx.c +++ b/reactos/subsys/system/winlogon/wlx.c @@ -1,4 +1,4 @@ -/* $Id: wlx.c,v 1.4 2004/03/28 12:21:41 weiden Exp $ +/* $Id: wlx.c,v 1.5 2004/07/12 20:09:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,6 +16,7 @@ #include #include #include +#include #include "setup.h" #include "winlogon.h" @@ -493,7 +494,7 @@ static void GetMsGinaPath(WCHAR *path) { DWORD Status, Type, Size; - HANDLE hKey; + HKEY hKey; Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", @@ -652,7 +653,7 @@ MsGinaInit(void) WLSession->MsGina.Version = GinaDllVersion; WLSession->SuppressStatus = FALSE; - if(!WLSession->MsGina.Functions.WlxInitialize(WLSession->InteractiveWindowStation, + if(!WLSession->MsGina.Functions.WlxInitialize(WLSession->InteractiveWindowStationName, (HANDLE)WLSession, NULL, (PVOID)&FunctionTable, @@ -670,7 +671,9 @@ WlxCreateWindowStationAndDesktops(PWLSESSION Session) /* * Create the interactive window station */ - Session->InteractiveWindowStation = CreateWindowStation(L"WinSta0", 0, GENERIC_ALL, NULL); + Session->InteractiveWindowStationName = L"WinSta0"; + Session->InteractiveWindowStation = CreateWindowStation(Session->InteractiveWindowStationName, + 0, GENERIC_ALL, NULL); if(!Session->InteractiveWindowStation) { DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError()); @@ -696,7 +699,7 @@ WlxCreateWindowStationAndDesktops(PWLSESSION Session) /* * Create the winlogon desktop */ - Session->WinlogonDesktop = CreateDesktop(L"Winlogon", + Session->WinlogonDesktop = CreateDesktop(WINLOGON_DESKTOP, NULL, NULL, 0, /* FIXME: Set some flags */ diff --git a/reactos/subsys/win32k/ntuser/csr.c b/reactos/subsys/win32k/ntuser/csr.c index abf1ee9680a..e42d650ebec 100644 --- a/reactos/subsys/win32k/ntuser/csr.c +++ b/reactos/subsys/win32k/ntuser/csr.c @@ -1,4 +1,4 @@ -/* $Id: csr.c,v 1.1 2004/05/28 21:33:41 gvg Exp $ +/* $Id: csr.c,v 1.2 2004/07/12 20:09:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -73,7 +73,7 @@ CsrNotify(PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply) Status = Reply->Status; } - return STATUS_SUCCESS; + return Status; } /* EOF */ diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index e786c0be3fa..67841b6e12a 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.82 2004/07/08 14:36:18 ekohl Exp $ +/* $Id: misc.c,v 1.83 2004/07/12 20:09:35 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,12 +37,14 @@ PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue() { } BOOL FASTCALL -IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister) +IntRegisterLogonProcess(DWORD ProcessId, BOOL Register) { PEPROCESS Process; NTSTATUS Status; + CSRSS_API_REQUEST Request; + CSRSS_API_REPLY Reply; - Status = PsLookupProcessByProcessId((PVOID)dwProcessId, + Status = PsLookupProcessByProcessId((PVOID)ProcessId, &Process); if (!NT_SUCCESS(Status)) { @@ -50,7 +52,7 @@ IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister) return FALSE; } - if (bRegister) + if (Register) { /* Register the logon process */ if (LogonProcess != NULL) @@ -75,6 +77,17 @@ IntRegisterLogonProcess(DWORD dwProcessId, BOOL bRegister) ObDereferenceObject(Process); + Request.Type = CSRSS_REGISTER_LOGON_PROCESS; + Request.Data.RegisterLogonProcessRequest.ProcessId = ProcessId; + Request.Data.RegisterLogonProcessRequest.Register = Register; + + Status = CsrNotify(&Request, &Reply); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to register logon process with CSRSS\n"); + return FALSE; + } + return TRUE; } From a1f4820c318460600d826b1b5de2ba97e587db3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 20:26:35 +0000 Subject: [PATCH 273/356] Shutdown step 1: inform winlogon (forgotten file) svn path=/trunk/; revision=10095 --- reactos/include/csrss/csrss.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/reactos/include/csrss/csrss.h b/reactos/include/csrss/csrss.h index 20ed9dab918..392e23b29d2 100644 --- a/reactos/include/csrss/csrss.h +++ b/reactos/include/csrss/csrss.h @@ -532,6 +532,25 @@ typedef struct { } CSRSS_HIDE_DESKTOP_REPLY, *PCSRSS_HIDE_DESKTOP_REPLY; +typedef struct +{ + HWND LogonNotifyWindow; +} CSRSS_SET_LOGON_NOTIFY_WINDOW_REQUEST, *PCSRSS_SET_LOGON_NOTIFY_WINDOW_REQUEST; + +typedef struct +{ +} CSRSS_SET_LOGON_NOTIFY_WINDOW_REPLY, *PCSRSS_SET_LOGON_NOTIFY_WINDOW_REPLY; + +typedef struct +{ + DWORD ProcessId; + BOOL Register; +} CSRSS_REGISTER_LOGON_PROCESS_REQUEST, *PCSRSS_REGISTER_LOGON_PROCESS_REQUEST; + +typedef struct +{ +} CSRSS_REGISTER_LOGON_PROCESS_REPLY, *PCSRSS_REGISTER_LOGON_PROCESS_REPLY; + #define CSRSS_MAX_WRITE_CONSOLE_REQUEST \ (MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST)) @@ -597,6 +616,8 @@ typedef struct #define CSRSS_SHOW_DESKTOP (0x2C) #define CSRSS_HIDE_DESKTOP (0x2D) #define CSRSS_SET_CONSOLE_ICON (0x2E) +#define CSRSS_SET_LOGON_NOTIFY_WINDOW (0x2F) +#define CSRSS_REGISTER_LOGON_PROCESS (0x30) /* Keep in sync with definition below. */ #define CSRSS_REQUEST_HEADER_SIZE (LPC_MESSAGE_BASE_SIZE + sizeof(ULONG)) @@ -656,6 +677,8 @@ typedef struct CSRSS_SHOW_DESKTOP_REQUEST ShowDesktopRequest; CSRSS_HIDE_DESKTOP_REQUEST HideDesktopRequest; CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconRequest; + CSRSS_SET_LOGON_NOTIFY_WINDOW_REQUEST SetLogonNotifyWindowRequest; + CSRSS_REGISTER_LOGON_PROCESS_REQUEST RegisterLogonProcessRequest; } Data; }; }; @@ -703,6 +726,8 @@ typedef struct CSRSS_SHOW_DESKTOP_REPLY ShowDesktopReply; CSRSS_HIDE_DESKTOP_REPLY HideDesktopReply; CSRSS_CONSOLE_SET_WINDOW_ICON ConsoleSetWindowIconReply; + CSRSS_SET_LOGON_NOTIFY_WINDOW_REPLY SetLogonNotifyWindowReply; + CSRSS_REGISTER_LOGON_PROCESS_REPLY RegisterLogonProcessReply; } Data; }; }; From aa38cd0cd154c4e6140b334b8bceb4e77e0affae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 20:32:16 +0000 Subject: [PATCH 274/356] Marcus Meissner - Fixed double applet = applet = assignment. - Removed sic_hdpa only used in 1 C file as static var. - Make VT_Shell_IMalloc32 and related variables static. svn path=/trunk/; revision=10096 --- reactos/lib/shell32/control.c | 4 ++-- reactos/lib/shell32/shell32_main.h | 1 - reactos/lib/shell32/shellole.c | 6 +++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/reactos/lib/shell32/control.c b/reactos/lib/shell32/control.c index 72c697742a6..826f0db6b15 100644 --- a/reactos/lib/shell32/control.c +++ b/reactos/lib/shell32/control.c @@ -171,7 +171,7 @@ static BOOL Control_Localize(const CPanel* panel, unsigned cx, unsigned cy, RECT rc; GetClientRect(panel->hWnd, &rc); - for (applet = panel->first; applet; applet = applet = applet->next) { + for (applet = panel->first; applet; applet = applet->next) { for (i = 0; i < applet->count; i++) { if (!applet->info[i].dwSize) continue; if (x + XSTEP >= rc.right - rc.left) { @@ -201,7 +201,7 @@ static LRESULT Control_WndProc_Paint(const CPanel* panel, WPARAM wParam) hdc = (wParam) ? (HDC)wParam : BeginPaint(panel->hWnd, &ps); hOldFont = SelectObject(hdc, GetStockObject(ANSI_VAR_FONT)); GetClientRect(panel->hWnd, &rc); - for (applet = panel->first; applet; applet = applet = applet->next) { + for (applet = panel->first; applet; applet = applet->next) { for (i = 0; i < applet->count; i++) { if (x + XSTEP >= rc.right - rc.left) { x = 0; diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 934af5855d3..6ecdabe776c 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -44,7 +44,6 @@ extern HMODULE huser32; extern HINSTANCE shell32_hInstance; extern HIMAGELIST ShellSmallIconList; extern HIMAGELIST ShellBigIconList; -extern HDPA sic_hdpa; BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList); diff --git a/reactos/lib/shell32/shellole.c b/reactos/lib/shell32/shellole.c index e53f21f21b2..ccced91b89a 100644 --- a/reactos/lib/shell32/shellole.c +++ b/reactos/lib/shell32/shellole.c @@ -297,7 +297,7 @@ DWORD WINAPI SHCLSIDFromStringAW (LPVOID clsid, CLSID *id) */ /* set the vtable later */ -extern ICOM_VTABLE(IMalloc) VT_Shell_IMalloc32; +static ICOM_VTABLE(IMalloc) VT_Shell_IMalloc32; /* this is the static object instance */ typedef struct { @@ -305,10 +305,10 @@ typedef struct { DWORD dummy; } _ShellMalloc; -_ShellMalloc Shell_Malloc = { &VT_Shell_IMalloc32,1}; +static _ShellMalloc Shell_Malloc = { &VT_Shell_IMalloc32,1}; /* this is the global allocator of shell32 */ -IMalloc * ShellTaskAllocator = NULL; +static IMalloc * ShellTaskAllocator = NULL; /****************************************************************************** * IShellMalloc_QueryInterface [VTABLE] From 55dc46bf13564450a140dd307c328168cff365ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 20:53:24 +0000 Subject: [PATCH 275/356] Use string resources for ExitWindowsDialog() and RestartDialogEx() to allow internationalization. svn path=/trunk/; revision=10097 --- reactos/lib/shell32/dialogs.c | 79 +++++++++++++++++----------- reactos/lib/shell32/shell32_En.rc | 9 ++++ reactos/lib/shell32/shresdef.h | 5 ++ reactos/lib/shell32/winehq2ros.patch | 20 +++++++ 4 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 reactos/lib/shell32/winehq2ros.patch diff --git a/reactos/lib/shell32/dialogs.c b/reactos/lib/shell32/dialogs.c index bd19cd458d5..93b09f1ffcc 100644 --- a/reactos/lib/shell32/dialogs.c +++ b/reactos/lib/shell32/dialogs.c @@ -36,6 +36,7 @@ #include "shellapi.h" #include "shlobj.h" #include "shell32_main.h" +#include "shresdef.h" #include "undocshell.h" typedef struct @@ -378,31 +379,47 @@ void FillList (HWND hCb, char *pszLatest) } +/************************************************************************* + * ConfirmDialog [internal] + * + * Put up a confirm box, return TRUE if the user confirmed + */ +static BOOL ConfirmDialog(HWND hWndOwner, UINT PromptId, UINT TitleId) +{ + WCHAR Prompt[256]; + WCHAR Title[256]; + + LoadStringW(shell32_hInstance, PromptId, Prompt, sizeof(Prompt) / sizeof(WCHAR)); + LoadStringW(shell32_hInstance, TitleId, Title, sizeof(Title) / sizeof(WCHAR)); + return MessageBoxW(hWndOwner, Prompt, Title, MB_YESNO|MB_ICONQUESTION) == IDYES; +} + + /************************************************************************* * RestartDialogEx [SHELL32.730] */ -int WINAPI RestartDialogEx(HWND hwndOwner, LPCWSTR lpwstrReason, UINT uFlags, UINT uReason) +int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, DWORD uReason) { - TRACE("(%p)\n", hwndOwner); + TRACE("(%p)\n", hWndOwner); /*FIXME: use uReason */ - if (MessageBoxA(hwndOwner, "Do you want to restart the system?", "Restart", MB_YESNO|MB_ICONQUESTION) == IDYES) + if (ConfirmDialog(hWndOwner, IDS_RESTART_PROMPT, IDS_RESTART_TITLE)) { - if (SHELL_OsIsUnicode()) - { - HANDLE hToken; - TOKEN_PRIVILEGES npr = {1, {{{0, 0}, SE_PRIVILEGE_ENABLED}}}; + HANDLE hToken; + TOKEN_PRIVILEGES npr; - /* enable shutdown privilege for current process */ - OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); - LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid); - AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0); - CloseHandle(hToken); - } - - ExitWindowsEx(EWX_REBOOT, 0); + /* enable shutdown privilege for current process */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) + { + LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid); + npr.PrivilegeCount = 1; + npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0); + CloseHandle(hToken); + } + ExitWindowsEx(EWX_REBOOT, 0); } return 0; @@ -413,9 +430,9 @@ int WINAPI RestartDialogEx(HWND hwndOwner, LPCWSTR lpwstrReason, UINT uFlags, UI * RestartDialog [SHELL32.59] */ -int WINAPI RestartDialog(HWND hwndOwner, LPCWSTR lpstrReason, UINT uFlags) +int WINAPI RestartDialog(HWND hWndOwner, LPCWSTR lpstrReason, DWORD uFlags) { - return RestartDialogEx(hwndOwner, lpstrReason, uFlags, 0); + return RestartDialogEx(hWndOwner, lpstrReason, uFlags, 0); } @@ -429,22 +446,20 @@ void WINAPI ExitWindowsDialog (HWND hWndOwner) { TRACE("(%p)\n", hWndOwner); - if (MessageBoxA(hWndOwner, "Do you want to shutdown?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDYES) + if (ConfirmDialog(hWndOwner, IDS_SHUTDOWN_PROMPT, IDS_SHUTDOWN_TITLE)) { - if (SHELL_OsIsUnicode()) - { - HANDLE hToken; - TOKEN_PRIVILEGES npr = {1, {{{0, 0}, SE_PRIVILEGE_ENABLED}}}; + HANDLE hToken; + TOKEN_PRIVILEGES npr; - /* enable shutdown privilege for current process */ - OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); - LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid); - AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0); - CloseHandle(hToken); - - ExitWindowsEx(EWX_SHUTDOWN, 0); - } - else - SendMessageA(hWndOwner, WM_QUIT, 0, 0); + /* enable shutdown privilege for current process */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) + { + LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid); + npr.PrivilegeCount = 1; + npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0); + CloseHandle(hToken); + } + ExitWindowsEx(EWX_SHUTDOWN, 0); } } diff --git a/reactos/lib/shell32/shell32_En.rc b/reactos/lib/shell32/shell32_En.rc index 6b5c680bc71..fdfd6ea32d4 100644 --- a/reactos/lib/shell32/shell32_En.rc +++ b/reactos/lib/shell32/shell32_En.rc @@ -177,3 +177,12 @@ BEGIN IDS_SHV_COLUMN8 "Name" IDS_SHV_COLUMN9 "Comments" END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Restart" + IDS_RESTART_PROMPT "Do you want to restart the system?" + IDS_SHUTDOWN_TITLE "Shutdown" + IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" +} diff --git a/reactos/lib/shell32/shresdef.h b/reactos/lib/shell32/shresdef.h index 3bb0d4780f4..f9bd69531ca 100644 --- a/reactos/lib/shell32/shresdef.h +++ b/reactos/lib/shell32/shresdef.h @@ -51,6 +51,11 @@ #define IDS_OVERWRITEFILE_CAPTION 36 #define IDS_OVERWRITEFILE_TEXT 37 +#define IDS_RESTART_TITLE 40 +#define IDS_RESTART_PROMPT 41 +#define IDS_SHUTDOWN_TITLE 42 +#define IDS_SHUTDOWN_PROMPT 43 + /* browse for folder dialog box */ #define IDD_STATUS 0x3743 #define IDD_TITLE 0x3742 diff --git a/reactos/lib/shell32/winehq2ros.patch b/reactos/lib/shell32/winehq2ros.patch new file mode 100644 index 00000000000..ca95d52910d --- /dev/null +++ b/reactos/lib/shell32/winehq2ros.patch @@ -0,0 +1,20 @@ +Index: shell32_En.rc +=================================================================== +RCS file: /home/wine/wine/dlls/shell32/shell32_En.rc,v +retrieving revision 1.14 +diff -u -r1.14 shell32_En.rc +--- shell32_En.rc 9 Jul 2004 22:51:19 -0000 1.14 ++++ shell32_En.rc 12 Jul 2004 21:01:03 -0000 +@@ -181,8 +181,8 @@ + /* message box strings */ + STRINGTABLE DISCARDABLE + { +- IDS_RESTART_TITLE "Restart" +- IDS_RESTART_PROMPT "Do you want to simulate a Windows reboot?" +- IDS_SHUTDOWN_TITLE "Shutdown" +- IDS_SHUTDOWN_PROMPT "Do you want to shutdown your Wine session?" ++ IDS_RESTART_TITLE "Restart" ++ IDS_RESTART_PROMPT "Do you want to restart the system?" ++ IDS_SHUTDOWN_TITLE "Shutdown" ++ IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" + } From 935851acb66bc5b73f4c927c7c2b8dcbe1198d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 21:26:39 +0000 Subject: [PATCH 276/356] =?UTF-8?q?Ilya=20Korniyko=20=20?= =?UTF-8?q?-=20Added=20Ukrainian=20translations.=20Jos=EF=BF=BD=20Manuel?= =?UTF-8?q?=20Ferrer=20Ortiz=20=20-=20Updated=20the=20S?= =?UTF-8?q?panish=20shell32=20translation=20and=20made=20some=20correction?= =?UTF-8?q?s=20to=20=20=20other=20language=20files.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=10098 --- reactos/lib/shell32/shell32_En.rc | 2 +- reactos/lib/shell32/shell32_Es.rc | 137 ++++++++++++++++++++++- reactos/lib/shell32/shell32_Uk.rc | 177 ++++++++++++++++++++++++++++++ reactos/lib/shell32/shres.rc | 3 +- 4 files changed, 313 insertions(+), 6 deletions(-) create mode 100644 reactos/lib/shell32/shell32_Uk.rc diff --git a/reactos/lib/shell32/shell32_En.rc b/reactos/lib/shell32/shell32_En.rc index fdfd6ea32d4..ba646005c48 100644 --- a/reactos/lib/shell32/shell32_En.rc +++ b/reactos/lib/shell32/shell32_En.rc @@ -81,7 +81,7 @@ BEGIN MENUITEM "C&ut", FCIDM_SHVIEW_CUT MENUITEM "&Copy", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "&Create Link", FCIDM_SHVIEW_CREATELINK + MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK MENUITEM "&Delete", FCIDM_SHVIEW_DELETE MENUITEM "&Rename", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR diff --git a/reactos/lib/shell32/shell32_Es.rc b/reactos/lib/shell32/shell32_Es.rc index 09b12960399..43e2fb8a5b6 100644 --- a/reactos/lib/shell32/shell32_Es.rc +++ b/reactos/lib/shell32/shell32_Es.rc @@ -1,6 +1,6 @@ /* * Copyright 1998 Juergen Schmied - * Copyright 2003 José Manuel Ferrer Ortiz + * Copyright 2003,2004 José Manuel Ferrer Ortiz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,12 +19,98 @@ LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "Iconos &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Iconos &pequeños", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalles", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP"" + BEGIN + POPUP "&Ver" + BEGIN + MENUITEM "Iconos &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Iconos &pequeños", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalles", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Ordenar &iconos" + BEGIN + MENUITEM "Por &nombre", 0x30 /* column 0 */ + MENUITEM "Por &tipo", 0x32 /* column 2 */ + MENUITEM "Por t&amaño", 0x31 /* ... */ + MENUITEM "Por &fecha", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Ordenar automáticamente", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Alinear iconos", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Actualizar", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Pegar", FCIDM_SHVIEW_INSERT + MENUITEM "Pegar acceso directo", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Nuevo" + BEGIN + MENUITEM "Nueva &carpeta", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Nuevo &acceso directo", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Propiedades", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP"" + BEGIN + MENUITEM "E&xplorar", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Abrir", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "C&ortar", FCIDM_SHVIEW_CUT + MENUITEM "&Copiar", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "C&rear acceso directo", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Eliminar", FCIDM_SHVIEW_DELETE + MENUITEM "Re&nombrar", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Propiedades", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Explorar carpeta" +FONT 8, "Helv" +{ + DEFPUSHBUTTON "Aceptar", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Acerca de %s" FONT 10, "Helv" { - DEFPUSHBUTTON "Aceptar", IDOK, 153, 130, 50, 12 + DEFPUSHBUTTON "Aceptar", IDOK, 153, 130, 50, 12, WS_TABSTOP LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER ICON "", 1088, 189, 10, 14, 16 LTEXT "", 100, 8, 10, 137, 33 @@ -45,8 +131,42 @@ FONT 8, "Helv" PUSHBUTTON "&Examinar...", 12288, 170, 63, 50, 14, WS_TABSTOP } -/* columns in the shellview */ -STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Escritorio" + IDS_MYCOMPUTER "Mi PC" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "Iconos &grandes" + IDS_VIEW_SMALL "Iconos &pequeños" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Detalles" + IDS_SELECT "Seleccionar" + IDS_OPEN "Abrir" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "No se puede crear nueva carpeta: Permiso denegado." + IDS_CREATEFOLDER_CAPTION "Error durante la creación de una nueva carpeta" + IDS_DELETEITEM_CAPTION "Confirmar eliminación de archivo" + IDS_DELETEFOLDER_CAPTION "Confirmar eliminación de carpeta" + IDS_DELETEITEM_TEXT "¿Seguro que desea eliminar '%1'?" + IDS_DELETEMULTIPLE_TEXT "¿Seguro que desea eliminar estos %1 elementos?" + IDS_OVERWRITEFILE_TEXT "¿Sobreescribir el archivo '%1'?" + IDS_OVERWRITEFILE_CAPTION "Confirmar sobreescritura de archivo" +} + +/* columns in the shellview */ +STRINGTABLE BEGIN IDS_SHV_COLUMN1 "Archivo" IDS_SHV_COLUMN2 "Tamaño" @@ -58,3 +178,12 @@ BEGIN IDS_SHV_COLUMN8 "Nombre" IDS_SHV_COLUMN9 "Comentarios" END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Reiniciar" + IDS_RESTART_PROMPT "¿Desea simular un reinicio de Windows?" + IDS_SHUTDOWN_TITLE "Apagar" + IDS_SHUTDOWN_PROMPT "¿Desea terminar su sesión Wine?" +} diff --git a/reactos/lib/shell32/shell32_Uk.rc b/reactos/lib/shell32/shell32_Uk.rc new file mode 100644 index 00000000000..6c71a341e7f --- /dev/null +++ b/reactos/lib/shell32/shell32_Uk.rc @@ -0,0 +1,177 @@ +/* + * Copyright 2004 Ilya Korniyko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Âåëèê³ ²êîíêè", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ìàë³ ²êîíêè", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Ñïèñîê", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Ïîäðîáèö³", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP"" + BEGIN + POPUP "&Âèãëÿä" + BEGIN + MENUITEM "&Âåëèê³ ²êîíêè", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ìàë³ ²êîíêè", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Ñïèñîê", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Ïîäðîáèö³", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Âïîðÿäêóâàòè &²êîíêè" + BEGIN + MENUITEM "Çà &Íàçâîþ", 0x30 /* column 0 */ + MENUITEM "Çà &Òèïîì", 0x32 /* column 2 */ + MENUITEM "Çà &Ðîçì³ðîì", 0x31 /* ... */ + MENUITEM "Çà &Äàòîþ", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Àâòîìàòè÷íî", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Âèð³âíÿòè ²êîíêè", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Îíîâèòè", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Âñòàâèòè", FCIDM_SHVIEW_INSERT + MENUITEM "Âñòàâèòè Ïîñèëàííÿ", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Ñòâîðèòè" + BEGIN + MENUITEM "Íîâà &Òåêà", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Íîâå &Ïîñèëàííÿ", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Âëàñòèâîñò³", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP"" + BEGIN + MENUITEM "&Ïðîâ³äíèê", FCIDM_SHVIEW_EXPLORE + MENUITEM "&³äêðèòè", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "Âè&ð³çàòè", FCIDM_SHVIEW_CUT + MENUITEM "&Êîï³ÿ", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "&Ñòâîðèòè Ïîñèëàííÿ", FCIDM_SHVIEW_CREATELINK + MENUITEM "Âè&äàëèòè", FCIDM_SHVIEW_DELETE + MENUITEM "Ïåðå&éìåíóâàòè", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Âëàñòèâîñò³", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Îãëÿä äî òåêè" +FONT 8, "Helv" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "³äì³íà", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Ïðî %s" +FONT 10, "Helv" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 130, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 189, 10, 14, 16 + LTEXT "", 100, 8, 10, 137, 33 + LTEXT "Ðîçðîáíèêè Wine:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "Helv" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Ââåä³òü ³ì'ÿ ïðîãðàìè, òåêè, äîêóìåíòó ÷è ðåñóðñ ²íòåðíåòó, ³ Wine â³äêðèº ¿õ.", 12289, 36, 11, 182, 18 + LTEXT "&³äêðèòè:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "³äì³íà", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Îãëÿä...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Ñò³ëüíèöÿ" + IDS_MYCOMPUTER "̳é Êîìï'þòåð" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Âåëèê³ ²êîíêè" + IDS_VIEW_SMALL "&Ìàë³ ²êîíêè" + IDS_VIEW_LIST "&Ñïèñîê" + IDS_VIEW_DETAILS "&Ïîäðîáèö³" + IDS_SELECT "Âè&áðàòè" + IDS_OPEN "³&äêðèòè" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Íå âäàëîñÿ ñòâîðèòè íîâó òåêó: ³äìîâà ó äîñòóï³." + IDS_CREATEFOLDER_CAPTION "Ïîìèëêà ïðè ñòâîðåíí³ íîâî¿ òåêè" + IDS_DELETEITEM_CAPTION "ϳäòâåðäæåííÿ âèëó÷åííÿ ôàéëó" + IDS_DELETEFOLDER_CAPTION "ϳäòâåðäæåííÿ âèëó÷åííÿ òåêè" + IDS_DELETEITEM_TEXT "Âè âïåâíåí³, ùî õî÷åòå âèëó÷èòè '%1'?" + IDS_DELETEMULTIPLE_TEXT "Âè âïåâíåí³, ùî õî÷åòå âèëó÷èòè ö³ %1 åëåìåíòè(³â)?" + IDS_OVERWRITEFILE_TEXT "Ïåðåïèñàòè Ôàéë %1?" + IDS_OVERWRITEFILE_CAPTION "ϳäòâåðäæåííÿ Ïåðåçàïèñó Ôàéëó" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Ôàéë" + IDS_SHV_COLUMN2 "Ðîçì³ð" + IDS_SHV_COLUMN3 "Òèï" + IDS_SHV_COLUMN4 "Çì³íåíî" + IDS_SHV_COLUMN5 "Àòðèáóòè" + IDS_SHV_COLUMN6 "Ðîçì³ð" + IDS_SHV_COLUMN7 "³ëüíèé Ðîçì³ð" +END diff --git a/reactos/lib/shell32/shres.rc b/reactos/lib/shell32/shres.rc index 69a384ce283..02350abaf56 100644 --- a/reactos/lib/shell32/shres.rc +++ b/reactos/lib/shell32/shres.rc @@ -9037,6 +9037,7 @@ END #include "shell32_Fr.rc" #include "shell32_Hu.rc" #include "shell32_It.rc" +#include "shell32_Ja.rc" #include "shell32_Ko.rc" #include "shell32_Nl.rc" #include "shell32_No.rc" @@ -9046,6 +9047,6 @@ END #include "shell32_Si.rc" #include "shell32_Sk.rc" #include "shell32_Sv.rc" +#include "shell32_Uk.rc" #include "shell32_Wa.rc" -#include "shell32_Ja.rc" #include "shell32_Zh.rc" From bd1c1f6d7b1defb85dd33d2f7f4b6467c8cec253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 22:01:22 +0000 Subject: [PATCH 277/356] Fix syntax problem for some windres versions svn path=/trunk/; revision=10099 --- reactos/lib/shell32/shell32_Es.rc | 4 ++-- reactos/lib/shell32/shell32_Uk.rc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/lib/shell32/shell32_Es.rc b/reactos/lib/shell32/shell32_Es.rc index 43e2fb8a5b6..d7f94080c9d 100644 --- a/reactos/lib/shell32/shell32_Es.rc +++ b/reactos/lib/shell32/shell32_Es.rc @@ -32,7 +32,7 @@ END */ MENU_002 MENU DISCARDABLE BEGIN - POPUP"" + POPUP "" BEGIN POPUP "&Ver" BEGIN @@ -74,7 +74,7 @@ END */ MENU_SHV_FILE MENU DISCARDABLE BEGIN - POPUP"" + POPUP "" BEGIN MENUITEM "E&xplorar", FCIDM_SHVIEW_EXPLORE MENUITEM "&Abrir", FCIDM_SHVIEW_OPEN diff --git a/reactos/lib/shell32/shell32_Uk.rc b/reactos/lib/shell32/shell32_Uk.rc index 6c71a341e7f..fddb0beb833 100644 --- a/reactos/lib/shell32/shell32_Uk.rc +++ b/reactos/lib/shell32/shell32_Uk.rc @@ -31,7 +31,7 @@ END */ MENU_002 MENU DISCARDABLE BEGIN - POPUP"" + POPUP "" BEGIN POPUP "&Âèãëÿä" BEGIN @@ -73,7 +73,7 @@ END */ MENU_SHV_FILE MENU DISCARDABLE BEGIN - POPUP"" + POPUP "" BEGIN MENUITEM "&Ïðîâ³äíèê", FCIDM_SHVIEW_EXPLORE MENUITEM "&³äêðèòè", FCIDM_SHVIEW_OPEN From 0cffba8389fa2dee47c4ed137f8b659ced21a269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 22:03:09 +0000 Subject: [PATCH 278/356] Robert Shearman - Make ole32 a delay-load import of shell32. (except that the ReactOS build system doesn't handle delay-load imports yet, so make it a normal import) svn path=/trunk/; revision=10100 --- reactos/lib/shell32/Makefile.in | 4 +- reactos/lib/shell32/Makefile.ros-template | 4 +- reactos/lib/shell32/clipboard.c | 37 --------------- reactos/lib/shell32/shell32_main.h | 14 ------ reactos/lib/shell32/shellole.c | 39 ++++------------ reactos/lib/shell32/shellord.c | 9 ++-- reactos/lib/shell32/shlview.c | 21 +++------ reactos/lib/shell32/shv_item_cmenu.c | 56 +++-------------------- 8 files changed, 29 insertions(+), 155 deletions(-) diff --git a/reactos/lib/shell32/Makefile.in b/reactos/lib/shell32/Makefile.in index 7f2fe6052c1..01b637d52b1 100644 --- a/reactos/lib/shell32/Makefile.in +++ b/reactos/lib/shell32/Makefile.in @@ -4,8 +4,8 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = shell32.dll -# fixme: avoid ole32.dll import -IMPORTS = ole32 shlwapi comctl32 user32 gdi32 advapi32 kernel32 ntdll +IMPORTS = shlwapi comctl32 user32 gdi32 advapi32 kernel32 +DELAYIMPORTS = ole32 ALTNAMES = shell.dll EXTRALIBS = $(LIBUUID) $(LIBUNICODE) diff --git a/reactos/lib/shell32/Makefile.ros-template b/reactos/lib/shell32/Makefile.ros-template index 4f5efabbd62..7346ce5b19c 100644 --- a/reactos/lib/shell32/Makefile.ros-template +++ b/reactos/lib/shell32/Makefile.ros-template @@ -1,4 +1,4 @@ -# $Id: Makefile.ros-template,v 1.3 2004/05/29 21:24:46 hbirr Exp $ +# $Id: Makefile.ros-template,v 1.4 2004/07/12 22:03:09 gvg Exp $ TARGET_NAME = shell32 @@ -6,7 +6,7 @@ TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -TARGET_SDKLIBS = libwine.a @IMPORTS@ wine_uuid.a +TARGET_SDKLIBS = libwine.a @IMPORTS@ ole32.a wine_uuid.a ntdll.a TARGET_BASE = $(TARGET_BASE_LIB_SHELL32) diff --git a/reactos/lib/shell32/clipboard.c b/reactos/lib/shell32/clipboard.c index ad1e0bf226a..71c929365b9 100644 --- a/reactos/lib/shell32/clipboard.c +++ b/reactos/lib/shell32/clipboard.c @@ -52,43 +52,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); -HRESULT (WINAPI *pOleInitialize)(LPVOID reserved); -void (WINAPI *pOleUninitialize)(void); -HRESULT (WINAPI *pRegisterDragDrop)(HWND hwnd, IDropTarget* pDropTarget); -HRESULT (WINAPI *pRevokeDragDrop)(HWND hwnd); -HRESULT (WINAPI *pDoDragDrop)(LPDATAOBJECT,LPDROPSOURCE,DWORD,DWORD*); -void (WINAPI *pReleaseStgMedium)(STGMEDIUM* pmedium); -HRESULT (WINAPI *pOleSetClipboard)(IDataObject* pDataObj); -HRESULT (WINAPI *pOleGetClipboard)(IDataObject** ppDataObj); - -/************************************************************************** - * GetShellOle - * - * make sure OLE32.DLL is loaded - */ -BOOL GetShellOle(void) -{ - static HANDLE hOle32 = NULL; - if(!hOle32) - { - hOle32 = LoadLibraryA("ole32.dll"); - if(hOle32) - { - pOleInitialize=(void*)GetProcAddress(hOle32,"OleInitialize"); - pOleUninitialize=(void*)GetProcAddress(hOle32,"OleUninitialize"); - pRegisterDragDrop=(void*)GetProcAddress(hOle32,"RegisterDragDrop"); - pRevokeDragDrop=(void*)GetProcAddress(hOle32,"RevokeDragDrop"); - pDoDragDrop=(void*)GetProcAddress(hOle32,"DoDragDrop"); - pReleaseStgMedium=(void*)GetProcAddress(hOle32,"ReleaseStgMedium"); - pOleSetClipboard=(void*)GetProcAddress(hOle32,"OleSetClipboard"); - pOleGetClipboard=(void*)GetProcAddress(hOle32,"OleGetClipboard"); - - pOleInitialize(NULL); - } - } - return TRUE; -} - /************************************************************************** * RenderHDROP * diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h index 6ecdabe776c..7787fb4a121 100644 --- a/reactos/lib/shell32/shell32_main.h +++ b/reactos/lib/shell32/shell32_main.h @@ -130,20 +130,6 @@ HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uI BOOL SYSTRAY_Init(void); #endif -/* OLE32 */ -extern HINSTANCE hShellOle32; - -extern HRESULT (WINAPI *pOleInitialize)(LPVOID reserved); -extern void (WINAPI *pOleUninitialize)(void); -extern HRESULT (WINAPI *pRegisterDragDrop)(HWND hwnd, IDropTarget* pDropTarget); -extern HRESULT (WINAPI *pRevokeDragDrop)(HWND hwnd); -extern HRESULT (WINAPI *pDoDragDrop)(LPDATAOBJECT,LPDROPSOURCE,DWORD,DWORD*); -extern void (WINAPI *pReleaseStgMedium)(STGMEDIUM* pmedium); -extern HRESULT (WINAPI *pOleSetClipboard)(IDataObject* pDataObj); -extern HRESULT (WINAPI *pOleGetClipboard)(IDataObject** ppDataObj); -extern HRESULT (WINAPI *pCoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv); - -BOOL GetShellOle(void); HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); diff --git a/reactos/lib/shell32/shellole.c b/reactos/lib/shell32/shellole.c index ccced91b89a..56acf78e81e 100644 --- a/reactos/lib/shell32/shellole.c +++ b/reactos/lib/shell32/shellole.c @@ -71,30 +71,6 @@ struct { {NULL,NULL} }; -/************************************************************************* - * __CoCreateInstance [internal] - * - * NOTES - * wraper for late bound call to OLE32.DLL - * - */ -HRESULT (WINAPI *pCoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv) = NULL; - -void * __GetExternalFunc(HMODULE * phModule, LPCWSTR szModuleName, LPCSTR szProcName) -{ - if (!*phModule) *phModule = GetModuleHandleW(szModuleName); - if (!*phModule) *phModule = LoadLibraryW(szModuleName); - if (*phModule) return GetProcAddress(*phModule, szProcName); - return NULL; -} - -HRESULT __CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv) -{ - if(!pCoCreateInstance) pCoCreateInstance = __GetExternalFunc(&hShellOle32, sOLE32, "CoCreateInstance"); - if(!pCoCreateInstance) return E_FAIL; - return pCoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, ppv); -} - /************************************************************************* * SHCoCreateInstance [SHELL32.102] * @@ -211,7 +187,7 @@ LRESULT WINAPI SHCoCreateInstance( } else { /* load a external dll in the usual way */ - hres = __CoCreateInstance(myclsid, pUnkOuter, CLSCTX_INPROC_SERVER, refiid, ppv); + hres = CoCreateInstance(myclsid, pUnkOuter, CLSCTX_INPROC_SERVER, refiid, ppv); goto end; } @@ -437,17 +413,18 @@ static ICOM_VTABLE(IMalloc) VT_Shell_IMalloc32 = */ HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) { - HRESULT (WINAPI *pCoGetMalloc)(DWORD,LPMALLOC *); - HMODULE hOle32; - TRACE("(%p)\n", lpmal); if (!ShellTaskAllocator) { - hOle32 = GetModuleHandleA("OLE32.DLL"); + HMODULE hOle32 = GetModuleHandleA("OLE32.DLL"); + /* this is very suspect. we should not being using a different + * allocator from deallocator based on something undeterministic + * like whether ole32 is loaded. as it happens currently, they + * both map to the same allocator deep down, but this could + * change in the future. */ if(hOle32) { - pCoGetMalloc = (void*) GetProcAddress(hOle32, "CoGetMalloc"); - if (pCoGetMalloc) pCoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator); + CoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator); TRACE("got ole32 IMalloc\n"); } if(!ShellTaskAllocator) { diff --git a/reactos/lib/shell32/shellord.c b/reactos/lib/shell32/shellord.c index d6521fa4b75..c16b66255d2 100644 --- a/reactos/lib/shell32/shellord.c +++ b/reactos/lib/shell32/shellord.c @@ -426,8 +426,7 @@ HRESULT WINAPI SHRegisterDragDrop( LPDROPTARGET pDropTarget) { FIXME("(%p,%p):stub.\n", hWnd, pDropTarget); - if (GetShellOle()) return pRegisterDragDrop(hWnd, pDropTarget); - return 0; + return RegisterDragDrop(hWnd, pDropTarget); } /************************************************************************* @@ -439,8 +438,7 @@ HRESULT WINAPI SHRegisterDragDrop( HRESULT WINAPI SHRevokeDragDrop(HWND hWnd) { FIXME("(%p):stub.\n",hWnd); - if (GetShellOle()) return pRevokeDragDrop(hWnd); - return 0; + return RevokeDragDrop(hWnd); } /************************************************************************* @@ -458,8 +456,7 @@ HRESULT WINAPI SHDoDragDrop( { FIXME("(%p %p %p 0x%08lx %p):stub.\n", hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect); - if (GetShellOle()) return pDoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); - return 0; + return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); } /************************************************************************* diff --git a/reactos/lib/shell32/shlview.c b/reactos/lib/shell32/shlview.c index adae9a68c6b..ec0ebb2017c 100644 --- a/reactos/lib/shell32/shlview.c +++ b/reactos/lib/shell32/shlview.c @@ -656,13 +656,10 @@ static LRESULT ShellView_OnCreate(IShellViewImpl * This) } } - if(GetShellOle() && pRegisterDragDrop) + if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt))) { - if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt))) - { - pRegisterDragDrop(This->hWnd, pdt); + RegisterDragDrop(This->hWnd, pdt); IDropTarget_Release(pdt); - } } /* register for receiving notifications */ @@ -1343,10 +1340,8 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn DWORD dwAttributes = SFGAO_CANLINK; DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE; - if(GetShellOle() && pDoDragDrop) + if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda))) { - if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda))) - { IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */ if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, (LPCITEMIDLIST*)This->apidl, &dwAttributes))) @@ -1360,10 +1355,9 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn if (pds) { DWORD dwEffect; - pDoDragDrop(pda, pds, dwEffect, &dwEffect); + DoDragDrop(pda, pds, dwEffect, &dwEffect); } IDataObject_Release(pda); - } } } break; @@ -1568,10 +1562,9 @@ static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wPara case WM_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0); - case WM_DESTROY: if(GetShellOle() && pRevokeDragDrop) - { - pRevokeDragDrop(pThis->hWnd); - } + + case WM_DESTROY: + RevokeDragDrop(pThis->hWnd); SHChangeNotifyDeregister(pThis->hNotify); break; diff --git a/reactos/lib/shell32/shv_item_cmenu.c b/reactos/lib/shell32/shv_item_cmenu.c index c5beee9be7a..a9c4cb6221e 100644 --- a/reactos/lib/shell32/shv_item_cmenu.c +++ b/reactos/lib/shell32/shv_item_cmenu.c @@ -366,62 +366,20 @@ static BOOL DoCopyOrCut( TRACE("(%p)->(wnd=%p,bCut=0x%08x)\n",This, hwnd, bCut); - if(GetShellOle()) + /* get the active IShellView */ + if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) { - /* get the active IShellView */ - if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) + if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) { - if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) + if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) { - if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) - { - pOleSetClipboard(lpDo); - IDataObject_Release(lpDo); - } - IShellView_Release(lpSV); + OleSetClipboard(lpDo); + IDataObject_Release(lpDo); } + IShellView_Release(lpSV); } } return TRUE; -#if 0 -/* - the following code does the copy operation witout ole32.dll - we might need this possibility too (js) -*/ - BOOL bSuccess = FALSE; - - TRACE("(%p)\n", iface); - - if(OpenClipboard(NULL)) - { - if(EmptyClipboard()) - { - IPersistFolder2 * ppf2; - IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); - if (ppf2) - { - LPITEMIDLIST pidl; - IPersistFolder2_GetCurFolder(ppf2, &pidl); - if(pidl) - { - HGLOBAL hMem; - - hMem = RenderHDROP(pidl, This->apidl, This->cidl); - - if(SetClipboardData(CF_HDROP, hMem)) - { - bSuccess = TRUE; - } - SHFree(pidl); - } - IPersistFolder2_Release(ppf2); - } - - } - CloseClipboard(); - } - return bSuccess; -#endif } /************************************************************************** * ISvItemCm_fnInvokeCommand() From 9a26dd9c781539cae83775f5734ed71d01a42a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 22:07:34 +0000 Subject: [PATCH 279/356] Fix RestartDialog() and RestartDialogEx() prototypes svn path=/trunk/; revision=10101 --- reactos/w32api/include/shlobj.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/w32api/include/shlobj.h b/reactos/w32api/include/shlobj.h index 761d35286dd..f71f632d93f 100644 --- a/reactos/w32api/include/shlobj.h +++ b/reactos/w32api/include/shlobj.h @@ -1637,8 +1637,8 @@ void WINAPI ILFree(LPITEMIDLIST); HRESULT WINAPI SHCoCreateInstance(LPCWSTR,REFCLSID,IUnknown*,REFIID,void**); #endif -int WINAPI RestartDialog(HWND,LPCWSTR,UINT); -int WINAPI RestartDialogEx(HWND,LPCWSTR,UINT,UINT); +int WINAPI RestartDialog(HWND,LPCWSTR,DWORD); +int WINAPI RestartDialogEx(HWND,LPCWSTR,DWORD,DWORD); ULONG WINAPI SHChangeNotifyRegister(HWND,int,LONG,UINT,int,SHChangeNotifyEntry *); BOOL WINAPI SHChangeNotifyDeregister(ULONG); From 1605dba90a290daa3fa01ef361f14f35bbde56bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 12 Jul 2004 22:34:27 +0000 Subject: [PATCH 280/356] SetLogonNotifyWindow is now implemented svn path=/trunk/; revision=10102 --- reactos/lib/user32/misc/stubs.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index ee758dbb71e..c0f0e938164 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.63 2004/05/21 10:09:31 weiden Exp $ +/* $Id: stubs.c,v 1.64 2004/07/12 22:34:27 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -372,17 +372,6 @@ RegisterTasklist ( DWORD x ) return FALSE; } -/* - * @unimplemented - */ -DWORD -STDCALL -SetLogonNotifyWindow ( HWINSTA hwinsta, HWND hwnd ) -{ - UNIMPLEMENTED; - return FALSE; -} - /* * @unimplemented */ From 6e5edb7df94ee1f7956e30b2c58fbd6ee1d2cd65 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 13 Jul 2004 02:43:06 +0000 Subject: [PATCH 281/356] Force a rebuild of the partition table if it already exists with a DeviceObject. svn path=/trunk/; revision=10103 --- reactos/drivers/storage/disk/disk.c | 36 +++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index f457bc3bbc0..5a529d7b58d 100644 --- a/reactos/drivers/storage/disk/disk.c +++ b/reactos/drivers/storage/disk/disk.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: disk.c,v 1.44 2004/07/05 21:42:05 hbirr Exp $ +/* $Id: disk.c,v 1.45 2004/07/13 02:43:06 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -870,13 +870,29 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, return Status; } +/* + A previous partition table may exist for this Device Object. + We will need to delete this data and force a rebuild. + */ + if(DiskDeviceExtension->StartingOffset.QuadPart) + { + DPRINT("Partition already installed!\n"); + DiskData->PartitionType = 0; + DiskData->PartitionNumber = 0; + DiskData->PartitionOrdinal = 0; + DiskData->HiddenSectors = 0; + DiskData->BootIndicator = 0; + DiskData->DriveNotReady = FALSE; + DiskDeviceExtension->StartingOffset.QuadPart = 0; + DiskDeviceExtension->PartitionLength.QuadPart = 0; + } + /* Read partition table */ - Status = IoReadPartitionTable(DiskDeviceExtension->PhysicalDevice, + Status = IoReadPartitionTable(DiskDeviceObject, DiskDeviceExtension->DiskGeometry->BytesPerSector, TRUE, &PartitionList); - DPRINT("IoReadPartitionTable(): Status: %lx\n", Status); if (!NT_SUCCESS(Status)) @@ -925,14 +941,14 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, } else { - DiskData->PartitionType = 0; - DiskData->PartitionNumber = 1; - DiskData->PartitionOrdinal = 0; - DiskData->HiddenSectors = 0; - DiskData->BootIndicator = 0; - DiskData->DriveNotReady = FALSE; - DiskDeviceExtension->PartitionLength.QuadPart += DiskDeviceExtension->StartingOffset.QuadPart; + DiskData->PartitionType = 0; + DiskData->PartitionNumber = 1; + DiskData->PartitionOrdinal = 0; + DiskData->HiddenSectors = 0; + DiskData->BootIndicator = 0; + DiskData->DriveNotReady = FALSE; DiskDeviceExtension->StartingOffset.QuadPart = 0; + DiskDeviceExtension->PartitionLength.QuadPart += DiskDeviceExtension->StartingOffset.QuadPart; } } From eda69bc46ff85f60d13ea80882f338e015f0dab3 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 13 Jul 2004 08:43:35 +0000 Subject: [PATCH 282/356] NtDuplicateToken() must create and return a handle to the duplicated token. svn path=/trunk/; revision=10104 --- reactos/ntoskrnl/se/token.c | 79 +++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index f929bdffd76..003300c2bbb 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -1,4 +1,4 @@ -/* $Id: token.c,v 1.36 2004/07/06 22:07:26 gvg Exp $ +/* $Id: token.c,v 1.37 2004/07/13 08:43:35 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -827,40 +827,61 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle, IN TOKEN_TYPE TokenType, OUT PHANDLE NewTokenHandle) { - PACCESS_TOKEN Token; - PACCESS_TOKEN NewToken; - NTSTATUS Status; - ULONG ExistingImpersonationLevel; - - Status = ObReferenceObjectByHandle(ExistingTokenHandle, - TOKEN_DUPLICATE, - SepTokenObjectType, - UserMode, - (PVOID*)&Token, - NULL); - if (!NT_SUCCESS(Status)) + KPROCESSOR_MODE PreviousMode; + PACCESS_TOKEN Token; + PACCESS_TOKEN NewToken; + NTSTATUS Status; + ULONG ExistingImpersonationLevel; + + PreviousMode = KeGetPreviousMode(); + Status = ObReferenceObjectByHandle(ExistingTokenHandle, + TOKEN_DUPLICATE, + SepTokenObjectType, + PreviousMode, + (PVOID*)&Token, + NULL); + if (!NT_SUCCESS(Status)) { - DPRINT1 ("Failed to reference token (Status %lx)\n", Status); - return Status; - } - - ExistingImpersonationLevel = Token->ImpersonationLevel; - Status = SepDuplicateToken(Token, - ObjectAttributes, - ImpersonationLevel, - TokenType, - ExistingImpersonationLevel, - KeGetPreviousMode(), - &NewToken); - if (!NT_SUCCESS(Status)) - { - DPRINT1 ("Failed to duplicate token (Status %lx)\n", Status); + DPRINT1("Failed to reference token (Status %lx)\n", Status); return Status; } - return STATUS_SUCCESS; + ExistingImpersonationLevel = Token->ImpersonationLevel; + Status = SepDuplicateToken(Token, + ObjectAttributes, + TokenType, + ImpersonationLevel, + ExistingImpersonationLevel, + PreviousMode, + &NewToken); + + ObDereferenceObject(Token); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to duplicate token (Status %lx)\n", Status); + return Status; + } + + Status = ObInsertObject((PVOID)NewToken, + NULL, + DesiredAccess, + 0, + NULL, + NewTokenHandle); + + ObDereferenceObject(NewToken); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create token handle (Status %lx)\n"); + return Status; + } + + return STATUS_SUCCESS; } + VOID SepAdjustGroups(PACCESS_TOKEN Token, ULONG a, BOOLEAN ResetToDefault, From 3ed7b52fb99dafa358437d022c91cb6f5eba0436 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 13 Jul 2004 11:48:32 +0000 Subject: [PATCH 283/356] NtOpenThreadToken() opens the thread token if OpenAsSelf is FALSE. svn path=/trunk/; revision=10105 --- reactos/ntoskrnl/ps/create.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/ps/create.c b/reactos/ntoskrnl/ps/create.c index 7ac5cba25c7..5539cc02237 100644 --- a/reactos/ntoskrnl/ps/create.c +++ b/reactos/ntoskrnl/ps/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.74 2004/07/10 17:01:03 hbirr Exp $ +/* $Id: create.c,v 1.75 2004/07/13 11:48:32 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -64,9 +64,9 @@ PsAssignImpersonationToken(PETHREAD Thread, if (TokenHandle != NULL) { Status = ObReferenceObjectByHandle(TokenHandle, - 0, + TOKEN_IMPERSONATE, SepTokenObjectType, - UserMode, + KeGetPreviousMode(), (PVOID*)&Token, NULL); if (!NT_SUCCESS(Status)) @@ -83,13 +83,14 @@ PsAssignImpersonationToken(PETHREAD Thread, PsImpersonateClient(Thread, Token, - 0, - 0, + FALSE, + FALSE, ImpersonationLevel); if (Token != NULL) { ObDereferenceObject(Token); } + return(STATUS_SUCCESS); } @@ -260,6 +261,10 @@ NtOpenThreadToken (IN HANDLE ThreadHandle, } if (OpenAsSelf) + { + Token = Thread->ThreadsProcess->Token; + } + else { if (Thread->ActiveImpersonationInfo == FALSE) { @@ -269,10 +274,6 @@ NtOpenThreadToken (IN HANDLE ThreadHandle, Token = Thread->ImpersonationInfo->Token; } - else - { - Token = Thread->ThreadsProcess->Token; - } if (Token == NULL) { From 3e7bd9bd7901155b78b4ce6d964bfa7c4b1741c2 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 13 Jul 2004 11:52:09 +0000 Subject: [PATCH 284/356] RtlImpersonateSelf(): Set impersonation level in call to NtDuplicateToken(). svn path=/trunk/; revision=10106 --- reactos/lib/rtl/security.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/reactos/lib/rtl/security.c b/reactos/lib/rtl/security.c index c50ec28863d..6939ed8d7d9 100644 --- a/reactos/lib/rtl/security.c +++ b/reactos/lib/rtl/security.c @@ -1,4 +1,4 @@ -/* $Id: security.c,v 1.1 2004/05/31 19:29:02 gdalsnes Exp $ +/* $Id: security.c,v 1.2 2004/07/13 11:52:09 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,8 +24,6 @@ NTSTATUS STDCALL RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) { - OBJECT_ATTRIBUTES ObjectAttributes; - SECURITY_QUALITY_OF_SERVICE SecQos; HANDLE ProcessToken; HANDLE ImpersonationToken; NTSTATUS Status; @@ -34,28 +32,20 @@ RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) TOKEN_DUPLICATE, &ProcessToken); if (!NT_SUCCESS(Status)) + { + DPRINT1("NtOpenProcessToken() failed (Status %lx)\n", Status); return(Status); - - SecQos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); - SecQos.ImpersonationLevel = ImpersonationLevel; - SecQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; - SecQos.EffectiveOnly = FALSE; - - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = 0; - ObjectAttributes.ObjectName = NULL; - ObjectAttributes.Attributes = 0; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = &SecQos; + } Status = NtDuplicateToken(ProcessToken, TOKEN_IMPERSONATE, - &ObjectAttributes, - 0, + NULL, + ImpersonationLevel, TokenImpersonation, &ImpersonationToken); if (!NT_SUCCESS(Status)) { + DPRINT1("NtDuplicateToken() failed (Status %lx)\n", Status); NtClose(ProcessToken); return(Status); } @@ -64,6 +54,11 @@ RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) ThreadImpersonationToken, &ImpersonationToken, sizeof(HANDLE)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetInformationThread() failed (Status %lx)\n", Status); + } + NtClose(ImpersonationToken); NtClose(ProcessToken); From 4cc77e37cc8d1a7d42a4c7d686a11fc5f1f64421 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 13 Jul 2004 16:57:35 +0000 Subject: [PATCH 285/356] Move some access rights so they are usable form kernel-mode. svn path=/trunk/; revision=10107 --- reactos/include/defines.h | 2 -- reactos/include/ntos/ntdef.h | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/defines.h b/reactos/include/defines.h index ffd0b5fc647..e9602ebfab4 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -534,8 +534,6 @@ extern "C" { #define PIPE_ACCESS_DUPLEX (3) #define PIPE_ACCESS_INBOUND (1) #define PIPE_ACCESS_OUTBOUND (2) -#define WRITE_DAC (0x40000L) -#define WRITE_OWNER (0x80000L) #define ACCESS_SYSTEM_SECURITY (0x1000000L) #define PIPE_TYPE_BYTE (0) #define PIPE_TYPE_MESSAGE (4) diff --git a/reactos/include/ntos/ntdef.h b/reactos/include/ntos/ntdef.h index 0230201ad3d..cfa22d98110 100644 --- a/reactos/include/ntos/ntdef.h +++ b/reactos/include/ntos/ntdef.h @@ -19,6 +19,8 @@ #define DELETE (0x00010000L) #define READ_CONTROL (0x00020000L) +#define WRITE_DAC (0x00040000L) +#define WRITE_OWNER (0x00080000L) #define SYNCHRONIZE (0x00100000L) #define DUPLICATE_CLOSE_SOURCE (1) From 91946de006790401796272ee91962df209c5db2f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 13 Jul 2004 16:59:35 +0000 Subject: [PATCH 286/356] First experimental implementstion of NtAccessCheck(). This should fix bug #362. svn path=/trunk/; revision=10108 --- reactos/ntoskrnl/se/semgr.c | 249 +++++++++++++++++++++++++++--------- 1 file changed, 189 insertions(+), 60 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 47f8e98b696..88c0a0e726a 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -1,4 +1,4 @@ -/* $Id: semgr.c,v 1.31 2004/07/12 12:04:17 ekohl Exp $ +/* $Id: semgr.c,v 1.32 2004/07/13 16:59:35 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -201,21 +201,6 @@ NtAllocateUuids(PULARGE_INTEGER Time, } -NTSTATUS STDCALL -NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN HANDLE ClientToken, - IN ACCESS_MASK DesiredAccess, - IN PGENERIC_MAPPING GenericMapping, - OUT PPRIVILEGE_SET PrivilegeSet, - OUT PULONG ReturnLength, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus) -{ - UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); -} - - /* * @implemented */ @@ -404,46 +389,35 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR ParentDescriptor, #endif } -BOOLEAN SepSidInToken(PACCESS_TOKEN Token, - PSID Sid) + +static BOOLEAN +SepSidInToken(PACCESS_TOKEN Token, + PSID Sid) { - ULONG i; - - if (Token->UserAndGroupCount == 0) - { - return(FALSE); - } - - for (i=0; iUserAndGroupCount; i++) - { - if (RtlEqualSid(Sid, Token->UserAndGroups[i].Sid)) - { - if (i == 0 || - (!(Token->UserAndGroups[i].Attributes & SE_GROUP_ENABLED))) - { - return(TRUE); - } - return(FALSE); - } - } - return(FALSE); + ULONG i; + + if (Token->UserAndGroupCount == 0) + { + return FALSE; + } + + for (i=0; iUserAndGroupCount; i++) + { + if (RtlEqualSid(Sid, Token->UserAndGroups[i].Sid)) + { + if (Token->UserAndGroups[i].Attributes & SE_GROUP_ENABLED) + { + return TRUE; + } + + return FALSE; + } + } + + return FALSE; } -/* - * @implemented - */ -BOOLEAN STDCALL -SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, - IN BOOLEAN SubjectContextLocked, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK PreviouslyGrantedAccess, - OUT PPRIVILEGE_SET* Privileges, - IN PGENERIC_MAPPING GenericMapping, - IN KPROCESSOR_MODE AccessMode, - OUT PACCESS_MODE GrantedAccess, - OUT PNTSTATUS AccessStatus) /* * FUNCTION: Determines whether the requested access rights can be granted * to an object protected by a security descriptor and an object owner @@ -459,7 +433,20 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, * GrantedAccess (OUT) = On return specifies the access granted * AccessStatus (OUT) = Status indicating why access was denied * RETURNS: If access was granted, returns TRUE + * + * @implemented */ +BOOLEAN STDCALL +SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, + IN BOOLEAN SubjectContextLocked, + IN ACCESS_MASK DesiredAccess, + IN ACCESS_MASK PreviouslyGrantedAccess, + OUT PPRIVILEGE_SET* Privileges, + IN PGENERIC_MAPPING GenericMapping, + IN KPROCESSOR_MODE AccessMode, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus) { ULONG i; PACL Dacl; @@ -472,10 +459,6 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, CurrentAccess = PreviouslyGrantedAccess; - /* - * Ignore the SACL for now - */ - /* * Check the DACL */ @@ -485,7 +468,8 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, &Defaulted); if (!NT_SUCCESS(Status)) { - return(Status); + *AccessStatus = Status; + return FALSE; } CurrentAce = (PACE)(Dacl + 1); @@ -501,12 +485,12 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return(STATUS_SUCCESS); } } + if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { if (SepSidInToken(SubjectSecurityContext->ClientToken, Sid)) { - CurrentAccess = CurrentAccess | - CurrentAce->AccessMask; + CurrentAccess |= CurrentAce->AccessMask; } } } @@ -521,7 +505,152 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, } *GrantedAccess = CurrentAccess; - return(STATUS_SUCCESS); + return TRUE; +} + + +NTSTATUS STDCALL +NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN HANDLE TokenHandle, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + OUT PPRIVILEGE_SET PrivilegeSet, + OUT PULONG ReturnLength, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus) +{ + KPROCESSOR_MODE PreviousMode; + PACCESS_TOKEN Token; + BOOLEAN Present; + BOOLEAN Defaulted; + PACE CurrentAce; + PACL Dacl; + PSID Sid; + ACCESS_MASK CurrentAccess; + ULONG i; + NTSTATUS Status; + + DPRINT("NtAccessCheck() called\n"); + + PreviousMode = KeGetPreviousMode(); + if (PreviousMode == KernelMode) + { + *GrantedAccess = DesiredAccess; + *AccessStatus = STATUS_SUCCESS; + return STATUS_SUCCESS; + } + + Status = ObReferenceObjectByHandle(TokenHandle, + TOKEN_QUERY, + SepTokenObjectType, + PreviousMode, + (PVOID*)&Token, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to reference token (Status %lx)\n", Status); + return Status; + } + + /* Check token type */ + if (Token->TokenType != TokenImpersonation) + { + DPRINT1("No impersonation token\n"); + ObDereferenceObject(Token); + return STATUS_ACCESS_VIOLATION; + } + + /* Check impersonation level */ + if (Token->ImpersonationLevel < SecurityAnonymous) + { + DPRINT1("Invalid impersonation level\n"); + ObDereferenceObject(Token); + return STATUS_ACCESS_VIOLATION; + } + + /* Get the DACL */ + Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, + &Present, + &Dacl, + &Defaulted); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlGetDaclSecurityDescriptor() failed (Status %lx)\n", Status); + ObDereferenceObject(Token); + return Status; + } + + /* RULE 1: Grant desired access if the object is unprotected */ + if (Dacl == NULL) + { + *GrantedAccess = DesiredAccess; + *AccessStatus = STATUS_SUCCESS; + return STATUS_SUCCESS; + } + + CurrentAccess = 0; + + /* FIXME: RULE 2: Check token for 'take ownership' privilege */ + + /* RULE 3: Check whether the token is the owner */ + Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, + &Sid, + &Defaulted); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); + ObDereferenceObject(Token); + return Status; + } + + if (SepSidInToken(Token, Sid)) + { + CurrentAccess |= (READ_CONTROL | WRITE_DAC); + if (DesiredAccess == CurrentAccess) + { + *AccessStatus = STATUS_SUCCESS; + *GrantedAccess = CurrentAccess; + return STATUS_SUCCESS; + } + } + + /* RULE 4: Grant rights according to the DACL */ + CurrentAce = (PACE)(Dacl + 1); + for (i = 0; i < Dacl->AceCount; i++) + { + Sid = (PSID)(CurrentAce + 1); + if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) + { + if (SepSidInToken(Token, Sid)) + { + *AccessStatus = STATUS_ACCESS_DENIED; + *GrantedAccess = 0; + return STATUS_SUCCESS; + } + } + + if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) + { + if (SepSidInToken(Token, Sid)) + { + CurrentAccess |= CurrentAce->AccessMask; + } + } + } + + DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", + CurrentAccess, DesiredAccess); + + ObDereferenceObject(Token); + + *GrantedAccess = CurrentAccess & DesiredAccess; + + *AccessStatus = + (*GrantedAccess == DesiredAccess) ? STATUS_SUCCESS : STATUS_ACCESS_DENIED; + + DPRINT("NtAccessCheck() done\n"); + + return STATUS_SUCCESS; } /* EOF */ From cbda3034090944ba967288ae2ffc13131c469911 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 14 Jul 2004 02:40:45 +0000 Subject: [PATCH 287/356] - Revert part of my last TLS patch. svn path=/trunk/; revision=10109 --- reactos/lib/ntdll/ldr/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/ntdll/ldr/utils.c b/reactos/lib/ntdll/ldr/utils.c index 0ed85b43db0..e2fe92bc150 100644 --- a/reactos/lib/ntdll/ldr/utils.c +++ b/reactos/lib/ntdll/ldr/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.98 2004/07/09 20:08:05 navaraf Exp $ +/* $Id: utils.c,v 1.99 2004/07/14 02:40:45 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -253,7 +253,7 @@ LdrpInitializeTlsForProccess(VOID) TlsData->TlsDataSize = TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData; TlsData->TlsZeroSize = TlsDirectory->SizeOfZeroFill; if (TlsDirectory->AddressOfCallBacks) - TlsData->TlsAddressOfCallBacks = *(PIMAGE_TLS_CALLBACK)RVA(Module->BaseAddress, TlsDirectory->AddressOfCallBacks); + TlsData->TlsAddressOfCallBacks = *TlsDirectory->AddressOfCallBacks; else TlsData->TlsAddressOfCallBacks = NULL; TlsData->Module = Module; From 6e17c87e599a110fdca205adb6bb6fe8da4e2aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 14 Jul 2004 06:52:29 +0000 Subject: [PATCH 288/356] Split "old-style Win 3.1" file dialog into 16 and 32 bit code svn path=/trunk/; revision=10110 --- reactos/lib/comdlg32/Makefile.in | 3 +- reactos/lib/comdlg32/filedlg.c | 333 +++++- reactos/lib/comdlg32/filedlg16.c | 1496 +++---------------------- reactos/lib/comdlg32/filedlg31.c | 931 +++++++++++++++ reactos/lib/comdlg32/filedlg31.h | 67 ++ reactos/lib/comdlg32/winehq2ros.patch | 93 -- 6 files changed, 1476 insertions(+), 1447 deletions(-) create mode 100644 reactos/lib/comdlg32/filedlg31.c create mode 100644 reactos/lib/comdlg32/filedlg31.h diff --git a/reactos/lib/comdlg32/Makefile.in b/reactos/lib/comdlg32/Makefile.in index 91949b80fe5..0490723b5f0 100644 --- a/reactos/lib/comdlg32/Makefile.in +++ b/reactos/lib/comdlg32/Makefile.in @@ -13,9 +13,10 @@ C_SRCS = \ cdlg32.c \ colordlg.c \ filedlg.c \ + filedlg31.c \ filedlgbrowser.c \ - finddlg32.c \ filetitle.c \ + finddlg32.c \ fontdlg.c \ printdlg.c diff --git a/reactos/lib/comdlg32/filedlg.c b/reactos/lib/comdlg32/filedlg.c index 933fe9be4b2..aef7f774729 100644 --- a/reactos/lib/comdlg32/filedlg.c +++ b/reactos/lib/comdlg32/filedlg.c @@ -68,6 +68,7 @@ #include "commdlg.h" #include "dlgs.h" #include "cdlg.h" +#include "filedlg31.h" #include "wine/debug.h" #include "cderr.h" #include "shellapi.h" @@ -104,6 +105,11 @@ typedef struct tagLookInInfo UINT uSelectedItem; } LookInInfos; +typedef struct tagFD32_PRIVATE +{ + OPENFILENAMEA *ofnA; /* original structure if 32bits ansi dialog */ +} FD32_PRIVATE, *PFD32_PRIVATE; + /*********************************************************************** * Defines and global variables @@ -223,10 +229,6 @@ HRESULT FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM wParam BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPWSTR lpstrFileList, UINT nFileCount, UINT sizeUsed); static BOOL BrowseSelectedFolder(HWND hwnd); -/* old style dialogs */ -extern BOOL GetFileName31A(LPOPENFILENAMEA lpofn, UINT dlgType); -extern BOOL GetFileName31W(LPOPENFILENAMEW lpofn, UINT dlgType); - /*********************************************************************** * GetFileName95 * @@ -3272,6 +3274,321 @@ static void MemFree(void *mem) } } +/* + * Old-style (win3.1) dialogs */ + +/*********************************************************************** + * FD32_GetTemplate [internal] + * + * Get a template (or FALSE if failure) when 16 bits dialogs are used + * by a 32 bits application + * + */ +static BOOL FD32_GetTemplate(PFD31_DATA lfs) +{ + LPOPENFILENAMEW ofnW = &lfs->ofnW; + PFD32_PRIVATE priv = (PFD32_PRIVATE) lfs->private1632; + HANDLE hDlgTmpl; + + if (ofnW->Flags & OFN_ENABLETEMPLATEHANDLE) + { + if (!(lfs->template = LockResource( ofnW->hInstance ))) + { + COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); + return FALSE; + } + } + else if (ofnW->Flags & OFN_ENABLETEMPLATE) + { + HRSRC hResInfo; + if (priv->ofnA) + hResInfo = FindResourceA(priv->ofnA->hInstance, + priv->ofnA->lpTemplateName, + (LPSTR)RT_DIALOG); + else + hResInfo = FindResourceW(ofnW->hInstance, + ofnW->lpTemplateName, + (LPWSTR)RT_DIALOG); + if (!hResInfo) + { + COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); + return FALSE; + } + if (!(hDlgTmpl = LoadResource(ofnW->hInstance, + hResInfo)) || + !(lfs->template = LockResource(hDlgTmpl))) + { + COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); + return FALSE; + } + } else { /* get it from internal Wine resource */ + HRSRC hResInfo; + if (!(hResInfo = FindResourceA(COMDLG32_hInstance, + lfs->open? "OPEN_FILE":"SAVE_FILE", (LPSTR)RT_DIALOG))) + { + COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); + return FALSE; + } + if (!(hDlgTmpl = LoadResource(COMDLG32_hInstance, hResInfo )) || + !(lfs->template = LockResource( hDlgTmpl ))) + { + COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); + return FALSE; + } + } + return TRUE; +} + + +/************************************************************************ + * FD32_Init [internal] + * called from the common 16/32 code to initialize 32 bit data + */ +static BOOL CALLBACK FD32_Init(LPARAM lParam, PFD31_DATA lfs, DWORD data) +{ + BOOL IsUnicode = (BOOL) data; + PFD32_PRIVATE priv; + + priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FD32_PRIVATE)); + lfs->private1632 = priv; + if (NULL == lfs->private1632) return FALSE; + if (IsUnicode) + { + lfs->ofnW = *((LPOPENFILENAMEW) lParam); + if (lfs->ofnW.Flags & OFN_ENABLEHOOK) + if (lfs->ofnW.lpfnHook) + lfs->hook = TRUE; + } + else + { + priv->ofnA = (LPOPENFILENAMEA) lParam; + if (priv->ofnA->Flags & OFN_ENABLEHOOK) + if (priv->ofnA->lpfnHook) + lfs->hook = TRUE; + FD31_MapOfnStructA(priv->ofnA, &lfs->ofnW, lfs->open); + } + + if (! FD32_GetTemplate(lfs)) return FALSE; + + return TRUE; +} + +/*********************************************************************** + * FD32_CallWindowProc [internal] + * + * called from the common 16/32 code to call the appropriate hook + */ +BOOL CALLBACK FD32_CallWindowProc(PFD31_DATA lfs, UINT wMsg, WPARAM wParam, + LPARAM lParam) +{ + PFD32_PRIVATE priv = (PFD32_PRIVATE) lfs->private1632; + + if (priv->ofnA) + { + return (BOOL) CallWindowProcA( + (WNDPROC)priv->ofnA->lpfnHook, lfs->hwnd, + wMsg, wParam, lParam); + } + + return (BOOL) CallWindowProcW( + (WNDPROC)lfs->ofnW.lpfnHook, lfs->hwnd, + wMsg, wParam, lParam); +} + +/*********************************************************************** + * FD32_UpdateResult [internal] + * update the real client structures if any + */ +static void CALLBACK FD32_UpdateResult(PFD31_DATA lfs) +{ + PFD32_PRIVATE priv = (PFD32_PRIVATE) lfs->private1632; + LPOPENFILENAMEW ofnW = &lfs->ofnW; + + if (priv->ofnA) + { + if (ofnW->nMaxFile && + !WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFile, -1, + priv->ofnA->lpstrFile, ofnW->nMaxFile, NULL, NULL )) + priv->ofnA->lpstrFile[ofnW->nMaxFile-1] = 0; + priv->ofnA->nFileOffset = ofnW->nFileOffset; + priv->ofnA->nFileExtension = ofnW->nFileExtension; + } +} + +/*********************************************************************** + * FD32_UpdateFileTitle [internal] + * update the real client structures if any + */ +static void CALLBACK FD32_UpdateFileTitle(PFD31_DATA lfs) +{ + PFD32_PRIVATE priv = (PFD32_PRIVATE) lfs->private1632; + LPOPENFILENAMEW ofnW = &lfs->ofnW; + + if (priv->ofnA) + { + if (!WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFileTitle, -1, + priv->ofnA->lpstrFileTitle, ofnW->nMaxFileTitle, NULL, NULL )) + priv->ofnA->lpstrFileTitle[ofnW->nMaxFileTitle-1] = 0; + } +} + + +/*********************************************************************** + * FD32_SendLbGetCurSel [internal] + * retrieve selected listbox item + */ +static LRESULT CALLBACK FD32_SendLbGetCurSel(PFD31_DATA lfs) +{ + return SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETCURSEL, 0, 0); +} + + +/************************************************************************ + * FD32_Destroy [internal] + * called from the common 16/32 code to cleanup 32 bit data + */ +static void CALLBACK FD32_Destroy(PFD31_DATA lfs) +{ + PFD32_PRIVATE priv = (PFD32_PRIVATE) lfs->private1632; + + /* if ofnW has been allocated, have to free everything in it */ + if (NULL != priv && NULL != priv->ofnA) + FD31_FreeOfnW(&lfs->ofnW); +} + +static void FD32_SetupCallbacks(PFD31_CALLBACKS callbacks) +{ + callbacks->Init = FD32_Init; + callbacks->CWP = FD32_CallWindowProc; + callbacks->UpdateResult = FD32_UpdateResult; + callbacks->UpdateFileTitle = FD32_UpdateFileTitle; + callbacks->SendLbGetCurSel = FD32_SendLbGetCurSel; + callbacks->Destroy = FD32_Destroy; +} + +/*********************************************************************** + * FD32_WMMeasureItem [internal] + */ +static LONG FD32_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + LPMEASUREITEMSTRUCT lpmeasure; + + lpmeasure = (LPMEASUREITEMSTRUCT)lParam; + lpmeasure->itemHeight = FD31_GetFldrHeight(); + return TRUE; +} + + +/*********************************************************************** + * FileOpenDlgProc [internal] + * Used for open and save, in fact. + */ +static INT_PTR CALLBACK FD32_FileOpenDlgProc(HWND hWnd, UINT wMsg, + WPARAM wParam, LPARAM lParam) +{ + PFD31_DATA lfs = (PFD31_DATA)GetPropA(hWnd,FD31_OFN_PROP); + + TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); + if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) + { + INT_PTR lRet; + lRet = (INT_PTR)FD31_CallWindowProc(lfs, wMsg, wParam, lParam); + if (lRet) + return lRet; /* else continue message processing */ + } + switch (wMsg) + { + case WM_INITDIALOG: + return FD31_WMInitDialog(hWnd, wParam, lParam); + + case WM_MEASUREITEM: + return FD32_WMMeasureItem(hWnd, wParam, lParam); + + case WM_DRAWITEM: + return FD31_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam); + + case WM_COMMAND: + return FD31_WMCommand(hWnd, lParam, HIWORD(wParam), LOWORD(wParam), lfs); +#if 0 + case WM_CTLCOLOR: + SetBkColor((HDC16)wParam, 0x00C0C0C0); + switch (HIWORD(lParam)) + { + case CTLCOLOR_BTN: + SetTextColor((HDC16)wParam, 0x00000000); + return hGRAYBrush; + case CTLCOLOR_STATIC: + SetTextColor((HDC16)wParam, 0x00000000); + return hGRAYBrush; + } + break; +#endif + } + return FALSE; +} + + +/*********************************************************************** + * GetFileName31A [internal] + * + * Creates a win31 style dialog box for the user to select a file to open/save. + */ +static BOOL GetFileName31A(LPOPENFILENAMEA lpofn, /* addess of structure with data*/ + UINT dlgType /* type dialogue : open/save */ + ) +{ + HINSTANCE hInst; + BOOL bRet = FALSE; + PFD31_DATA lfs; + FD31_CALLBACKS callbacks; + + if (!lpofn || !FD31_Init()) return FALSE; + + TRACE("ofn flags %08lx\n", lpofn->Flags); + FD32_SetupCallbacks(&callbacks); + lfs = FD31_AllocPrivate((LPARAM) lpofn, dlgType, &callbacks, (DWORD) FALSE); + if (lfs) + { + hInst = (HINSTANCE)GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE ); + bRet = DialogBoxIndirectParamA( hInst, lfs->template, lpofn->hwndOwner, + FD32_FileOpenDlgProc, (LPARAM)lfs); + FD31_DestroyPrivate(lfs); + } + + TRACE("return lpstrFile='%s' !\n", lpofn->lpstrFile); + return bRet; +} + +/*********************************************************************** + * GetFileName31W [internal] + * + * Creates a win31 style dialog box for the user to select a file to open/save + */ +static BOOL GetFileName31W(LPOPENFILENAMEW lpofn, /* addess of structure with data*/ + UINT dlgType /* type dialogue : open/save */ + ) +{ + HINSTANCE hInst; + BOOL bRet = FALSE; + PFD31_DATA lfs; + FD31_CALLBACKS callbacks; + + if (!lpofn || !FD31_Init()) return FALSE; + + FD32_SetupCallbacks(&callbacks); + lfs = FD31_AllocPrivate((LPARAM) lpofn, dlgType, &callbacks, (DWORD) FALSE); + if (lfs) + { + hInst = (HINSTANCE)GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE ); + bRet = DialogBoxIndirectParamW( hInst, lfs->template, lpofn->hwndOwner, + FD32_FileOpenDlgProc, (LPARAM)lfs); + FD31_DestroyPrivate(lfs); + } + + TRACE("return lpstrFile=%s !\n", debugstr_w(lpofn->lpstrFile)); + return bRet; +} + /* ------------------ APIs ---------------------- */ /*********************************************************************** @@ -3287,7 +3604,6 @@ static void MemFree(void *mem) BOOL WINAPI GetOpenFileNameA( LPOPENFILENAMEA ofn) /* [in/out] address of init structure */ { -#if 0 /* FIXME GetFileName31A uses 16 bit stuff */ BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) @@ -3296,7 +3612,6 @@ BOOL WINAPI GetOpenFileNameA( if (win16look) return GetFileName31A(ofn, OPEN_DIALOG); else -#endif return GetFileDialog95A(ofn, OPEN_DIALOG); } @@ -3313,7 +3628,6 @@ BOOL WINAPI GetOpenFileNameA( BOOL WINAPI GetOpenFileNameW( LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ { -#if 0 /* FIXME GetFileName31W uses 16 bit stuff */ BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) @@ -3322,7 +3636,6 @@ BOOL WINAPI GetOpenFileNameW( if (win16look) return GetFileName31W(ofn, OPEN_DIALOG); else -#endif return GetFileDialog95W(ofn, OPEN_DIALOG); } @@ -3340,7 +3653,6 @@ BOOL WINAPI GetOpenFileNameW( BOOL WINAPI GetSaveFileNameA( LPOPENFILENAMEA ofn) /* [in/out] address of init structure */ { -#if 0 /* FIXME GetFileName31A uses 16 bit stuff */ BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) @@ -3349,7 +3661,6 @@ BOOL WINAPI GetSaveFileNameA( if (win16look) return GetFileName31A(ofn, SAVE_DIALOG); else -#endif return GetFileDialog95A(ofn, SAVE_DIALOG); } @@ -3366,7 +3677,6 @@ BOOL WINAPI GetSaveFileNameA( BOOL WINAPI GetSaveFileNameW( LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ { -#if 0 /* FIXME GetFileName31W uses 16 bit stuff */ BOOL win16look = FALSE; if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) @@ -3375,6 +3685,5 @@ BOOL WINAPI GetSaveFileNameW( if (win16look) return GetFileName31W(ofn, SAVE_DIALOG); else -#endif return GetFileDialog95W(ofn, SAVE_DIALOG); } diff --git a/reactos/lib/comdlg32/filedlg16.c b/reactos/lib/comdlg32/filedlg16.c index 0227b8f11b9..acad211982b 100644 --- a/reactos/lib/comdlg32/filedlg16.c +++ b/reactos/lib/comdlg32/filedlg16.c @@ -18,174 +18,82 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include -#include #include -#include -#include #include "windef.h" #include "winbase.h" -#include "winnls.h" -#include "wingdi.h" -#include "winuser.h" #include "wine/winbase16.h" +#include "winuser.h" #include "wine/winuser16.h" -#include "wine/unicode.h" #include "wine/debug.h" #include "cderr.h" -#include "winreg.h" -#include "winternl.h" -#include "winuser.h" #include "commdlg.h" -#include "cderr.h" -#include "winreg.h" -#include "winternl.h" WINE_DEFAULT_DEBUG_CHANNEL(commdlg); #include "cdlg.h" #include "cdlg16.h" +#include "filedlg31.h" -#define BUFFILE 512 -#define BUFFILEALLOC 512 * sizeof(WCHAR) - -struct FSPRIVATE +typedef struct tagFD16_PRIVATE { - HWND hwnd; /* file dialog window handle */ - BOOL hook; /* TRUE if the dialog is hooked */ - UINT lbselchstring; /* registered message id */ - UINT fileokstring; /* registered message id */ - LPARAM lParam; /* save original lparam */ HANDLE16 hDlgTmpl16; /* handle for resource 16 */ HANDLE16 hResource16; /* handle for allocated resource 16 */ HANDLE16 hGlobal16; /* 16 bits mem block (resources) */ - LPCVOID template; /* template for 32 bits resource */ - BOOL open; /* TRUE if open dialog, FALSE if save dialog */ - OPENFILENAMEW *ofnW; /* original structure or work struct */ - OPENFILENAMEA *ofnA; /* original structure if 32bits ansi dialog */ OPENFILENAME16 *ofn16; /* original structure if 16 bits dialog */ -}; +} FD16_PRIVATE, *PFD16_PRIVATE; -#define LFSPRIVATE struct FSPRIVATE * -#define LFS16 1 -#define LFS32A 2 -#define LFS32W 3 -#define OFN_PROP "FILEDLG_OFN" - -static const WCHAR FILE_star[] = {'*','.','*', 0}; -static const WCHAR FILE_bslash[] = {'\\', 0}; -static const WCHAR FILE_specc[] = {'%','c',':', 0}; -static const int fldrHeight = 16; -static const int fldrWidth = 20; - -static HICON hFolder = 0; -static HICON hFolder2 = 0; -static HICON hFloppy = 0; -static HICON hHDisk = 0; -static HICON hCDRom = 0; -static HICON hNet = 0; - -/*********************************************************************** - * FileDlg_Init [internal] +/************************************************************************ + * FD16_MapOfnStruct16 [internal] + * map a 16 bits structure to an Unicode one */ -static BOOL FileDlg_Init(void) +void FD16_MapOfnStruct16(LPOPENFILENAME16 ofn16, LPOPENFILENAMEW ofnW, BOOL open) { - static BOOL initialized = 0; - - if (!initialized) { - hFolder = LoadImageA( COMDLG32_hInstance, "FOLDER", IMAGE_ICON, 16, 16, LR_SHARED ); - hFolder2 = LoadImageA( COMDLG32_hInstance, "FOLDER2", IMAGE_ICON, 16, 16, LR_SHARED ); - hFloppy = LoadImageA( COMDLG32_hInstance, "FLOPPY", IMAGE_ICON, 16, 16, LR_SHARED ); - hHDisk = LoadImageA( COMDLG32_hInstance, "HDISK", IMAGE_ICON, 16, 16, LR_SHARED ); - hCDRom = LoadImageA( COMDLG32_hInstance, "CDROM", IMAGE_ICON, 16, 16, LR_SHARED ); - hNet = LoadImageA( COMDLG32_hInstance, "NETWORK", IMAGE_ICON, 16, 16, LR_SHARED ); - if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 || - hHDisk == 0 || hCDRom == 0 || hNet == 0) - { - ERR("Error loading icons !\n"); - return FALSE; - } - initialized = TRUE; - } - return TRUE; + OPENFILENAMEA ofnA; + /* first convert to linear pointers */ + memset(&ofnA, 0, sizeof(OPENFILENAMEA)); + ofnA.lStructSize = sizeof(OPENFILENAMEA); + ofnA.hwndOwner = HWND_32(ofn16->hwndOwner); + ofnA.hInstance = HINSTANCE_32(ofn16->hInstance); + if (ofn16->lpstrFilter) + ofnA.lpstrFilter = MapSL(ofn16->lpstrFilter); + if (ofn16->lpstrCustomFilter) + ofnA.lpstrCustomFilter = MapSL(ofn16->lpstrCustomFilter); + ofnA.nMaxCustFilter = ofn16->nMaxCustFilter; + ofnA.nFilterIndex = ofn16->nFilterIndex; + ofnA.lpstrFile = MapSL(ofn16->lpstrFile); + ofnA.nMaxFile = ofn16->nMaxFile; + ofnA.lpstrFileTitle = MapSL(ofn16->lpstrFileTitle); + ofnA.nMaxFileTitle = ofn16->nMaxFileTitle; + ofnA.lpstrInitialDir = MapSL(ofn16->lpstrInitialDir); + ofnA.lpstrTitle = MapSL(ofn16->lpstrTitle); + ofnA.Flags = ofn16->Flags; + ofnA.nFileOffset = ofn16->nFileOffset; + ofnA.nFileExtension = ofn16->nFileExtension; + ofnA.lpstrDefExt = MapSL(ofn16->lpstrDefExt); + if (HIWORD(ofn16->lpTemplateName)) + ofnA.lpTemplateName = MapSL(ofn16->lpTemplateName); + else + ofnA.lpTemplateName = (LPSTR) ofn16->lpTemplateName; /* ressource number */ + /* now calls the 32 bits Ansi to Unicode version to complete the job */ + FD31_MapOfnStructA(&ofnA, ofnW, open); } /*********************************************************************** - * Get32BitsTemplate [internal] - * - * Get a template (or FALSE if failure) when 16 bits dialogs are used - * by a 32 bits application - * - */ -BOOL Get32BitsTemplate(LFSPRIVATE lfs) -{ - LPOPENFILENAMEW ofnW = lfs->ofnW; - HANDLE hDlgTmpl; - - if (ofnW->Flags & OFN_ENABLETEMPLATEHANDLE) - { - if (!(lfs->template = LockResource( ofnW->hInstance ))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - } - else if (ofnW->Flags & OFN_ENABLETEMPLATE) - { - HRSRC hResInfo; - if (lfs->ofnA) - hResInfo = FindResourceA(lfs->ofnA->hInstance, - lfs->ofnA->lpTemplateName, - (LPSTR)RT_DIALOG); - else - hResInfo = FindResourceW(ofnW->hInstance, - ofnW->lpTemplateName, - (LPWSTR)RT_DIALOG); - if (!hResInfo) - { - COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); - return FALSE; - } - if (!(hDlgTmpl = LoadResource(ofnW->hInstance, - hResInfo)) || - !(lfs->template = LockResource(hDlgTmpl))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - } else { /* get it from internal Wine resource */ - HRSRC hResInfo; - if (!(hResInfo = FindResourceA(COMDLG32_hInstance, - lfs->open? "OPEN_FILE":"SAVE_FILE", (LPSTR)RT_DIALOG))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); - return FALSE; - } - if (!(hDlgTmpl = LoadResource(COMDLG32_hInstance, hResInfo )) || - !(lfs->template = LockResource( hDlgTmpl ))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - } - return TRUE; -} - -/*********************************************************************** - * Get16BitsTemplate [internal] + * FD16_GetTemplate [internal] * * Get a template (FALSE if failure) when 16 bits dialogs are used * by a 16 bits application * */ -BOOL Get16BitsTemplate(LFSPRIVATE lfs) +BOOL FD16_GetTemplate(PFD31_DATA lfs) { - LPOPENFILENAME16 ofn16 = lfs->ofn16; + PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; + LPOPENFILENAME16 ofn16 = priv->ofn16; LPCVOID template; HGLOBAL16 hGlobal16 = 0; if (ofn16->Flags & OFN_ENABLETEMPLATEHANDLE) - lfs->hDlgTmpl16 = ofn16->hInstance; + priv->hDlgTmpl16 = ofn16->hInstance; else if (ofn16->Flags & OFN_ENABLETEMPLATE) { HANDLE16 hResInfo; @@ -196,12 +104,12 @@ BOOL Get16BitsTemplate(LFSPRIVATE lfs) COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); return FALSE; } - if (!(lfs->hDlgTmpl16 = LoadResource16( ofn16->hInstance, hResInfo ))) + if (!(priv->hDlgTmpl16 = LoadResource16( ofn16->hInstance, hResInfo ))) { COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); return FALSE; } - lfs->hResource16 = lfs->hDlgTmpl16; + priv->hResource16 = priv->hDlgTmpl16; } else { /* get resource from (32 bits) own Wine resource; convert it to 16 */ @@ -239,276 +147,69 @@ BOOL Get16BitsTemplate(LFSPRIVATE lfs) return FALSE; } ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template); - lfs->hDlgTmpl16 = hGlobal16; - lfs->hGlobal16 = hGlobal16; + priv->hDlgTmpl16 = hGlobal16; + priv->hGlobal16 = hGlobal16; } return TRUE; } -/*********************************************************************** - * FILEDLG_StripEditControl [internal] - * Strip pathnames off the contents of the edit control. +/************************************************************************ + * FD16_Init [internal] + * called from the common 16/32 code to initialize 16 bit data */ -static void FILEDLG_StripEditControl(HWND hwnd) +static BOOL CALLBACK FD16_Init(LPARAM lParam, PFD31_DATA lfs, DWORD data) { - WCHAR temp[BUFFILE], *cp; + PFD16_PRIVATE priv; - GetDlgItemTextW( hwnd, edt1, temp, sizeof(temp)/sizeof(WCHAR)); - cp = strrchrW(temp, '\\'); - if (cp != NULL) { - strcpyW(temp, cp+1); - } - cp = strrchrW(temp, ':'); - if (cp != NULL) { - strcpyW(temp, cp+1); - } - /* FIXME: shouldn't we do something with the result here? ;-) */ + priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FD16_PRIVATE)); + lfs->private1632 = priv; + if (NULL == lfs->private1632) return FALSE; + + priv->ofn16 = MapSL(lParam); + if (priv->ofn16->Flags & OFN_ENABLEHOOK) + if (priv->ofn16->lpfnHook) + lfs->hook = TRUE; + + FD16_MapOfnStruct16(priv->ofn16, &lfs->ofnW, lfs->open); + + if (! FD16_GetTemplate(lfs)) return FALSE; + + return TRUE; } /*********************************************************************** - * FILEDLG_CallWindowProc [internal] + * FD16_CallWindowProc [internal] * - * Call the appropriate hook + * called from the common 16/32 code to call the appropriate hook */ -static BOOL FILEDLG_CallWindowProc(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, - LPARAM lParam) +BOOL CALLBACK FD16_CallWindowProc(PFD31_DATA lfs, UINT wMsg, WPARAM wParam, + LPARAM lParam) { - if (lfs->ofnA) - { - return (BOOL) CallWindowProcA( - (WNDPROC)lfs->ofnA->lpfnHook, lfs->hwnd, - wMsg, wParam, lParam); - } + PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - if (lfs->ofnW) + if (priv->ofn16) { - return (BOOL) CallWindowProcW( - (WNDPROC)lfs->ofnW->lpfnHook, lfs->hwnd, - wMsg, wParam, lParam); + return (BOOL16) CallWindowProc16( + (WNDPROC16)priv->ofn16->lpfnHook, HWND_16(lfs->hwnd), + (UINT16)wMsg, (WPARAM16)wParam, lParam); } return FALSE; } -/*********************************************************************** - * FILEDLG_ScanDir [internal] - */ -static BOOL FILEDLG_ScanDir(HWND hWnd, LPWSTR newPath) -{ - WCHAR buffer[BUFFILE]; - HWND hdlg, hdlgDir; - LRESULT lRet = TRUE; - HCURSOR hCursorWait, oldCursor; - - TRACE("Trying to change to %s\n", debugstr_w(newPath)); - if ( newPath[0] && !SetCurrentDirectoryW( newPath )) - return FALSE; - lstrcpynW(buffer, newPath, sizeof(buffer)/sizeof(WCHAR)); - - /* get the list of spec files */ - GetDlgItemTextW(hWnd, edt1, buffer, sizeof(buffer)/sizeof(WCHAR)); - - hCursorWait = LoadCursorA(0, (LPSTR)IDC_WAIT); - oldCursor = SetCursor(hCursorWait); - - /* list of files */ - if ((hdlg = GetDlgItem(hWnd, lst1)) != 0) { - WCHAR* scptr; /* ptr on semi-colon */ - WCHAR* filter = buffer; - - TRACE("Using filter %s\n", debugstr_w(filter)); - SendMessageW(hdlg, LB_RESETCONTENT, 0, 0); - while (filter) { - scptr = strchrW(filter, ';'); - if (scptr) *scptr = 0; - while (*filter == ' ') filter++; - TRACE("Using file spec %s\n", debugstr_w(filter)); - if (SendMessageW(hdlg, LB_DIR, 0, (LPARAM)filter) == LB_ERR) - return FALSE; - if (scptr) *scptr = ';'; - filter = (scptr) ? (scptr + 1) : 0; - } - } - - /* list of directories */ - strcpyW(buffer, FILE_star); - - if ((hdlgDir = GetDlgItem(hWnd, lst2)) != 0) { - lRet = DlgDirListW(hWnd, buffer, lst2, stc1, DDL_EXCLUSIVE | DDL_DIRECTORY); - } - SetCursor(oldCursor); - return lRet; -} /*********************************************************************** - * FILEDLG_GetFileType [internal] + * FD31_UpdateResult [internal] + * update the real client structures */ - -static LPWSTR FILEDLG_GetFileType(LPWSTR cfptr, LPWSTR fptr, WORD index) +static void CALLBACK FD16_UpdateResult(PFD31_DATA lfs) { - int n, i; - i = 0; - if (cfptr) - for ( ;(n = lstrlenW(cfptr)) != 0; i++) - { - cfptr += n + 1; - if (i == index) - return cfptr; - cfptr += lstrlenW(cfptr) + 1; - } - if (fptr) - for ( ;(n = lstrlenW(fptr)) != 0; i++) - { - fptr += n + 1; - if (i == index) - return fptr; - fptr += lstrlenW(fptr) + 1; - } - return (LPWSTR) FILE_star; /* FIXME */ -} + PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; + LPOPENFILENAMEW ofnW = &lfs->ofnW; -/*********************************************************************** - * FILEDLG_WMDrawItem [internal] - */ -static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam, - int savedlg, LPDRAWITEMSTRUCT lpdis) -{ - WCHAR *str; - HICON hIcon; - COLORREF oldText = 0, oldBk = 0; - - if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1) - { - if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) return FALSE; - SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, - (LPARAM)str); - - if ((lpdis->itemState & ODS_SELECTED) && !savedlg) - { - oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) ); - oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); - } - if (savedlg) - SetTextColor(lpdis->hDC,GetSysColor(COLOR_GRAYTEXT) ); - - ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + 1, - lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED, - &(lpdis->rcItem), str, lstrlenW(str), NULL); - - if (lpdis->itemState & ODS_SELECTED) - DrawFocusRect( lpdis->hDC, &(lpdis->rcItem) ); - - if ((lpdis->itemState & ODS_SELECTED) && !savedlg) - { - SetBkColor( lpdis->hDC, oldBk ); - SetTextColor( lpdis->hDC, oldText ); - } - HeapFree(GetProcessHeap(), 0, str); - return TRUE; - } - - if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2) - { - if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) - return FALSE; - SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, - (LPARAM)str); - - if (lpdis->itemState & ODS_SELECTED) - { - oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) ); - oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); - } - ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + fldrWidth, - lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED, - &(lpdis->rcItem), str, lstrlenW(str), NULL); - - if (lpdis->itemState & ODS_SELECTED) - DrawFocusRect( lpdis->hDC, &(lpdis->rcItem) ); - - if (lpdis->itemState & ODS_SELECTED) - { - SetBkColor( lpdis->hDC, oldBk ); - SetTextColor( lpdis->hDC, oldText ); - } - DrawIcon(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hFolder); - HeapFree(GetProcessHeap(), 0, str); - return TRUE; - } - if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2) - { - char root[] = "a:"; - if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) - return FALSE; - SendMessageW(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID, - (LPARAM)str); - root[0] += str[2] - 'a'; - switch(GetDriveTypeA(root)) - { - case DRIVE_REMOVABLE: hIcon = hFloppy; break; - case DRIVE_CDROM: hIcon = hCDRom; break; - case DRIVE_REMOTE: hIcon = hNet; break; - case DRIVE_FIXED: - default: hIcon = hHDisk; break; - } - if (lpdis->itemState & ODS_SELECTED) - { - oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) ); - oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); - } - ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + fldrWidth, - lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED, - &(lpdis->rcItem), str, lstrlenW(str), NULL); - - if (lpdis->itemState & ODS_SELECTED) - { - SetBkColor( lpdis->hDC, oldBk ); - SetTextColor( lpdis->hDC, oldText ); - } - DrawIcon(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hIcon); - HeapFree(GetProcessHeap(), 0, str); - return TRUE; - } - return FALSE; -} - -/*********************************************************************** - * FILEDLG_UpdateResult [internal] - * update the displayed file name (with path) - */ -void FILEDLG_UpdateResult(LFSPRIVATE lfs, WCHAR *tmpstr) -{ - int lenstr2; - LPOPENFILENAMEW ofnW = lfs->ofnW; - WCHAR tmpstr2[BUFFILE]; - WCHAR *bs; - - TRACE("%s\n", debugstr_w(tmpstr)); - if(ofnW->Flags & OFN_NOVALIDATE) - tmpstr2[0] = '\0'; - else - GetCurrentDirectoryW(BUFFILE, tmpstr2); - lenstr2 = strlenW(tmpstr2); - if (lenstr2 > 3) - tmpstr2[lenstr2++]='\\'; - lstrcpynW(tmpstr2+lenstr2, tmpstr, BUFFILE-lenstr2); - if (ofnW->lpstrFile) - lstrcpynW(ofnW->lpstrFile, tmpstr2, ofnW->nMaxFile); - if((bs = strrchrW(tmpstr2, '\\')) != NULL) - ofnW->nFileOffset = bs - tmpstr2 +1; - else - ofnW->nFileOffset = 0; - ofnW->nFileExtension = 0; - while(tmpstr2[ofnW->nFileExtension] != '.' && tmpstr2[ofnW->nFileExtension] != '\0') - ofnW->nFileExtension++; - if (tmpstr2[ofnW->nFileExtension] == '\0') - ofnW->nFileExtension = 0; - else - ofnW->nFileExtension++; - /* update the real client structures if any */ - if (lfs->ofn16) + if (priv->ofn16) { /* we have to convert to short (8.3) path */ char tmp[1024]; /* MAX_PATHNAME_LEN */ - LPOPENFILENAME16 ofn16 = lfs->ofn16; + LPOPENFILENAME16 ofn16 = priv->ofn16; char *dest = MapSL(ofn16->lpstrFile); char *bs16; if (!WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFile, -1, @@ -529,359 +230,74 @@ void FILEDLG_UpdateResult(LFSPRIVATE lfs, WCHAR *tmpstr) else ofn16->nFileExtension++; } - if (lfs->ofnA) - { - if (ofnW->nMaxFile && - !WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFile, -1, - lfs->ofnA->lpstrFile, ofnW->nMaxFile, NULL, NULL )) - lfs->ofnA->lpstrFile[ofnW->nMaxFile-1] = 0; - lfs->ofnA->nFileOffset = ofnW->nFileOffset; - lfs->ofnA->nFileExtension = ofnW->nFileExtension; - } } + /*********************************************************************** - * FILEDLG_UpdateFileTitle [internal] - * update the displayed file name (without path) + * FD16_UpdateFileTitle [internal] + * update the real client structures */ -void FILEDLG_UpdateFileTitle(LFSPRIVATE lfs) +static void CALLBACK FD16_UpdateFileTitle(PFD31_DATA lfs) { - LONG lRet; - LPOPENFILENAMEW ofnW = lfs->ofnW; - if (ofnW->lpstrFileTitle != NULL) - { - lRet = SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETCURSEL, 0, 0); - SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETTEXT, lRet, - (LPARAM)ofnW->lpstrFileTitle ); - if (lfs->ofn16) + PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; + LPOPENFILENAMEW ofnW = &lfs->ofnW; + + if (priv->ofn16) { - char *dest = MapSL(lfs->ofn16->lpstrFileTitle); + char *dest = MapSL(priv->ofn16->lpstrFileTitle); if (!WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFileTitle, -1, dest, ofnW->nMaxFileTitle, NULL, NULL )) dest[ofnW->nMaxFileTitle-1] = 0; } - if (lfs->ofnA) - { - if (!WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFileTitle, -1, - lfs->ofnA->lpstrFileTitle, ofnW->nMaxFileTitle, NULL, NULL )) - lfs->ofnA->lpstrFileTitle[ofnW->nMaxFileTitle-1] = 0; - } - } } + /*********************************************************************** - * FILEDLG_DirListDblClick [internal] + * FD16_SendLbGetCurSel [internal] + * retrieve selected listbox item */ -static LRESULT FILEDLG_DirListDblClick( LFSPRIVATE lfs ) +static LRESULT CALLBACK FD16_SendLbGetCurSel(PFD31_DATA lfs) { - LONG lRet; - HWND hWnd = lfs->hwnd; - LPWSTR pstr; - WCHAR tmpstr[BUFFILE]; - - /* get the raw string (with brackets) */ - lRet = SendDlgItemMessageW(hWnd, lst2, LB_GETCURSEL, 0, 0); - if (lRet == LB_ERR) return TRUE; - pstr = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC); - SendDlgItemMessageW(hWnd, lst2, LB_GETTEXT, lRet, - (LPARAM)pstr); - strcpyW( tmpstr, pstr ); - HeapFree(GetProcessHeap(), 0, pstr); - /* get the selected directory in tmpstr */ - if (tmpstr[0] == '[') - { - tmpstr[lstrlenW(tmpstr) - 1] = 0; - strcpyW(tmpstr,tmpstr+1); - } - strcatW(tmpstr, FILE_bslash); - - FILEDLG_ScanDir(hWnd, tmpstr); - /* notify the app */ - if (lfs->hook) - { - if (FILEDLG_CallWindowProc(lfs, lfs->lbselchstring, lst2, - MAKELONG(lRet,CD_LBSELCHANGE))) - return TRUE; - } - return TRUE; + return SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETCURSEL16, 0, 0); } -/*********************************************************************** - * FILEDLG_FileListSelect [internal] - * called when a new item is picked in the file list + +/************************************************************************ + * FD16_Destroy [internal] + * called from the common 16/32 code to cleanup 32 bit data */ -static LRESULT FILEDLG_FileListSelect( LFSPRIVATE lfs ) +static void CALLBACK FD16_Destroy(PFD31_DATA lfs) { - LONG lRet; - HWND hWnd = lfs->hwnd; - LPWSTR pstr; + PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - lRet = SendDlgItemMessageW(hWnd, lst1, LB_GETCURSEL16, 0, 0); - if (lRet == LB_ERR) - return TRUE; - - /* set the edit control to the choosen file */ - if ((pstr = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) + /* free resources for a 16 bits dialog */ + if (NULL != priv) { - SendDlgItemMessageW(hWnd, lst1, LB_GETTEXT, lRet, - (LPARAM)pstr); - SetDlgItemTextW( hWnd, edt1, pstr ); - HeapFree(GetProcessHeap(), 0, pstr); - } - if (lfs->hook) - { - FILEDLG_CallWindowProc(lfs, lfs->lbselchstring, lst1, - MAKELONG(lRet,CD_LBSELCHANGE)); - } - /* FIXME: for OFN_ALLOWMULTISELECT we need CD_LBSELSUB, CD_SELADD, - CD_LBSELNOITEMS */ - return TRUE; -} - -/*********************************************************************** - * FILEDLG_TestPath [internal] - * before accepting the file name, test if it includes wild cards - * tries to scan the directory and returns TRUE if no error. - */ -static LRESULT FILEDLG_TestPath( LFSPRIVATE lfs, LPWSTR path ) -{ - HWND hWnd = lfs->hwnd; - LPWSTR pBeginFileName, pstr2; - WCHAR tmpstr2[BUFFILE]; - - pBeginFileName = strrchrW(path, '\\'); - if (pBeginFileName == NULL) - pBeginFileName = strrchrW(path, ':'); - - if (strchrW(path,'*') != NULL || strchrW(path,'?') != NULL) - { - /* edit control contains wildcards */ - if (pBeginFileName != NULL) + if (priv->hResource16) FreeResource16(priv->hResource16); + if (priv->hGlobal16) { - lstrcpynW(tmpstr2, pBeginFileName + 1, BUFFILE); - *(pBeginFileName + 1) = 0; - } - else - { - strcpyW(tmpstr2, path); - if(!(lfs->ofnW->Flags & OFN_NOVALIDATE)) - *path = 0; + GlobalUnlock16(priv->hGlobal16); + GlobalFree16(priv->hGlobal16); } - - TRACE("path=%s, tmpstr2=%s\n", debugstr_w(path), debugstr_w(tmpstr2)); - SetDlgItemTextW( hWnd, edt1, tmpstr2 ); - FILEDLG_ScanDir(hWnd, path); - return (lfs->ofnW->Flags & OFN_NOVALIDATE) ? TRUE : FALSE; + FD31_FreeOfnW(&lfs->ofnW); } - - /* no wildcards, we might have a directory or a filename */ - /* try appending a wildcard and reading the directory */ - - pstr2 = path + lstrlenW(path); - if (pBeginFileName == NULL || *(pBeginFileName + 1) != 0) - strcatW(path, FILE_bslash); - - /* if ScanDir succeeds, we have changed the directory */ - if (FILEDLG_ScanDir(hWnd, path)) - return FALSE; /* and path is not a valid file name */ - - /* if not, this must be a filename */ - - *pstr2 = 0; /* remove the wildcard added before */ - - if (pBeginFileName != NULL) - { - /* strip off the pathname */ - *pBeginFileName = 0; - SetDlgItemTextW( hWnd, edt1, pBeginFileName + 1 ); - - lstrcpynW(tmpstr2, pBeginFileName + 1, sizeof(tmpstr2)/sizeof(WCHAR) ); - /* Should we MessageBox() if this fails? */ - if (!FILEDLG_ScanDir(hWnd, path)) - { - return FALSE; - } - strcpyW(path, tmpstr2); - } - else - SetDlgItemTextW( hWnd, edt1, path ); - return TRUE; } -/*********************************************************************** - * FILEDLG_Validate [internal] - * called on: click Ok button, Enter in edit, DoubleClick in file list - */ -static LRESULT FILEDLG_Validate( LFSPRIVATE lfs, LPWSTR path, UINT control, INT itemIndex, - BOOL internalUse ) +static void FD16_SetupCallbacks(PFD31_CALLBACKS callbacks) { - LONG lRet; - HWND hWnd = lfs->hwnd; - OPENFILENAMEW ofnsav; - LPOPENFILENAMEW ofnW = lfs->ofnW; - WCHAR filename[BUFFILE]; - - ofnsav = *ofnW; /* for later restoring */ - - /* get current file name */ - if (path) - lstrcpynW(filename, path, sizeof(filename)/sizeof(WCHAR)); - else - GetDlgItemTextW( hWnd, edt1, filename, sizeof(filename)/sizeof(WCHAR)); - - TRACE("got filename = %s\n", debugstr_w(filename)); - /* if we did not click in file list to get there */ - if (control != lst1) - { - if (!FILEDLG_TestPath( lfs, filename) ) - return FALSE; - } - FILEDLG_UpdateResult(lfs, filename); - - if (internalUse) - { /* called internally after a change in a combo */ - if (lfs->hook) - { - FILEDLG_CallWindowProc(lfs, lfs->lbselchstring, control, - MAKELONG(itemIndex,CD_LBSELCHANGE)); - } - return TRUE; - } - - FILEDLG_UpdateFileTitle(lfs); - if (lfs->hook) - { - lRet = (BOOL)FILEDLG_CallWindowProc(lfs, lfs->fileokstring, - 0, lfs->lParam ); - if (lRet) - { - *ofnW = ofnsav; /* restore old state */ - return FALSE; - } - } - if ((ofnW->Flags & OFN_ALLOWMULTISELECT) && (ofnW->Flags & OFN_EXPLORER)) - { - if (ofnW->lpstrFile) - { - LPWSTR str = (LPWSTR)ofnW->lpstrFile; - LPWSTR ptr = strrchrW(str, '\\'); - str[lstrlenW(str) + 1] = '\0'; - *ptr = 0; - } - } - return TRUE; + callbacks->Init = FD16_Init; + callbacks->CWP = FD16_CallWindowProc; + callbacks->UpdateResult = FD16_UpdateResult; + callbacks->UpdateFileTitle = FD16_UpdateFileTitle; + callbacks->SendLbGetCurSel = FD16_SendLbGetCurSel; + callbacks->Destroy = FD16_Destroy; } /*********************************************************************** - * FILEDLG_DiskChange [internal] - * called when a new item is picked in the disk selection combo - */ -static LRESULT FILEDLG_DiskChange( LFSPRIVATE lfs ) -{ - LONG lRet; - HWND hWnd = lfs->hwnd; - LPWSTR pstr; - WCHAR diskname[BUFFILE]; - - FILEDLG_StripEditControl(hWnd); - lRet = SendDlgItemMessageW(hWnd, cmb2, CB_GETCURSEL, 0, 0L); - if (lRet == LB_ERR) - return 0; - pstr = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC); - SendDlgItemMessageW(hWnd, cmb2, CB_GETLBTEXT, lRet, - (LPARAM)pstr); - wsprintfW(diskname, FILE_specc, pstr[2]); - HeapFree(GetProcessHeap(), 0, pstr); - - return FILEDLG_Validate( lfs, diskname, cmb2, lRet, TRUE ); -} - -/*********************************************************************** - * FILEDLG_FileTypeChange [internal] - * called when a new item is picked in the file type combo - */ -static LRESULT FILEDLG_FileTypeChange( LFSPRIVATE lfs ) -{ - LONG lRet; - WCHAR diskname[BUFFILE]; - LPWSTR pstr; - - diskname[0] = 0; - - lRet = SendDlgItemMessageW(lfs->hwnd, cmb1, CB_GETCURSEL, 0, 0); - if (lRet == LB_ERR) - return TRUE; - pstr = (LPWSTR)SendDlgItemMessageW(lfs->hwnd, cmb1, CB_GETITEMDATA, lRet, 0); - TRACE("Selected filter : %s\n", debugstr_w(pstr)); - SetDlgItemTextW( lfs->hwnd, edt1, pstr ); - - return FILEDLG_Validate( lfs, NULL, cmb1, lRet, TRUE ); -} - -/*********************************************************************** - * FILEDLG_WMCommand [internal] - */ -static LRESULT FILEDLG_WMCommand(HWND hWnd, LPARAM lParam, UINT notification, - UINT control, LFSPRIVATE lfs ) -{ - switch (control) - { - case lst1: /* file list */ - FILEDLG_StripEditControl(hWnd); - if (notification == LBN_DBLCLK) - { - if (FILEDLG_Validate( lfs, NULL, control, 0, FALSE )) - EndDialog(hWnd, TRUE); - return TRUE; - } - else if (notification == LBN_SELCHANGE) - return FILEDLG_FileListSelect( lfs ); - break; - - case lst2: /* directory list */ - FILEDLG_StripEditControl(hWnd); - if (notification == LBN_DBLCLK) - return FILEDLG_DirListDblClick( lfs ); - break; - - case cmb1: /* file type drop list */ - if (notification == CBN_SELCHANGE) - return FILEDLG_FileTypeChange( lfs ); - break; - - case chx1: - break; - - case pshHelp: - break; - - case cmb2: /* disk dropdown combo */ - if (notification == CBN_SELCHANGE) - return FILEDLG_DiskChange( lfs ); - break; - - case IDOK: - TRACE("OK pressed\n"); - if (FILEDLG_Validate( lfs, NULL, control, 0, FALSE )) - EndDialog(hWnd, TRUE); - return TRUE; - - case IDCANCEL: - EndDialog(hWnd, FALSE); - return TRUE; - - case IDABORT: /* can be sent by the hook procedure */ - EndDialog(hWnd, TRUE); - return TRUE; - } - return FALSE; -} - -/*********************************************************************** - * FILEDLG_MapDrawItemStruct [internal] + * FD16_MapDrawItemStruct [internal] * map a 16 bits drawitem struct to 32 */ -static void FILEDLG_MapDrawItemStruct(LPDRAWITEMSTRUCT16 lpdis16, LPDRAWITEMSTRUCT lpdis) +static void FD16_MapDrawItemStruct(LPDRAWITEMSTRUCT16 lpdis16, LPDRAWITEMSTRUCT lpdis) { lpdis->CtlType = lpdis16->CtlType; lpdis->CtlID = lpdis16->CtlID; @@ -897,593 +313,51 @@ static void FILEDLG_MapDrawItemStruct(LPDRAWITEMSTRUCT16 lpdis16, LPDRAWITEMSTRU lpdis->itemData = lpdis16->itemData; } -/************************************************************************ - * FILEDLG_MapStringPairsToW [internal] - * map string pairs to Unicode - */ -static LPWSTR FILEDLG_MapStringPairsToW(LPCSTR strA, UINT size) -{ - LPCSTR s; - LPWSTR x; - int n, len; - - s = strA; - while (*s) - s = s+strlen(s)+1; - s++; - n = s + 1 - strA; /* Don't forget the other \0 */ - if (n < size) n = size; - - len = MultiByteToWideChar( CP_ACP, 0, strA, n, NULL, 0 ); - x = HeapAlloc(GetProcessHeap(),0, len * sizeof(WCHAR)); - MultiByteToWideChar( CP_ACP, 0, strA, n, x, len ); - return x; -} - - -/************************************************************************ - * FILEDLG_DupToW [internal] - * duplicates an Ansi string to unicode, with a buffer size - */ -LPWSTR FILEDLG_DupToW(LPCSTR str, DWORD size) -{ - LPWSTR strW = NULL; - if (str && (size > 0)) - { - strW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); - if (strW) MultiByteToWideChar( CP_ACP, 0, str, -1, strW, size ); - } - return strW; -} - - -/************************************************************************ - * FILEDLG_MapOfnStructA [internal] - * map a 32 bits Ansi structure to an Unicode one - */ -void FILEDLG_MapOfnStructA(LPOPENFILENAMEA ofnA, LPOPENFILENAMEW ofnW, BOOL open) -{ - LPCSTR str; - UNICODE_STRING usBuffer; - - ofnW->lStructSize = sizeof(OPENFILENAMEW); - ofnW->hwndOwner = ofnA->hwndOwner; - ofnW->hInstance = ofnA->hInstance; - if (ofnA->lpstrFilter) - ofnW->lpstrFilter = FILEDLG_MapStringPairsToW(ofnA->lpstrFilter, 0); - - if ((ofnA->lpstrCustomFilter) && (*(ofnA->lpstrCustomFilter))) - ofnW->lpstrCustomFilter = FILEDLG_MapStringPairsToW(ofnA->lpstrCustomFilter, ofnA->nMaxCustFilter); - ofnW->nMaxCustFilter = ofnA->nMaxCustFilter; - ofnW->nFilterIndex = ofnA->nFilterIndex; - ofnW->nMaxFile = ofnA->nMaxFile; - ofnW->lpstrFile = FILEDLG_DupToW(ofnA->lpstrFile, ofnW->nMaxFile); - ofnW->nMaxFileTitle = ofnA->nMaxFileTitle; - ofnW->lpstrFileTitle = FILEDLG_DupToW(ofnA->lpstrFileTitle, ofnW->nMaxFileTitle); - if (ofnA->lpstrInitialDir) - { - RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpstrInitialDir); - ofnW->lpstrInitialDir = usBuffer.Buffer; - } - if (ofnA->lpstrTitle) - str = ofnA->lpstrTitle; - else - /* Allocates default title (FIXME : get it from resource) */ - str = open ? "Open File" : "Save as"; - RtlCreateUnicodeStringFromAsciiz (&usBuffer,str); - ofnW->lpstrTitle = usBuffer.Buffer; - ofnW->Flags = ofnA->Flags; - ofnW->nFileOffset = ofnA->nFileOffset; - ofnW->nFileExtension = ofnA->nFileExtension; - ofnW->lpstrDefExt = FILEDLG_DupToW(ofnA->lpstrDefExt, 3); - if ((ofnA->Flags & OFN_ENABLETEMPLATE) && (ofnA->lpTemplateName)) - { - if (HIWORD(ofnA->lpTemplateName)) - { - RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpTemplateName); - ofnW->lpTemplateName = usBuffer.Buffer; - } - else /* numbered resource */ - ofnW->lpTemplateName = (LPWSTR) ofnA->lpTemplateName; - } -} - -/************************************************************************ - * FILEDLG_MapOfnStruct16 [internal] - * map a 16 bits structure to an Unicode one - */ -void FILEDLG_MapOfnStruct16(LPOPENFILENAME16 ofn16, LPOPENFILENAMEW ofnW, BOOL open) -{ - OPENFILENAMEA ofnA; - /* first convert to linear pointers */ - memset(&ofnA, 0, sizeof(OPENFILENAMEA)); - ofnA.lStructSize = sizeof(OPENFILENAMEA); - ofnA.hwndOwner = HWND_32(ofn16->hwndOwner); - ofnA.hInstance = HINSTANCE_32(ofn16->hInstance); - if (ofn16->lpstrFilter) - ofnA.lpstrFilter = MapSL(ofn16->lpstrFilter); - if (ofn16->lpstrCustomFilter) - ofnA.lpstrCustomFilter = MapSL(ofn16->lpstrCustomFilter); - ofnA.nMaxCustFilter = ofn16->nMaxCustFilter; - ofnA.nFilterIndex = ofn16->nFilterIndex; - ofnA.lpstrFile = MapSL(ofn16->lpstrFile); - ofnA.nMaxFile = ofn16->nMaxFile; - ofnA.lpstrFileTitle = MapSL(ofn16->lpstrFileTitle); - ofnA.nMaxFileTitle = ofn16->nMaxFileTitle; - ofnA.lpstrInitialDir = MapSL(ofn16->lpstrInitialDir); - ofnA.lpstrTitle = MapSL(ofn16->lpstrTitle); - ofnA.Flags = ofn16->Flags; - ofnA.nFileOffset = ofn16->nFileOffset; - ofnA.nFileExtension = ofn16->nFileExtension; - ofnA.lpstrDefExt = MapSL(ofn16->lpstrDefExt); - if (HIWORD(ofn16->lpTemplateName)) - ofnA.lpTemplateName = MapSL(ofn16->lpTemplateName); - else - ofnA.lpTemplateName = (LPSTR) ofn16->lpTemplateName; /* ressource number */ - /* now calls the 32 bits Ansi to Unicode version to complete the job */ - FILEDLG_MapOfnStructA(&ofnA, ofnW, open); -} - -/************************************************************************ - * FILEDLG_DestroyPrivate [internal] - * destroys the private object - */ -static void FILEDLG_DestroyPrivate(LFSPRIVATE lfs) -{ - HWND hwnd; - if (!lfs) return; - hwnd = lfs->hwnd; - /* free resources for a 16 bits dialog */ - if (lfs->hResource16) FreeResource16(lfs->hResource16); - if (lfs->hGlobal16) - { - GlobalUnlock16(lfs->hGlobal16); - GlobalFree16(lfs->hGlobal16); - } - /* if ofnW has been allocated, have to free everything in it */ - if (lfs->ofn16 || lfs->ofnA) - { - LPOPENFILENAMEW ofnW = lfs->ofnW; - if (ofnW->lpstrFilter) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrFilter); - if (ofnW->lpstrCustomFilter) HeapFree(GetProcessHeap(), 0, ofnW->lpstrCustomFilter); - if (ofnW->lpstrFile) HeapFree(GetProcessHeap(), 0, ofnW->lpstrFile); - if (ofnW->lpstrFileTitle) HeapFree(GetProcessHeap(), 0, ofnW->lpstrFileTitle); - if (ofnW->lpstrInitialDir) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrInitialDir); - if (ofnW->lpstrTitle) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrTitle); - if ((ofnW->lpTemplateName) && (HIWORD(ofnW->lpTemplateName))) - HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpTemplateName); - HeapFree(GetProcessHeap(), 0, ofnW); - } - TRACE("destroying private allocation %p\n", lfs); - HeapFree(GetProcessHeap(), 0, lfs); - RemovePropA(hwnd, OFN_PROP); -} - -/************************************************************************ - * FILEDLG_AllocPrivate [internal] - * allocate a private object to hold 32 bits Unicode - * structure that will be used throughtout the calls, while - * keeping available the original structures and a few variables - * On entry : type = dialog procedure type (16,32A,32W) - * dlgType = dialog type (open or save) - */ -static LFSPRIVATE FILEDLG_AllocPrivate(LPARAM lParam, int type, UINT dlgType) -{ - LFSPRIVATE lfs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct FSPRIVATE)); - LFSPRIVATE ret; - TRACE("alloc private buf %p\n", lfs); - if (!lfs) return NULL; - lfs->hook = FALSE; - lfs->lParam = lParam; - if (dlgType == OPEN_DIALOG) - lfs->open = TRUE; - else - lfs->open = FALSE; - lfs->lbselchstring = RegisterWindowMessageA(LBSELCHSTRINGA); - lfs->fileokstring = RegisterWindowMessageA(FILEOKSTRINGA); - switch(type) - { - case LFS16: - lfs->ofn16 = MapSL(lParam); - if (lfs->ofn16->Flags & OFN_ENABLEHOOK) - if (lfs->ofn16->lpfnHook) - lfs->hook = TRUE; - - break; - - case LFS32A: - lfs->ofnA = (LPOPENFILENAMEA) lParam; - if (lfs->ofnA->Flags & OFN_ENABLEHOOK) - if (lfs->ofnA->lpfnHook) - lfs->hook = TRUE; - break; - - case LFS32W: - lfs->ofnW = (LPOPENFILENAMEW) lParam; - if (lfs->ofnW->Flags & OFN_ENABLEHOOK) - if (lfs->ofnW->lpfnHook) - lfs->hook = TRUE; - break; - } - ret = lfs; - if (!lfs->ofnW) - { /* this structure is needed internally, so create it */ - lfs->ofnW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OPENFILENAMEW)); - if (lfs->ofnW) - { - if (lfs->ofn16) - FILEDLG_MapOfnStruct16(lfs->ofn16, lfs->ofnW, lfs->open); - if (lfs->ofnA) - FILEDLG_MapOfnStructA(lfs->ofnA, lfs->ofnW, lfs->open); - } - else - ret = NULL; - } - if (lfs->ofn16) - { - if (!Get16BitsTemplate(lfs)) ret = NULL; - } - else - if (!Get32BitsTemplate(lfs)) ret = NULL; - if (!ret) FILEDLG_DestroyPrivate(lfs); - return ret; -} /*********************************************************************** - * FILEDLG_CallWindowProc16 [internal] - * - * Call the appropriate hook + * FD16_WMMeasureItem16 [internal] */ -static BOOL FILEDLG_CallWindowProc16(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam, - LPARAM lParam) -{ - if (lfs->ofn16) - { - return (BOOL16) CallWindowProc16( - (WNDPROC16)lfs->ofn16->lpfnHook, HWND_16(lfs->hwnd), - (UINT16)wMsg, (WPARAM16)wParam, lParam); - } - return FALSE; -} - -/*********************************************************************** - * FILEDLG_WMInitDialog [internal] - */ - -static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - int i, n; - WCHAR tmpstr[BUFFILE]; - LPWSTR pstr, old_pstr; - LPOPENFILENAMEW ofn; - LFSPRIVATE lfs = (LFSPRIVATE) lParam; - - if (!lfs) return FALSE; - SetPropA(hWnd, OFN_PROP, (HANDLE)lfs); - lfs->hwnd = hWnd; - ofn = lfs->ofnW; - - TRACE("flags=%lx initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir)); - - SetWindowTextW( hWnd, ofn->lpstrTitle ); - /* read custom filter information */ - if (ofn->lpstrCustomFilter) - { - pstr = ofn->lpstrCustomFilter; - n = 0; - TRACE("lpstrCustomFilter = %p\n", pstr); - while(*pstr) - { - old_pstr = pstr; - i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, - (LPARAM)(ofn->lpstrCustomFilter) + n ); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - TRACE("add str=%s associated to %s\n", - debugstr_w(old_pstr), debugstr_w(pstr)); - SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - } - } - /* read filter information */ - if (ofn->lpstrFilter) { - pstr = (LPWSTR) ofn->lpstrFilter; - n = 0; - while(*pstr) { - old_pstr = pstr; - i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, - (LPARAM)(ofn->lpstrFilter + n) ); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - TRACE("add str=%s associated to %s\n", - debugstr_w(old_pstr), debugstr_w(pstr)); - SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - } - } - /* set default filter */ - if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL) - ofn->nFilterIndex = 1; - SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0); - lstrcpynW(tmpstr, FILEDLG_GetFileType(ofn->lpstrCustomFilter, - (LPWSTR)ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE); - TRACE("nFilterIndex = %ld, SetText of edt1 to %s\n", - ofn->nFilterIndex, debugstr_w(tmpstr)); - SetDlgItemTextW( hWnd, edt1, tmpstr ); - /* get drive list */ - *tmpstr = 0; - DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE); - /* read initial directory */ - /* FIXME: Note that this is now very version-specific (See MSDN description of - * the OPENFILENAME structure). For example under 2000/XP any path in the - * lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME - */ - if (ofn->lpstrInitialDir != NULL) - { - int len; - lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511); - len = lstrlenW(tmpstr); - if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') { - tmpstr[len]='\\'; - tmpstr[len+1]='\0'; - } - } - else - *tmpstr = 0; - if (!FILEDLG_ScanDir(hWnd, tmpstr)) { - *tmpstr = 0; - if (!FILEDLG_ScanDir(hWnd, tmpstr)) - WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr)); - } - /* select current drive in combo 2, omit missing drives */ - { - char dir[MAX_PATH]; - char str[4] = "a:\\"; - GetCurrentDirectoryA( sizeof(dir), dir ); - for(i = 0, n = -1; i < 26; i++) - { - str[0] = 'a' + i; - if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++; - if (toupper(str[0]) == toupper(dir[0])) break; - } - } - SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0); - if (!(ofn->Flags & OFN_SHOWHELP)) - ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE); - if (ofn->Flags & OFN_HIDEREADONLY) - ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); - if (lfs->hook) - return (BOOL) FILEDLG_CallWindowProc(lfs, WM_INITDIALOG, wParam, lfs->lParam); - return TRUE; -} - - - - -/*********************************************************************** - * FILEDLG_WMInitDialog16 [internal] - * The is a duplicate of the 32bit FILEDLG_WMInitDialog function - * The only differnce is that it calls FILEDLG_CallWindowProc16 - * for a 16 bit Window Proc. - */ - -static LONG FILEDLG_WMInitDialog16(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - int i, n; - WCHAR tmpstr[BUFFILE]; - LPWSTR pstr, old_pstr; - LPOPENFILENAMEW ofn; - LFSPRIVATE lfs = (LFSPRIVATE) lParam; - - if (!lfs) return FALSE; - SetPropA(hWnd, OFN_PROP, (HANDLE)lfs); - lfs->hwnd = hWnd; - ofn = lfs->ofnW; - - TRACE("flags=%lx initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir)); - - SetWindowTextW( hWnd, ofn->lpstrTitle ); - /* read custom filter information */ - if (ofn->lpstrCustomFilter) - { - pstr = ofn->lpstrCustomFilter; - n = 0; - TRACE("lpstrCustomFilter = %p\n", pstr); - while(*pstr) - { - old_pstr = pstr; - i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, - (LPARAM)(ofn->lpstrCustomFilter) + n ); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - TRACE("add str=%s associated to %s\n", - debugstr_w(old_pstr), debugstr_w(pstr)); - SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - } - } - /* read filter information */ - if (ofn->lpstrFilter) { - pstr = (LPWSTR) ofn->lpstrFilter; - n = 0; - while(*pstr) { - old_pstr = pstr; - i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, - (LPARAM)(ofn->lpstrFilter + n) ); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - TRACE("add str=%s associated to %s\n", - debugstr_w(old_pstr), debugstr_w(pstr)); - SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); - n += lstrlenW(pstr) + 1; - pstr += lstrlenW(pstr) + 1; - } - } - /* set default filter */ - if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL) - ofn->nFilterIndex = 1; - SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0); - lstrcpynW(tmpstr, FILEDLG_GetFileType(ofn->lpstrCustomFilter, - (LPWSTR)ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE); - TRACE("nFilterIndex = %ld, SetText of edt1 to %s\n", - ofn->nFilterIndex, debugstr_w(tmpstr)); - SetDlgItemTextW( hWnd, edt1, tmpstr ); - /* get drive list */ - *tmpstr = 0; - DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE); - /* read initial directory */ - /* FIXME: Note that this is now very version-specific (See MSDN description of - * the OPENFILENAME structure). For example under 2000/XP any path in the - * lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME - */ - if (ofn->lpstrInitialDir != NULL) - { - int len; - lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511); - len = lstrlenW(tmpstr); - if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') { - tmpstr[len]='\\'; - tmpstr[len+1]='\0'; - } - } - else - *tmpstr = 0; - if (!FILEDLG_ScanDir(hWnd, tmpstr)) { - *tmpstr = 0; - if (!FILEDLG_ScanDir(hWnd, tmpstr)) - WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr)); - } - /* select current drive in combo 2, omit missing drives */ - { - char dir[MAX_PATH]; - char str[4] = "a:\\"; - GetCurrentDirectoryA( sizeof(dir), dir ); - for(i = 0, n = -1; i < 26; i++) - { - str[0] = 'a' + i; - if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++; - if (toupper(str[0]) == toupper(dir[0])) break; - } - } - SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0); - if (!(ofn->Flags & OFN_SHOWHELP)) - ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE); - if (ofn->Flags & OFN_HIDEREADONLY) - ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); - if (lfs->hook) - return (BOOL) FILEDLG_CallWindowProc16(lfs, WM_INITDIALOG, wParam, lfs->lParam); - return TRUE; -} - -/*********************************************************************** - * FILEDLG_WMMeasureItem [internal] - */ -static LONG FILEDLG_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) -{ - LPMEASUREITEMSTRUCT lpmeasure; - - lpmeasure = (LPMEASUREITEMSTRUCT)lParam; - lpmeasure->itemHeight = fldrHeight; - return TRUE; -} - - -/*********************************************************************** - * FILEDLG_WMMeasureItem16 [internal] - */ -static LONG FILEDLG_WMMeasureItem16(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) +static LONG FD16_WMMeasureItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) { LPMEASUREITEMSTRUCT16 lpmeasure; lpmeasure = MapSL(lParam); - lpmeasure->itemHeight = fldrHeight; + lpmeasure->itemHeight = FD31_GetFldrHeight(); return TRUE; } /* ------------------ Dialog procedures ---------------------- */ /*********************************************************************** - * FileOpenDlgProc [internal] - * Used for open and save, in fact. + * FileOpenDlgProc16 (COMMDLG.6) */ -static INT_PTR CALLBACK FileOpenDlgProc(HWND hWnd, UINT wMsg, - WPARAM wParam, LPARAM lParam) -{ - LFSPRIVATE lfs = (LFSPRIVATE)GetPropA(hWnd,OFN_PROP); - - TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); - if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) - { - INT_PTR lRet; - lRet = (INT_PTR)FILEDLG_CallWindowProc(lfs, wMsg, wParam, lParam); - if (lRet) - return lRet; /* else continue message processing */ - } - switch (wMsg) - { - case WM_INITDIALOG: - return FILEDLG_WMInitDialog(hWnd, wParam, lParam); - - case WM_MEASUREITEM: - return FILEDLG_WMMeasureItem(hWnd, wParam, lParam); - - case WM_DRAWITEM: - return FILEDLG_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam); - - case WM_COMMAND: - return FILEDLG_WMCommand(hWnd, lParam, HIWORD(wParam), LOWORD(wParam), lfs); -#if 0 - case WM_CTLCOLOR: - SetBkColor((HDC16)wParam, 0x00C0C0C0); - switch (HIWORD(lParam)) - { - case CTLCOLOR_BTN: - SetTextColor((HDC16)wParam, 0x00000000); - return hGRAYBrush; - case CTLCOLOR_STATIC: - SetTextColor((HDC16)wParam, 0x00000000); - return hGRAYBrush; - } - break; -#endif - } - return FALSE; -} - -/*********************************************************************** - * FileOpenDlgProc (COMMDLG.6) - */ -BOOL16 CALLBACK FileOpenDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, - LPARAM lParam) +BOOL16 CALLBACK FileOpenDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam) { HWND hWnd = HWND_32(hWnd16); - LFSPRIVATE lfs = (LFSPRIVATE)GetPropA(hWnd,OFN_PROP); + PFD31_DATA lfs = (PFD31_DATA)GetPropA(hWnd,FD31_OFN_PROP); DRAWITEMSTRUCT dis; TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) { - LRESULT lRet = (BOOL16)FILEDLG_CallWindowProc16(lfs, wMsg, wParam, lParam); + LRESULT lRet = (BOOL16)FD31_CallWindowProc(lfs, wMsg, wParam, lParam); if (lRet) return lRet; /* else continue message processing */ } switch (wMsg) { case WM_INITDIALOG: - return FILEDLG_WMInitDialog16(hWnd, wParam, lParam); + return FD31_WMInitDialog(hWnd, wParam, lParam); case WM_MEASUREITEM: - return FILEDLG_WMMeasureItem16(hWnd16, wParam, lParam); + return FD16_WMMeasureItem(hWnd16, wParam, lParam); case WM_DRAWITEM: - FILEDLG_MapDrawItemStruct(MapSL(lParam), &dis); - return FILEDLG_WMDrawItem(hWnd, wParam, lParam, FALSE, &dis); + FD16_MapDrawItemStruct(MapSL(lParam), &dis); + return FD31_WMDrawItem(hWnd, wParam, lParam, FALSE, &dis); case WM_COMMAND: - return FILEDLG_WMCommand(hWnd, lParam, HIWORD(lParam),wParam, lfs); + return FD31_WMCommand(hWnd, lParam, HIWORD(lParam),wParam, lfs); #if 0 case WM_CTLCOLOR: SetBkColor((HDC16)wParam, 0x00C0C0C0); @@ -1503,36 +377,35 @@ BOOL16 CALLBACK FileOpenDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, } /*********************************************************************** - * FileSaveDlgProc (COMMDLG.7) + * FileSaveDlgProc16 (COMMDLG.7) */ -BOOL16 CALLBACK FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, - LPARAM lParam) +BOOL16 CALLBACK FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam) { HWND hWnd = HWND_32(hWnd16); - LFSPRIVATE lfs = (LFSPRIVATE)GetPropA(hWnd,OFN_PROP); + PFD31_DATA lfs = (PFD31_DATA)GetPropA(hWnd,FD31_OFN_PROP); DRAWITEMSTRUCT dis; TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) { LRESULT lRet; - lRet = (BOOL16)FILEDLG_CallWindowProc16(lfs, wMsg, wParam, lParam); + lRet = (BOOL16)FD31_CallWindowProc(lfs, wMsg, wParam, lParam); if (lRet) return lRet; /* else continue message processing */ } switch (wMsg) { case WM_INITDIALOG: - return FILEDLG_WMInitDialog16(hWnd, wParam, lParam); + return FD31_WMInitDialog(hWnd, wParam, lParam); case WM_MEASUREITEM: - return FILEDLG_WMMeasureItem16(hWnd16, wParam, lParam); + return FD16_WMMeasureItem(hWnd16, wParam, lParam); case WM_DRAWITEM: - FILEDLG_MapDrawItemStruct(MapSL(lParam), &dis); - return FILEDLG_WMDrawItem(hWnd, wParam, lParam, TRUE, &dis); + FD16_MapDrawItemStruct(MapSL(lParam), &dis); + return FD31_WMDrawItem(hWnd, wParam, lParam, TRUE, &dis); case WM_COMMAND: - return FILEDLG_WMCommand(hWnd, lParam, HIWORD(lParam), wParam, lfs); + return FD31_WMCommand(hWnd, lParam, HIWORD(lParam), wParam, lfs); } /* @@ -1553,73 +426,6 @@ BOOL16 CALLBACK FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, return FALSE; } - - -/*********************************************************************** - * GetFileName31A [internal] - * - * Creates a win31 style dialog box for the user to select a file to open/save. - */ -BOOL GetFileName31A( - LPOPENFILENAMEA lpofn, /* addess of structure with data*/ - UINT dlgType /* type dialogue : open/save */ - ) -{ - HINSTANCE hInst; - BOOL bRet = FALSE; - LFSPRIVATE lfs; - - if (!lpofn || !FileDlg_Init()) return FALSE; - - TRACE("ofn flags %08lx\n", lpofn->Flags); - lfs = FILEDLG_AllocPrivate((LPARAM) lpofn, LFS32A, dlgType); - if (lfs) - { - hInst = (HINSTANCE)GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE ); - bRet = DialogBoxIndirectParamA( hInst, lfs->template, lpofn->hwndOwner, - FileOpenDlgProc, (LPARAM)lfs); - FILEDLG_DestroyPrivate(lfs); - } - - TRACE("return lpstrFile='%s' !\n", lpofn->lpstrFile); - return bRet; -} - -/*********************************************************************** - * GetFileName31W [internal] - * - * Creates a win31 style dialog box for the user to select a file to open/save - */ -BOOL GetFileName31W( - LPOPENFILENAMEW lpofn, /* addess of structure with data*/ - UINT dlgType /* type dialogue : open/save */ - ) -{ - HINSTANCE hInst; - BOOL bRet = FALSE; - LFSPRIVATE lfs; - - if (!lpofn || !FileDlg_Init()) return FALSE; - - lfs = FILEDLG_AllocPrivate((LPARAM) lpofn, LFS32W, dlgType); - if (lfs) - { - hInst = (HINSTANCE)GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE ); - bRet = DialogBoxIndirectParamW( hInst, lfs->template, lpofn->hwndOwner, - FileOpenDlgProc, (LPARAM)lfs); - FILEDLG_DestroyPrivate(lfs); - } - - TRACE("return lpstrFile=%s !\n", debugstr_w(lpofn->lpstrFile)); - return bRet; -} - - - - - - - /* ------------------ APIs ---------------------- */ /*********************************************************************** @@ -1641,19 +447,23 @@ BOOL16 WINAPI GetOpenFileName16( HINSTANCE16 hInst; BOOL bRet = FALSE; LPOPENFILENAME16 lpofn = MapSL(ofn); - LFSPRIVATE lfs; + PFD31_DATA lfs; FARPROC16 ptr; + FD31_CALLBACKS callbacks; + PFD16_PRIVATE priv; - if (!lpofn || !FileDlg_Init()) return FALSE; + if (!lpofn || !FD31_Init()) return FALSE; - lfs = FILEDLG_AllocPrivate((LPARAM) ofn, LFS16, OPEN_DIALOG); + FD16_SetupCallbacks(&callbacks); + lfs = FD31_AllocPrivate((LPARAM) ofn, OPEN_DIALOG, &callbacks, 0); if (lfs) { + priv = (PFD16_PRIVATE) lfs->private1632; hInst = GetWindowWord( HWND_32(lpofn->hwndOwner), GWL_HINSTANCE ); ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 6); - bRet = DialogBoxIndirectParam16( hInst, lfs->hDlgTmpl16, lpofn->hwndOwner, + bRet = DialogBoxIndirectParam16( hInst, priv->hDlgTmpl16, lpofn->hwndOwner, (DLGPROC16) ptr, (LPARAM) lfs); - FILEDLG_DestroyPrivate(lfs); + FD31_DestroyPrivate(lfs); } TRACE("return lpstrFile='%s' !\n", (char *)MapSL(lpofn->lpstrFile)); @@ -1679,19 +489,23 @@ BOOL16 WINAPI GetSaveFileName16( HINSTANCE16 hInst; BOOL bRet = FALSE; LPOPENFILENAME16 lpofn = MapSL(ofn); - LFSPRIVATE lfs; + PFD31_DATA lfs; FARPROC16 ptr; + FD31_CALLBACKS callbacks; + PFD16_PRIVATE priv; - if (!lpofn || !FileDlg_Init()) return FALSE; + if (!lpofn || !FD31_Init()) return FALSE; - lfs = FILEDLG_AllocPrivate((LPARAM) ofn, LFS16, SAVE_DIALOG); + FD16_SetupCallbacks(&callbacks); + lfs = FD31_AllocPrivate((LPARAM) ofn, SAVE_DIALOG, &callbacks, 0); if (lfs) { + priv = (PFD16_PRIVATE) lfs->private1632; hInst = GetWindowWord( HWND_32(lpofn->hwndOwner), GWL_HINSTANCE ); ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 7); - bRet = DialogBoxIndirectParam16( hInst, lfs->hDlgTmpl16, lpofn->hwndOwner, + bRet = DialogBoxIndirectParam16( hInst, priv->hDlgTmpl16, lpofn->hwndOwner, (DLGPROC16) ptr, (LPARAM) lfs); - FILEDLG_DestroyPrivate(lfs); + FD31_DestroyPrivate(lfs); } TRACE("return lpstrFile='%s' !\n", (char *)MapSL(lpofn->lpstrFile)); diff --git a/reactos/lib/comdlg32/filedlg31.c b/reactos/lib/comdlg32/filedlg31.c new file mode 100644 index 00000000000..92fa3093c18 --- /dev/null +++ b/reactos/lib/comdlg32/filedlg31.c @@ -0,0 +1,931 @@ +/* + * COMMDLG - File Dialogs + * + * Copyright 1994 Martin Ayotte + * Copyright 1996 Albrecht Kleine + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "wingdi.h" +#include "winuser.h" +#include "wine/unicode.h" +#include "wine/debug.h" +#include "cderr.h" +#include "winreg.h" +#include "winternl.h" +#include "winuser.h" +#include "commdlg.h" +#include "cderr.h" +#include "winreg.h" +#include "winternl.h" + +WINE_DEFAULT_DEBUG_CHANNEL(commdlg); + +#include "cdlg.h" +#include "filedlg31.h" + +#define BUFFILE 512 +#define BUFFILEALLOC 512 * sizeof(WCHAR) + +static const WCHAR FILE_star[] = {'*','.','*', 0}; +static const WCHAR FILE_bslash[] = {'\\', 0}; +static const WCHAR FILE_specc[] = {'%','c',':', 0}; +static const int fldrHeight = 16; +static const int fldrWidth = 20; + +static HICON hFolder = 0; +static HICON hFolder2 = 0; +static HICON hFloppy = 0; +static HICON hHDisk = 0; +static HICON hCDRom = 0; +static HICON hNet = 0; + +/*********************************************************************** + * FD31_Init [internal] + */ +BOOL FD31_Init(void) +{ + static BOOL initialized = 0; + + if (!initialized) { + hFolder = LoadImageA( COMDLG32_hInstance, "FOLDER", IMAGE_ICON, 16, 16, LR_SHARED ); + hFolder2 = LoadImageA( COMDLG32_hInstance, "FOLDER2", IMAGE_ICON, 16, 16, LR_SHARED ); + hFloppy = LoadImageA( COMDLG32_hInstance, "FLOPPY", IMAGE_ICON, 16, 16, LR_SHARED ); + hHDisk = LoadImageA( COMDLG32_hInstance, "HDISK", IMAGE_ICON, 16, 16, LR_SHARED ); + hCDRom = LoadImageA( COMDLG32_hInstance, "CDROM", IMAGE_ICON, 16, 16, LR_SHARED ); + hNet = LoadImageA( COMDLG32_hInstance, "NETWORK", IMAGE_ICON, 16, 16, LR_SHARED ); + if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 || + hHDisk == 0 || hCDRom == 0 || hNet == 0) + { + ERR("Error loading icons !\n"); + return FALSE; + } + initialized = TRUE; + } + return TRUE; +} + +/*********************************************************************** + * FD31_StripEditControl [internal] + * Strip pathnames off the contents of the edit control. + */ +static void FD31_StripEditControl(HWND hwnd) +{ + WCHAR temp[BUFFILE], *cp; + + GetDlgItemTextW( hwnd, edt1, temp, sizeof(temp)/sizeof(WCHAR)); + cp = strrchrW(temp, '\\'); + if (cp != NULL) { + strcpyW(temp, cp+1); + } + cp = strrchrW(temp, ':'); + if (cp != NULL) { + strcpyW(temp, cp+1); + } + /* FIXME: shouldn't we do something with the result here? ;-) */ +} + +/*********************************************************************** + * FD31_CallWindowProc [internal] + * + * Call the appropriate hook + */ +BOOL FD31_CallWindowProc(PFD31_DATA lfs, UINT wMsg, WPARAM wParam, + LPARAM lParam) +{ + return lfs->callbacks->CWP(lfs, wMsg, wParam, lParam); +} + +/*********************************************************************** + * FD31_ScanDir [internal] + */ +static BOOL FD31_ScanDir(HWND hWnd, LPWSTR newPath) +{ + WCHAR buffer[BUFFILE]; + HWND hdlg, hdlgDir; + LRESULT lRet = TRUE; + HCURSOR hCursorWait, oldCursor; + + TRACE("Trying to change to %s\n", debugstr_w(newPath)); + if ( newPath[0] && !SetCurrentDirectoryW( newPath )) + return FALSE; + lstrcpynW(buffer, newPath, sizeof(buffer)/sizeof(WCHAR)); + + /* get the list of spec files */ + GetDlgItemTextW(hWnd, edt1, buffer, sizeof(buffer)/sizeof(WCHAR)); + + hCursorWait = LoadCursorA(0, (LPSTR)IDC_WAIT); + oldCursor = SetCursor(hCursorWait); + + /* list of files */ + if ((hdlg = GetDlgItem(hWnd, lst1)) != 0) { + WCHAR* scptr; /* ptr on semi-colon */ + WCHAR* filter = buffer; + + TRACE("Using filter %s\n", debugstr_w(filter)); + SendMessageW(hdlg, LB_RESETCONTENT, 0, 0); + while (filter) { + scptr = strchrW(filter, ';'); + if (scptr) *scptr = 0; + while (*filter == ' ') filter++; + TRACE("Using file spec %s\n", debugstr_w(filter)); + if (SendMessageW(hdlg, LB_DIR, 0, (LPARAM)filter) == LB_ERR) + return FALSE; + if (scptr) *scptr = ';'; + filter = (scptr) ? (scptr + 1) : 0; + } + } + + /* list of directories */ + strcpyW(buffer, FILE_star); + + if ((hdlgDir = GetDlgItem(hWnd, lst2)) != 0) { + lRet = DlgDirListW(hWnd, buffer, lst2, stc1, DDL_EXCLUSIVE | DDL_DIRECTORY); + } + SetCursor(oldCursor); + return lRet; +} + +/*********************************************************************** + * FD31_GetFileType [internal] + */ + +static LPWSTR FD31_GetFileType(LPWSTR cfptr, LPWSTR fptr, WORD index) +{ + int n, i; + i = 0; + if (cfptr) + for ( ;(n = lstrlenW(cfptr)) != 0; i++) + { + cfptr += n + 1; + if (i == index) + return cfptr; + cfptr += lstrlenW(cfptr) + 1; + } + if (fptr) + for ( ;(n = lstrlenW(fptr)) != 0; i++) + { + fptr += n + 1; + if (i == index) + return fptr; + fptr += lstrlenW(fptr) + 1; + } + return (LPWSTR) FILE_star; /* FIXME */ +} + +/*********************************************************************** + * FD31_WMDrawItem [internal] + */ +LONG FD31_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam, + int savedlg, LPDRAWITEMSTRUCT lpdis) +{ + WCHAR *str; + HICON hIcon; + COLORREF oldText = 0, oldBk = 0; + + if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1) + { + if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) return FALSE; + SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, + (LPARAM)str); + + if ((lpdis->itemState & ODS_SELECTED) && !savedlg) + { + oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) ); + oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + } + if (savedlg) + SetTextColor(lpdis->hDC,GetSysColor(COLOR_GRAYTEXT) ); + + ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + 1, + lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED, + &(lpdis->rcItem), str, lstrlenW(str), NULL); + + if (lpdis->itemState & ODS_SELECTED) + DrawFocusRect( lpdis->hDC, &(lpdis->rcItem) ); + + if ((lpdis->itemState & ODS_SELECTED) && !savedlg) + { + SetBkColor( lpdis->hDC, oldBk ); + SetTextColor( lpdis->hDC, oldText ); + } + HeapFree(GetProcessHeap(), 0, str); + return TRUE; + } + + if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2) + { + if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) + return FALSE; + SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, + (LPARAM)str); + + if (lpdis->itemState & ODS_SELECTED) + { + oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) ); + oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + } + ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + fldrWidth, + lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED, + &(lpdis->rcItem), str, lstrlenW(str), NULL); + + if (lpdis->itemState & ODS_SELECTED) + DrawFocusRect( lpdis->hDC, &(lpdis->rcItem) ); + + if (lpdis->itemState & ODS_SELECTED) + { + SetBkColor( lpdis->hDC, oldBk ); + SetTextColor( lpdis->hDC, oldText ); + } + DrawIcon(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hFolder); + HeapFree(GetProcessHeap(), 0, str); + return TRUE; + } + if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2) + { + char root[] = "a:"; + if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) + return FALSE; + SendMessageW(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID, + (LPARAM)str); + root[0] += str[2] - 'a'; + switch(GetDriveTypeA(root)) + { + case DRIVE_REMOVABLE: hIcon = hFloppy; break; + case DRIVE_CDROM: hIcon = hCDRom; break; + case DRIVE_REMOTE: hIcon = hNet; break; + case DRIVE_FIXED: + default: hIcon = hHDisk; break; + } + if (lpdis->itemState & ODS_SELECTED) + { + oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) ); + oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + } + ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + fldrWidth, + lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED, + &(lpdis->rcItem), str, lstrlenW(str), NULL); + + if (lpdis->itemState & ODS_SELECTED) + { + SetBkColor( lpdis->hDC, oldBk ); + SetTextColor( lpdis->hDC, oldText ); + } + DrawIcon(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hIcon); + HeapFree(GetProcessHeap(), 0, str); + return TRUE; + } + return FALSE; +} + +/*********************************************************************** + * FD31_UpdateResult [internal] + * update the displayed file name (with path) + */ +void FD31_UpdateResult(PFD31_DATA lfs, WCHAR *tmpstr) +{ + int lenstr2; + LPOPENFILENAMEW ofnW = &lfs->ofnW; + WCHAR tmpstr2[BUFFILE]; + WCHAR *bs; + + TRACE("%s\n", debugstr_w(tmpstr)); + if(ofnW->Flags & OFN_NOVALIDATE) + tmpstr2[0] = '\0'; + else + GetCurrentDirectoryW(BUFFILE, tmpstr2); + lenstr2 = strlenW(tmpstr2); + if (lenstr2 > 3) + tmpstr2[lenstr2++]='\\'; + lstrcpynW(tmpstr2+lenstr2, tmpstr, BUFFILE-lenstr2); + if (ofnW->lpstrFile) + lstrcpynW(ofnW->lpstrFile, tmpstr2, ofnW->nMaxFile); + if((bs = strrchrW(tmpstr2, '\\')) != NULL) + ofnW->nFileOffset = bs - tmpstr2 +1; + else + ofnW->nFileOffset = 0; + ofnW->nFileExtension = 0; + while(tmpstr2[ofnW->nFileExtension] != '.' && tmpstr2[ofnW->nFileExtension] != '\0') + ofnW->nFileExtension++; + if (tmpstr2[ofnW->nFileExtension] == '\0') + ofnW->nFileExtension = 0; + else + ofnW->nFileExtension++; + /* update the real client structures if any */ + lfs->callbacks->UpdateResult(lfs); +} + +/*********************************************************************** + * FD31_UpdateFileTitle [internal] + * update the displayed file name (without path) + */ +void FD31_UpdateFileTitle(PFD31_DATA lfs) +{ + LONG lRet; + LPOPENFILENAMEW ofnW = &lfs->ofnW; + if (ofnW->lpstrFileTitle != NULL) + { + lRet = SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETCURSEL, 0, 0); + SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETTEXT, lRet, + (LPARAM)ofnW->lpstrFileTitle ); + lfs->callbacks->UpdateFileTitle(lfs); + } +} + +/*********************************************************************** + * FD31_DirListDblClick [internal] + */ +static LRESULT FD31_DirListDblClick( PFD31_DATA lfs ) +{ + LONG lRet; + HWND hWnd = lfs->hwnd; + LPWSTR pstr; + WCHAR tmpstr[BUFFILE]; + + /* get the raw string (with brackets) */ + lRet = SendDlgItemMessageW(hWnd, lst2, LB_GETCURSEL, 0, 0); + if (lRet == LB_ERR) return TRUE; + pstr = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC); + SendDlgItemMessageW(hWnd, lst2, LB_GETTEXT, lRet, + (LPARAM)pstr); + strcpyW( tmpstr, pstr ); + HeapFree(GetProcessHeap(), 0, pstr); + /* get the selected directory in tmpstr */ + if (tmpstr[0] == '[') + { + tmpstr[lstrlenW(tmpstr) - 1] = 0; + strcpyW(tmpstr,tmpstr+1); + } + strcatW(tmpstr, FILE_bslash); + + FD31_ScanDir(hWnd, tmpstr); + /* notify the app */ + if (lfs->hook) + { + if (FD31_CallWindowProc(lfs, lfs->lbselchstring, lst2, + MAKELONG(lRet,CD_LBSELCHANGE))) + return TRUE; + } + return TRUE; +} + +/*********************************************************************** + * FD31_FileListSelect [internal] + * called when a new item is picked in the file list + */ +static LRESULT FD31_FileListSelect( PFD31_DATA lfs ) +{ + LONG lRet; + HWND hWnd = lfs->hwnd; + LPWSTR pstr; + + lRet = lfs->callbacks->SendLbGetCurSel(lfs); + if (lRet == LB_ERR) + return TRUE; + + /* set the edit control to the choosen file */ + if ((pstr = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) + { + SendDlgItemMessageW(hWnd, lst1, LB_GETTEXT, lRet, + (LPARAM)pstr); + SetDlgItemTextW( hWnd, edt1, pstr ); + HeapFree(GetProcessHeap(), 0, pstr); + } + if (lfs->hook) + { + FD31_CallWindowProc(lfs, lfs->lbselchstring, lst1, + MAKELONG(lRet,CD_LBSELCHANGE)); + } + /* FIXME: for OFN_ALLOWMULTISELECT we need CD_LBSELSUB, CD_SELADD, + CD_LBSELNOITEMS */ + return TRUE; +} + +/*********************************************************************** + * FD31_TestPath [internal] + * before accepting the file name, test if it includes wild cards + * tries to scan the directory and returns TRUE if no error. + */ +static LRESULT FD31_TestPath( PFD31_DATA lfs, LPWSTR path ) +{ + HWND hWnd = lfs->hwnd; + LPWSTR pBeginFileName, pstr2; + WCHAR tmpstr2[BUFFILE]; + + pBeginFileName = strrchrW(path, '\\'); + if (pBeginFileName == NULL) + pBeginFileName = strrchrW(path, ':'); + + if (strchrW(path,'*') != NULL || strchrW(path,'?') != NULL) + { + /* edit control contains wildcards */ + if (pBeginFileName != NULL) + { + lstrcpynW(tmpstr2, pBeginFileName + 1, BUFFILE); + *(pBeginFileName + 1) = 0; + } + else + { + strcpyW(tmpstr2, path); + if(!(lfs->ofnW.Flags & OFN_NOVALIDATE)) + *path = 0; + } + + TRACE("path=%s, tmpstr2=%s\n", debugstr_w(path), debugstr_w(tmpstr2)); + SetDlgItemTextW( hWnd, edt1, tmpstr2 ); + FD31_ScanDir(hWnd, path); + return (lfs->ofnW.Flags & OFN_NOVALIDATE) ? TRUE : FALSE; + } + + /* no wildcards, we might have a directory or a filename */ + /* try appending a wildcard and reading the directory */ + + pstr2 = path + lstrlenW(path); + if (pBeginFileName == NULL || *(pBeginFileName + 1) != 0) + strcatW(path, FILE_bslash); + + /* if ScanDir succeeds, we have changed the directory */ + if (FD31_ScanDir(hWnd, path)) + return FALSE; /* and path is not a valid file name */ + + /* if not, this must be a filename */ + + *pstr2 = 0; /* remove the wildcard added before */ + + if (pBeginFileName != NULL) + { + /* strip off the pathname */ + *pBeginFileName = 0; + SetDlgItemTextW( hWnd, edt1, pBeginFileName + 1 ); + + lstrcpynW(tmpstr2, pBeginFileName + 1, sizeof(tmpstr2)/sizeof(WCHAR) ); + /* Should we MessageBox() if this fails? */ + if (!FD31_ScanDir(hWnd, path)) + { + return FALSE; + } + strcpyW(path, tmpstr2); + } + else + SetDlgItemTextW( hWnd, edt1, path ); + return TRUE; +} + +/*********************************************************************** + * FD31_Validate [internal] + * called on: click Ok button, Enter in edit, DoubleClick in file list + */ +static LRESULT FD31_Validate( PFD31_DATA lfs, LPWSTR path, UINT control, INT itemIndex, + BOOL internalUse ) +{ + LONG lRet; + HWND hWnd = lfs->hwnd; + OPENFILENAMEW ofnsav; + LPOPENFILENAMEW ofnW = &lfs->ofnW; + WCHAR filename[BUFFILE]; + + ofnsav = *ofnW; /* for later restoring */ + + /* get current file name */ + if (path) + lstrcpynW(filename, path, sizeof(filename)/sizeof(WCHAR)); + else + GetDlgItemTextW( hWnd, edt1, filename, sizeof(filename)/sizeof(WCHAR)); + + TRACE("got filename = %s\n", debugstr_w(filename)); + /* if we did not click in file list to get there */ + if (control != lst1) + { + if (!FD31_TestPath( lfs, filename) ) + return FALSE; + } + FD31_UpdateResult(lfs, filename); + + if (internalUse) + { /* called internally after a change in a combo */ + if (lfs->hook) + { + FD31_CallWindowProc(lfs, lfs->lbselchstring, control, + MAKELONG(itemIndex,CD_LBSELCHANGE)); + } + return TRUE; + } + + FD31_UpdateFileTitle(lfs); + if (lfs->hook) + { + lRet = (BOOL)FD31_CallWindowProc(lfs, lfs->fileokstring, + 0, lfs->lParam ); + if (lRet) + { + *ofnW = ofnsav; /* restore old state */ + return FALSE; + } + } + if ((ofnW->Flags & OFN_ALLOWMULTISELECT) && (ofnW->Flags & OFN_EXPLORER)) + { + if (ofnW->lpstrFile) + { + LPWSTR str = (LPWSTR)ofnW->lpstrFile; + LPWSTR ptr = strrchrW(str, '\\'); + str[lstrlenW(str) + 1] = '\0'; + *ptr = 0; + } + } + return TRUE; +} + +/*********************************************************************** + * FD31_DiskChange [internal] + * called when a new item is picked in the disk selection combo + */ +static LRESULT FD31_DiskChange( PFD31_DATA lfs ) +{ + LONG lRet; + HWND hWnd = lfs->hwnd; + LPWSTR pstr; + WCHAR diskname[BUFFILE]; + + FD31_StripEditControl(hWnd); + lRet = SendDlgItemMessageW(hWnd, cmb2, CB_GETCURSEL, 0, 0L); + if (lRet == LB_ERR) + return 0; + pstr = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC); + SendDlgItemMessageW(hWnd, cmb2, CB_GETLBTEXT, lRet, + (LPARAM)pstr); + wsprintfW(diskname, FILE_specc, pstr[2]); + HeapFree(GetProcessHeap(), 0, pstr); + + return FD31_Validate( lfs, diskname, cmb2, lRet, TRUE ); +} + +/*********************************************************************** + * FD31_FileTypeChange [internal] + * called when a new item is picked in the file type combo + */ +static LRESULT FD31_FileTypeChange( PFD31_DATA lfs ) +{ + LONG lRet; + WCHAR diskname[BUFFILE]; + LPWSTR pstr; + + diskname[0] = 0; + + lRet = SendDlgItemMessageW(lfs->hwnd, cmb1, CB_GETCURSEL, 0, 0); + if (lRet == LB_ERR) + return TRUE; + pstr = (LPWSTR)SendDlgItemMessageW(lfs->hwnd, cmb1, CB_GETITEMDATA, lRet, 0); + TRACE("Selected filter : %s\n", debugstr_w(pstr)); + SetDlgItemTextW( lfs->hwnd, edt1, pstr ); + + return FD31_Validate( lfs, NULL, cmb1, lRet, TRUE ); +} + +/*********************************************************************** + * FD31_WMCommand [internal] + */ +LRESULT FD31_WMCommand(HWND hWnd, LPARAM lParam, UINT notification, + UINT control, PFD31_DATA lfs ) +{ + switch (control) + { + case lst1: /* file list */ + FD31_StripEditControl(hWnd); + if (notification == LBN_DBLCLK) + { + if (FD31_Validate( lfs, NULL, control, 0, FALSE )) + EndDialog(hWnd, TRUE); + return TRUE; + } + else if (notification == LBN_SELCHANGE) + return FD31_FileListSelect( lfs ); + break; + + case lst2: /* directory list */ + FD31_StripEditControl(hWnd); + if (notification == LBN_DBLCLK) + return FD31_DirListDblClick( lfs ); + break; + + case cmb1: /* file type drop list */ + if (notification == CBN_SELCHANGE) + return FD31_FileTypeChange( lfs ); + break; + + case chx1: + break; + + case pshHelp: + break; + + case cmb2: /* disk dropdown combo */ + if (notification == CBN_SELCHANGE) + return FD31_DiskChange( lfs ); + break; + + case IDOK: + TRACE("OK pressed\n"); + if (FD31_Validate( lfs, NULL, control, 0, FALSE )) + EndDialog(hWnd, TRUE); + return TRUE; + + case IDCANCEL: + EndDialog(hWnd, FALSE); + return TRUE; + + case IDABORT: /* can be sent by the hook procedure */ + EndDialog(hWnd, TRUE); + return TRUE; + } + return FALSE; +} + +/************************************************************************ + * FD31_MapStringPairsToW [internal] + * map string pairs to Unicode + */ +static LPWSTR FD31_MapStringPairsToW(LPCSTR strA, UINT size) +{ + LPCSTR s; + LPWSTR x; + int n, len; + + s = strA; + while (*s) + s = s+strlen(s)+1; + s++; + n = s + 1 - strA; /* Don't forget the other \0 */ + if (n < size) n = size; + + len = MultiByteToWideChar( CP_ACP, 0, strA, n, NULL, 0 ); + x = HeapAlloc(GetProcessHeap(),0, len * sizeof(WCHAR)); + MultiByteToWideChar( CP_ACP, 0, strA, n, x, len ); + return x; +} + + +/************************************************************************ + * FD31_DupToW [internal] + * duplicates an Ansi string to unicode, with a buffer size + */ +static LPWSTR FD31_DupToW(LPCSTR str, DWORD size) +{ + LPWSTR strW = NULL; + if (str && (size > 0)) + { + strW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + if (strW) MultiByteToWideChar( CP_ACP, 0, str, -1, strW, size ); + } + return strW; +} + +/************************************************************************ + * FD31_MapOfnStructA [internal] + * map a 32 bits Ansi structure to an Unicode one + */ +void FD31_MapOfnStructA(LPOPENFILENAMEA ofnA, LPOPENFILENAMEW ofnW, BOOL open) +{ + LPCSTR str; + UNICODE_STRING usBuffer; + + ofnW->lStructSize = sizeof(OPENFILENAMEW); + ofnW->hwndOwner = ofnA->hwndOwner; + ofnW->hInstance = ofnA->hInstance; + if (ofnA->lpstrFilter) + ofnW->lpstrFilter = FD31_MapStringPairsToW(ofnA->lpstrFilter, 0); + + if ((ofnA->lpstrCustomFilter) && (*(ofnA->lpstrCustomFilter))) + ofnW->lpstrCustomFilter = FD31_MapStringPairsToW(ofnA->lpstrCustomFilter, ofnA->nMaxCustFilter); + ofnW->nMaxCustFilter = ofnA->nMaxCustFilter; + ofnW->nFilterIndex = ofnA->nFilterIndex; + ofnW->nMaxFile = ofnA->nMaxFile; + ofnW->lpstrFile = FD31_DupToW(ofnA->lpstrFile, ofnW->nMaxFile); + ofnW->nMaxFileTitle = ofnA->nMaxFileTitle; + ofnW->lpstrFileTitle = FD31_DupToW(ofnA->lpstrFileTitle, ofnW->nMaxFileTitle); + if (ofnA->lpstrInitialDir) + { + RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpstrInitialDir); + ofnW->lpstrInitialDir = usBuffer.Buffer; + } + if (ofnA->lpstrTitle) + str = ofnA->lpstrTitle; + else + /* Allocates default title (FIXME : get it from resource) */ + str = open ? "Open File" : "Save as"; + RtlCreateUnicodeStringFromAsciiz (&usBuffer,str); + ofnW->lpstrTitle = usBuffer.Buffer; + ofnW->Flags = ofnA->Flags; + ofnW->nFileOffset = ofnA->nFileOffset; + ofnW->nFileExtension = ofnA->nFileExtension; + ofnW->lpstrDefExt = FD31_DupToW(ofnA->lpstrDefExt, 3); + if ((ofnA->Flags & OFN_ENABLETEMPLATE) && (ofnA->lpTemplateName)) + { + if (HIWORD(ofnA->lpTemplateName)) + { + RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpTemplateName); + ofnW->lpTemplateName = usBuffer.Buffer; + } + else /* numbered resource */ + ofnW->lpTemplateName = (LPWSTR) ofnA->lpTemplateName; + } +} + + +/************************************************************************ + * FD31_FreeOfnW [internal] + * Undo all allocations done by FD31_MapOfnStructA + */ +void FD31_FreeOfnW(LPOPENFILENAMEW ofnW) +{ + if (ofnW->lpstrFilter) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrFilter); + if (ofnW->lpstrCustomFilter) HeapFree(GetProcessHeap(), 0, ofnW->lpstrCustomFilter); + if (ofnW->lpstrFile) HeapFree(GetProcessHeap(), 0, ofnW->lpstrFile); + if (ofnW->lpstrFileTitle) HeapFree(GetProcessHeap(), 0, ofnW->lpstrFileTitle); + if (ofnW->lpstrInitialDir) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrInitialDir); + if (ofnW->lpstrTitle) HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrTitle); + if ((ofnW->lpTemplateName) && (HIWORD(ofnW->lpTemplateName))) + HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpTemplateName); +} + +/************************************************************************ + * FD31_DestroyPrivate [internal] + * destroys the private object + */ +void FD31_DestroyPrivate(PFD31_DATA lfs) +{ + HWND hwnd; + if (!lfs) return; + hwnd = lfs->hwnd; + TRACE("destroying private allocation %p\n", lfs); + lfs->callbacks->Destroy(lfs); + HeapFree(GetProcessHeap(), 0, lfs); + RemovePropA(hwnd, FD31_OFN_PROP); +} + +/************************************************************************ + * FD31_AllocPrivate [internal] + * allocate a private object to hold 32 bits Unicode + * structure that will be used throughtout the calls, while + * keeping available the original structures and a few variables + * On entry : type = dialog procedure type (16,32A,32W) + * dlgType = dialog type (open or save) + */ +PFD31_DATA FD31_AllocPrivate(LPARAM lParam, UINT dlgType, + PFD31_CALLBACKS callbacks, DWORD data) +{ + PFD31_DATA lfs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FD31_DATA)); + + TRACE("alloc private buf %p\n", lfs); + if (!lfs) return NULL; + lfs->hook = FALSE; + lfs->lParam = lParam; + lfs->open = (dlgType == OPEN_DIALOG); + lfs->callbacks = callbacks; + if (! lfs->callbacks->Init(lParam, lfs, data)) + { + FD31_DestroyPrivate(lfs); + return NULL; + } + lfs->lbselchstring = RegisterWindowMessageA(LBSELCHSTRINGA); + lfs->fileokstring = RegisterWindowMessageA(FILEOKSTRINGA); + + return lfs; +} + +/*********************************************************************** + * FD31_WMInitDialog [internal] + */ + +LONG FD31_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + int i, n; + WCHAR tmpstr[BUFFILE]; + LPWSTR pstr, old_pstr; + LPOPENFILENAMEW ofn; + PFD31_DATA lfs = (PFD31_DATA) lParam; + + if (!lfs) return FALSE; + SetPropA(hWnd, FD31_OFN_PROP, (HANDLE)lfs); + lfs->hwnd = hWnd; + ofn = &lfs->ofnW; + + TRACE("flags=%lx initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir)); + + SetWindowTextW( hWnd, ofn->lpstrTitle ); + /* read custom filter information */ + if (ofn->lpstrCustomFilter) + { + pstr = ofn->lpstrCustomFilter; + n = 0; + TRACE("lpstrCustomFilter = %p\n", pstr); + while(*pstr) + { + old_pstr = pstr; + i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, + (LPARAM)(ofn->lpstrCustomFilter) + n ); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + TRACE("add str=%s associated to %s\n", + debugstr_w(old_pstr), debugstr_w(pstr)); + SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + } + } + /* read filter information */ + if (ofn->lpstrFilter) { + pstr = (LPWSTR) ofn->lpstrFilter; + n = 0; + while(*pstr) { + old_pstr = pstr; + i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, + (LPARAM)(ofn->lpstrFilter + n) ); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + TRACE("add str=%s associated to %s\n", + debugstr_w(old_pstr), debugstr_w(pstr)); + SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); + n += lstrlenW(pstr) + 1; + pstr += lstrlenW(pstr) + 1; + } + } + /* set default filter */ + if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL) + ofn->nFilterIndex = 1; + SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0); + lstrcpynW(tmpstr, FD31_GetFileType(ofn->lpstrCustomFilter, + (LPWSTR)ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE); + TRACE("nFilterIndex = %ld, SetText of edt1 to %s\n", + ofn->nFilterIndex, debugstr_w(tmpstr)); + SetDlgItemTextW( hWnd, edt1, tmpstr ); + /* get drive list */ + *tmpstr = 0; + DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE); + /* read initial directory */ + /* FIXME: Note that this is now very version-specific (See MSDN description of + * the OPENFILENAME structure). For example under 2000/XP any path in the + * lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME + */ + if (ofn->lpstrInitialDir != NULL) + { + int len; + lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511); + len = lstrlenW(tmpstr); + if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') { + tmpstr[len]='\\'; + tmpstr[len+1]='\0'; + } + } + else + *tmpstr = 0; + if (!FD31_ScanDir(hWnd, tmpstr)) { + *tmpstr = 0; + if (!FD31_ScanDir(hWnd, tmpstr)) + WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr)); + } + /* select current drive in combo 2, omit missing drives */ + { + char dir[MAX_PATH]; + char str[4] = "a:\\"; + GetCurrentDirectoryA( sizeof(dir), dir ); + for(i = 0, n = -1; i < 26; i++) + { + str[0] = 'a' + i; + if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++; + if (toupper(str[0]) == toupper(dir[0])) break; + } + } + SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0); + if (!(ofn->Flags & OFN_SHOWHELP)) + ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE); + if (ofn->Flags & OFN_HIDEREADONLY) + ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); + if (lfs->hook) + return (BOOL) FD31_CallWindowProc(lfs, WM_INITDIALOG, wParam, lfs->lParam); + return TRUE; +} + +int FD31_GetFldrHeight(void) +{ + return fldrHeight; +} diff --git a/reactos/lib/comdlg32/filedlg31.h b/reactos/lib/comdlg32/filedlg31.h new file mode 100644 index 00000000000..f646cb80db0 --- /dev/null +++ b/reactos/lib/comdlg32/filedlg31.h @@ -0,0 +1,67 @@ +/* + * Win3.1 style File Dialog interface (32 bit) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _WINE_DLL_FILEDLG31_H +#define _WINE_DLL_FILEDLG31_H + +#define FD31_OFN_PROP "FILEDLG_OFN" + +/* Forward declare */ +typedef struct tagFD31_DATA *PFD31_DATA; + +typedef struct tagFD31_CALLBACKS +{ + BOOL (CALLBACK *Init)(LPARAM lParam, PFD31_DATA lfs, DWORD data); + BOOL (CALLBACK *CWP)(PFD31_DATA lfs, UINT wMsg, WPARAM wParam, + LPARAM lParam); /* CWP instead of CallWindowProc to avoid macro expansion */ + void (CALLBACK *UpdateResult)(PFD31_DATA lfs); + void (CALLBACK *UpdateFileTitle)(PFD31_DATA lfs); + LRESULT (CALLBACK *SendLbGetCurSel)(PFD31_DATA lfs); + void (CALLBACK *Destroy)(PFD31_DATA lfs); +} FD31_CALLBACKS, *PFD31_CALLBACKS; + +typedef struct tagFD31_DATA +{ + HWND hwnd; /* file dialog window handle */ + BOOL hook; /* TRUE if the dialog is hooked */ + UINT lbselchstring; /* registered message id */ + UINT fileokstring; /* registered message id */ + LPARAM lParam; /* save original lparam */ + LPCVOID template; /* template for 32 bits resource */ + BOOL open; /* TRUE if open dialog, FALSE if save dialog */ + OPENFILENAMEW ofnW; /* copy of original structure or work struct */ + LPVOID private1632; /* 16/32 bit caller private data */ + PFD31_CALLBACKS callbacks; /* callbacks to handle 16/32 bit differences */ +} FD31_DATA; + +extern BOOL FD31_Init(void); +extern PFD31_DATA FD31_AllocPrivate(LPARAM lParam, UINT dlgType, + PFD31_CALLBACKS callbacks, DWORD data); +extern void FD31_DestroyPrivate(PFD31_DATA lfs); +extern void FD31_MapOfnStructA(LPOPENFILENAMEA ofnA, LPOPENFILENAMEW ofnW, BOOL open); +extern void FD31_FreeOfnW(LPOPENFILENAMEW ofnW); +extern BOOL FD31_CallWindowProc(PFD31_DATA lfs, UINT wMsg, WPARAM wParam, + LPARAM lParam); +extern LONG FD31_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam); +extern LONG FD31_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam, + int savedlg, LPDRAWITEMSTRUCT lpdis); +extern LRESULT FD31_WMCommand(HWND hWnd, LPARAM lParam, UINT notification, + UINT control, PFD31_DATA lfs); +extern int FD31_GetFldrHeight(void); + +#endif /* _WINE_DLL_FILEDLG31_H */ diff --git a/reactos/lib/comdlg32/winehq2ros.patch b/reactos/lib/comdlg32/winehq2ros.patch index fa9408763a0..78a919fb100 100644 --- a/reactos/lib/comdlg32/winehq2ros.patch +++ b/reactos/lib/comdlg32/winehq2ros.patch @@ -1,96 +1,3 @@ -Index: Makefile.in -=================================================================== -RCS file: /home/wine/wine/dlls/commdlg/Makefile.in,v -retrieving revision 1.39 -diff -u -r1.39 Makefile.in ---- Makefile.in 12 Apr 2004 22:03:55 -0000 1.39 -+++ Makefile.in 16 Jun 2004 07:02:56 -0000 -@@ -13,7 +13,6 @@ - cdlg32.c \ - colordlg.c \ - filedlg.c \ -- filedlg16.c \ - filedlgbrowser.c \ - finddlg32.c \ - filetitle.c \ -@@ -22,6 +21,7 @@ - - C_SRCS16 = \ - colordlg16.c \ -+ filedlg16.c \ - finddlg.c \ - fontdlg16.c \ - generic.c \ -Index: filedlg.c -=================================================================== -RCS file: /home/wine/wine/dlls/commdlg/filedlg.c,v -retrieving revision 1.80 -diff -u -r1.80 filedlg.c ---- filedlg.c 12 May 2004 00:12:04 -0000 1.80 -+++ filedlg.c 16 Jun 2004 07:02:57 -0000 -@@ -3287,6 +3287,7 @@ - BOOL WINAPI GetOpenFileNameA( - LPOPENFILENAMEA ofn) /* [in/out] address of init structure */ - { -+#if 0 /* FIXME GetFileName31A uses 16 bit stuff */ - BOOL win16look = FALSE; - - if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3295,6 +3296,7 @@ - if (win16look) - return GetFileName31A(ofn, OPEN_DIALOG); - else -+#endif - return GetFileDialog95A(ofn, OPEN_DIALOG); - } - -@@ -3311,6 +3313,7 @@ - BOOL WINAPI GetOpenFileNameW( - LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ - { -+#if 0 /* FIXME GetFileName31W uses 16 bit stuff */ - BOOL win16look = FALSE; - - if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3319,6 +3322,7 @@ - if (win16look) - return GetFileName31W(ofn, OPEN_DIALOG); - else -+#endif - return GetFileDialog95W(ofn, OPEN_DIALOG); - } - -@@ -3336,6 +3340,7 @@ - BOOL WINAPI GetSaveFileNameA( - LPOPENFILENAMEA ofn) /* [in/out] address of init structure */ - { -+#if 0 /* FIXME GetFileName31A uses 16 bit stuff */ - BOOL win16look = FALSE; - - if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3344,6 +3349,7 @@ - if (win16look) - return GetFileName31A(ofn, SAVE_DIALOG); - else -+#endif - return GetFileDialog95A(ofn, SAVE_DIALOG); - } - -@@ -3360,6 +3366,7 @@ - BOOL WINAPI GetSaveFileNameW( - LPOPENFILENAMEW ofn) /* [in/out] address of init structure */ - { -+#if 0 /* FIXME GetFileName31W uses 16 bit stuff */ - BOOL win16look = FALSE; - - if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE)) -@@ -3368,5 +3375,6 @@ - if (win16look) - return GetFileName31W(ofn, SAVE_DIALOG); - else -+#endif - return GetFileDialog95W(ofn, SAVE_DIALOG); - } Index: printdlg.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/printdlg.c,v From c6ec21e2078e60c1f49f6aa9f6618a790f0d8fb8 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 14 Jul 2004 14:25:31 +0000 Subject: [PATCH 289/356] - Move access checks from NtAccessCheck() to SeAccessCheck(). - Check for 'take ownership' privilege. svn path=/trunk/; revision=10111 --- reactos/ntoskrnl/include/internal/se.h | 7 + reactos/ntoskrnl/se/semgr.c | 342 +++++++++++++------------ 2 files changed, 179 insertions(+), 170 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/se.h b/reactos/ntoskrnl/include/internal/se.h index f98ccaacaf8..b9d7e338696 100644 --- a/reactos/ntoskrnl/include/internal/se.h +++ b/reactos/ntoskrnl/include/internal/se.h @@ -136,6 +136,13 @@ SeReleaseLuidAndAttributesArray(PLUID_AND_ATTRIBUTES Privilege, KPROCESSOR_MODE PreviousMode, ULONG a); +BOOLEAN +SepPrivilegeCheck(PACCESS_TOKEN Token, + PLUID_AND_ATTRIBUTES Privileges, + ULONG PrivilegeCount, + ULONG PrivilegeControl, + KPROCESSOR_MODE PreviousMode); + #endif /* __NTOSKRNL_INCLUDE_INTERNAL_SE_H */ diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 88c0a0e726a..ebc38ec27ba 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -1,4 +1,4 @@ -/* $Id: semgr.c,v 1.32 2004/07/13 16:59:35 ekohl Exp $ +/* $Id: semgr.c,v 1.33 2004/07/14 14:25:31 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,6 +15,7 @@ #include #include +#define NDEBUG #include #define TAG_SXPT TAG('S', 'X', 'P', 'T') @@ -273,50 +274,55 @@ SeDeassignSecurity(PSECURITY_DESCRIPTOR* SecurityDescriptor) #if 0 -VOID SepGetDefaultsSubjectContext(PSECURITY_SUBJECT_CONTEXT SubjectContext, - PSID* Owner, - PSID* PrimaryGroup, - PSID* ProcessOwner, - PSID* ProcessPrimaryGroup, - PACL* DefaultDacl) +VOID +SepGetDefaultsSubjectContext(PSECURITY_SUBJECT_CONTEXT SubjectContext, + PSID* Owner, + PSID* PrimaryGroup, + PSID* ProcessOwner, + PSID* ProcessPrimaryGroup, + PACL* DefaultDacl) { - PACCESS_TOKEN Token; - - if (SubjectContext->ClientToken != NULL) - { + PACCESS_TOKEN Token; + + if (SubjectContext->ClientToken != NULL) + { Token = SubjectContext->ClientToken; - } - else - { + } + else + { Token = SubjectContext->PrimaryToken; - } - *Owner = Token->UserAndGroups[Token->DefaultOwnerIndex].Sid; - *PrimaryGroup = Token->PrimaryGroup; - *DefaultDacl = Token->DefaultDacl; - *ProcessOwner = SubjectContext->PrimaryToken-> - UserAndGroups[Token->DefaultOwnerIndex].Sid; - *ProcessPrimaryGroup = SubjectContext->PrimaryToken->PrimaryGroup; + } + *Owner = Token->UserAndGroups[Token->DefaultOwnerIndex].Sid; + *PrimaryGroup = Token->PrimaryGroup; + *DefaultDacl = Token->DefaultDacl; + *ProcessOwner = SubjectContext->PrimaryToken-> + UserAndGroups[Token->DefaultOwnerIndex].Sid; + *ProcessPrimaryGroup = SubjectContext->PrimaryToken->PrimaryGroup; } -NTSTATUS SepInheritAcl(PACL Acl, - BOOLEAN IsDirectoryObject, - PSID Owner, - PSID PrimaryGroup, - PACL DefaultAcl, - PSID ProcessOwner, - PSID ProcessGroup, - PGENERIC_MAPPING GenericMapping) + +NTSTATUS +SepInheritAcl(PACL Acl, + BOOLEAN IsDirectoryObject, + PSID Owner, + PSID PrimaryGroup, + PACL DefaultAcl, + PSID ProcessOwner, + PSID ProcessGroup, + PGENERIC_MAPPING GenericMapping) { - if (Acl == NULL) - { + if (Acl == NULL) + { return(STATUS_UNSUCCESSFUL); - } - if (Acl->AclRevision != 2 && - Acl->AclRevision != 3 ) - { + } + + if (Acl->AclRevision != 2 && + Acl->AclRevision != 3 ) + { return(STATUS_UNSUCCESSFUL); - } - + } + + } #endif @@ -448,64 +454,117 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PACCESS_MASK GrantedAccess, OUT PNTSTATUS AccessStatus) { - ULONG i; - PACL Dacl; - BOOLEAN Present; - BOOLEAN Defaulted; - NTSTATUS Status; - PACE CurrentAce; - PSID Sid; - ACCESS_MASK CurrentAccess; + LUID_AND_ATTRIBUTES Privilege; + ACCESS_MASK CurrentAccess; + PACCESS_TOKEN Token; + ULONG i; + PACL Dacl; + BOOLEAN Present; + BOOLEAN Defaulted; + PACE CurrentAce; + PSID Sid; + NTSTATUS Status; - CurrentAccess = PreviouslyGrantedAccess; + CurrentAccess = PreviouslyGrantedAccess; - /* - * Check the DACL - */ - Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, - &Present, - &Dacl, + Token = SubjectSecurityContext->ClientToken ? + SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; + + /* Get the DACL */ + Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, + &Present, + &Dacl, + &Defaulted); + if (!NT_SUCCESS(Status)) + { + *AccessStatus = Status; + return FALSE; + } + + /* RULE 1: Grant desired access if the object is unprotected */ + if (Dacl == NULL) + { + *GrantedAccess = DesiredAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + + CurrentAccess = PreviouslyGrantedAccess; + + /* RULE 2: Check token for 'take ownership' privilege */ + Privilege.Luid = SeTakeOwnershipPrivilege; + Privilege.Attributes = SE_PRIVILEGE_ENABLED; + + if (SepPrivilegeCheck(Token, + &Privilege, + 1, + PRIVILEGE_SET_ALL_NECESSARY, + AccessMode)) + { + CurrentAccess |= WRITE_OWNER; + if (DesiredAccess == CurrentAccess) + { + *GrantedAccess = CurrentAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + } + + /* RULE 3: Check whether the token is the owner */ + Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, + &Sid, &Defaulted); - if (!NT_SUCCESS(Status)) - { - *AccessStatus = Status; - return FALSE; - } + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); + *AccessStatus = Status; + return FALSE; + } - CurrentAce = (PACE)(Dacl + 1); - for (i = 0; i < Dacl->AceCount; i++) - { - Sid = (PSID)(CurrentAce + 1); - if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) - { - if (SepSidInToken(SubjectSecurityContext->ClientToken, Sid)) - { - *AccessStatus = STATUS_ACCESS_DENIED; - *GrantedAccess = 0; - return(STATUS_SUCCESS); - } - } + if (SepSidInToken(Token, Sid)) + { + CurrentAccess |= (READ_CONTROL | WRITE_DAC); + if (DesiredAccess == CurrentAccess) + { + *GrantedAccess = CurrentAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + } - if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) - { - if (SepSidInToken(SubjectSecurityContext->ClientToken, Sid)) - { - CurrentAccess |= CurrentAce->AccessMask; - } - } - } - if (!(CurrentAccess & DesiredAccess) && - !((~CurrentAccess) & DesiredAccess)) - { - *AccessStatus = STATUS_ACCESS_DENIED; - } - else - { - *AccessStatus = STATUS_SUCCESS; - } - *GrantedAccess = CurrentAccess; + /* RULE 4: Grant rights according to the DACL */ + CurrentAce = (PACE)(Dacl + 1); + for (i = 0; i < Dacl->AceCount; i++) + { + Sid = (PSID)(CurrentAce + 1); + if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) + { + if (SepSidInToken(Token, Sid)) + { + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return TRUE; + } + } - return TRUE; + if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) + { + if (SepSidInToken(Token, Sid)) + { + CurrentAccess |= CurrentAce->AccessMask; + } + } + } + + DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", + CurrentAccess, DesiredAccess); + + *GrantedAccess = CurrentAccess & DesiredAccess; + + *AccessStatus = + (*GrantedAccess == DesiredAccess) ? STATUS_SUCCESS : STATUS_ACCESS_DENIED; + + return TRUE; } @@ -519,15 +578,9 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PACCESS_MASK GrantedAccess, OUT PNTSTATUS AccessStatus) { + SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; KPROCESSOR_MODE PreviousMode; PACCESS_TOKEN Token; - BOOLEAN Present; - BOOLEAN Defaulted; - PACE CurrentAce; - PACL Dacl; - PSID Sid; - ACCESS_MASK CurrentAccess; - ULONG i; NTSTATUS Status; DPRINT("NtAccessCheck() called\n"); @@ -568,89 +621,38 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_ACCESS_VIOLATION; } - /* Get the DACL */ - Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, - &Present, - &Dacl, - &Defaulted); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlGetDaclSecurityDescriptor() failed (Status %lx)\n", Status); - ObDereferenceObject(Token); - return Status; - } + RtlZeroMemory(&SubjectSecurityContext, + sizeof(SECURITY_SUBJECT_CONTEXT)); + SubjectSecurityContext.ClientToken = Token; + SubjectSecurityContext.ImpersonationLevel = Token->ImpersonationLevel; - /* RULE 1: Grant desired access if the object is unprotected */ - if (Dacl == NULL) + /* FIXME: Lock subject context */ + + if (!SeAccessCheck(SecurityDescriptor, + &SubjectSecurityContext, + TRUE, + DesiredAccess, + 0, + &PrivilegeSet, + GenericMapping, + PreviousMode, + GrantedAccess, + AccessStatus)) { - *GrantedAccess = DesiredAccess; - *AccessStatus = STATUS_SUCCESS; - return STATUS_SUCCESS; + Status = *AccessStatus; + } + else + { + Status = STATUS_SUCCESS; } - CurrentAccess = 0; - - /* FIXME: RULE 2: Check token for 'take ownership' privilege */ - - /* RULE 3: Check whether the token is the owner */ - Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, - &Sid, - &Defaulted); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); - ObDereferenceObject(Token); - return Status; - } - - if (SepSidInToken(Token, Sid)) - { - CurrentAccess |= (READ_CONTROL | WRITE_DAC); - if (DesiredAccess == CurrentAccess) - { - *AccessStatus = STATUS_SUCCESS; - *GrantedAccess = CurrentAccess; - return STATUS_SUCCESS; - } - } - - /* RULE 4: Grant rights according to the DACL */ - CurrentAce = (PACE)(Dacl + 1); - for (i = 0; i < Dacl->AceCount; i++) - { - Sid = (PSID)(CurrentAce + 1); - if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) - { - *AccessStatus = STATUS_ACCESS_DENIED; - *GrantedAccess = 0; - return STATUS_SUCCESS; - } - } - - if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) - { - CurrentAccess |= CurrentAce->AccessMask; - } - } - } - - DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", - CurrentAccess, DesiredAccess); + /* FIXME: Unlock subject context */ ObDereferenceObject(Token); - *GrantedAccess = CurrentAccess & DesiredAccess; - - *AccessStatus = - (*GrantedAccess == DesiredAccess) ? STATUS_SUCCESS : STATUS_ACCESS_DENIED; - DPRINT("NtAccessCheck() done\n"); - return STATUS_SUCCESS; + return Status; } /* EOF */ From 93cfddbb389df10177cc5124cdb9f661fe57794c Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 14 Jul 2004 16:24:00 +0000 Subject: [PATCH 290/356] Added licensing page to usetup. svn path=/trunk/; revision=10112 --- reactos/subsys/system/usetup/usetup.c | 63 +++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/usetup/usetup.c b/reactos/subsys/system/usetup/usetup.c index b52cc8308a2..7e2a670f83d 100644 --- a/reactos/subsys/system/usetup/usetup.c +++ b/reactos/subsys/system/usetup/usetup.c @@ -56,6 +56,7 @@ typedef enum _PAGE_NUMBER { START_PAGE, INTRO_PAGE, + LICENSE_PAGE, INSTALL_INTRO_PAGE, // SCSI_CONTROLLER_PAGE, @@ -707,9 +708,10 @@ IntroPage(PINPUT_RECORD Ir) SetTextXY(6, 12, "computer and prepares the second part of the setup."); SetTextXY(8, 15, "\x07 Press ENTER to install ReactOS."); - SetTextXY(8, 17, "\x07 Press E to start the emergency console."); - SetTextXY(8, 19, "\x07 Press R to repair ReactOS."); - SetTextXY(8, 21, "\x07 Press F3 to quit without installing ReactOS."); + SetTextXY(8, 17, "\x07 Press L to view the licensing terms for ReactOS."); + SetTextXY(8, 19, "\x07 Press E to start the emergency console."); + SetTextXY(8, 21, "\x07 Press R to repair ReactOS."); + SetTextXY(8, 23, "\x07 Press F3 to quit without installing ReactOS."); SetStatusText(" ENTER = Continue F3 = Quit"); @@ -733,6 +735,10 @@ IntroPage(PINPUT_RECORD Ir) { return INSTALL_INTRO_PAGE; } + else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* L */ + { + return LICENSE_PAGE; + } else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'E') /* E */ { return EMERGENCY_INTRO_PAGE; @@ -746,6 +752,52 @@ IntroPage(PINPUT_RECORD Ir) return INTRO_PAGE; } +/* + * License Page + * RETURNS + * Back to main setup page. + */ +static PAGE_NUMBER +LicensePage(PINPUT_RECORD Ir) +{ + SetHighlightedTextXY(6, 8, "Licensing:"); + + SetTextXY(8, 11, "The ReactOS System is licensed under the terms of the"); + SetTextXY(8, 12, "GNU GPL with parts containing code from other compatible"); + SetTextXY(8, 13, "licenses such as the X11 or BSD and GNU LGPL licenses."); + SetTextXY(8, 14, "All software that is part of the ReactOS system is"); + SetTextXY(8, 15, "therefore released under the GNU GPL as well as maintaining"); + SetTextXY(8, 16, "the original license."); + + SetTextXY(8, 18, "This software comes with NO WARRANTY or restrictions on usage"); + SetTextXY(8, 19, "save applicable local and international law. The licensing of"); + SetTextXY(8, 20, "ReactOS only covers distribution to third parties."); + + SetTextXY(8, 22, "If for some resion you did not receive a copy of the"); + SetTextXY(8, 23, "GNU General Public License with ReactOS please visit"); + SetHighlightedTextXY(8, 25, "http://www.gnu.org/licenses/licenses.html"); + + SetStatusText("ENTER = Continue F3 = Quit"); + + while (TRUE) + { + ConInKey(Ir); + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + return QUIT_PAGE; + break; + } + else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + { + return INTRO_PAGE; + } + } + + return LICENSE_PAGE; +} static PAGE_NUMBER EmergencyIntroPage(PINPUT_RECORD Ir) @@ -3686,6 +3738,11 @@ NtProcessStartup(PPEB Peb) Page = StartPage(&Ir); break; + /* License page */ + case LICENSE_PAGE: + Page = LicensePage(&Ir); + break; + /* Intro page */ case INTRO_PAGE: Page = IntroPage(&Ir); From d1d2a0a14a17c82c0c8b4b5b4f52d05d75e8ccf6 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 14 Jul 2004 17:47:03 +0000 Subject: [PATCH 291/356] Use Bitstream Vera Sans for Helv subsititute. This makes the Run dialog readable. Thanks to Filip Navara. svn path=/trunk/; revision=10114 --- reactos/bootdata/hivesft.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index 16bda7e32cd..97f688374f0 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -56,5 +56,5 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Times Ne HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Sans Serif",0x00000000,"Bitstream Vera Sans" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Shell Dlg",0x00000000,"Bitstream Vera Sans" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","MS Shell Dlg 2",0x00000000,"Bitstream Vera Sans" - +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Helv",0x00000000,"Bitstream Vera Sans" ; EOF From d0ba990059db44a703ea7cbe0236c6aa6f148d78 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 14 Jul 2004 18:30:54 +0000 Subject: [PATCH 292/356] Sync msacm32 with Winehq cvs. will merge my tweaks soon. This gets Winamp5 loading. svn path=/trunk/; revision=10115 --- reactos/lib/msacm/Makefile.in | 2 + reactos/lib/msacm/Makefile.ros | 33 +- reactos/lib/msacm/Makefile.ros-template | 6 +- reactos/lib/msacm/driver.c | 185 +++- reactos/lib/msacm/format.c | 34 +- reactos/lib/msacm/internal.c | 78 +- reactos/lib/msacm/makefile | 16 +- reactos/lib/msacm/msacm.rc | 2 + reactos/lib/msacm/msacm32_main.c | 12 + reactos/lib/msacm/msacm_Es.rc | 56 ++ reactos/lib/msacm/msacm_It.rc | 2 +- reactos/lib/msacm/msacm_Ja.rc | 56 ++ reactos/lib/msacm/pcmconverter.c | 1223 +++++++++++++++++++++++ reactos/lib/msacm/stream.c | 478 +++++++++ reactos/lib/msacm/wineacm.h | 363 +++++++ 15 files changed, 2418 insertions(+), 128 deletions(-) create mode 100644 reactos/lib/msacm/msacm_Es.rc create mode 100644 reactos/lib/msacm/msacm_Ja.rc create mode 100644 reactos/lib/msacm/pcmconverter.c create mode 100644 reactos/lib/msacm/stream.c create mode 100644 reactos/lib/msacm/wineacm.h diff --git a/reactos/lib/msacm/Makefile.in b/reactos/lib/msacm/Makefile.in index f4cb7c1376c..247b6816e67 100644 --- a/reactos/lib/msacm/Makefile.in +++ b/reactos/lib/msacm/Makefile.in @@ -22,6 +22,8 @@ C_SRCS16 = \ RC_SRCS = msacm.rc +SUBDIRS = tests + @MAKE_DLL_RULES@ ### Dependencies: diff --git a/reactos/lib/msacm/Makefile.ros b/reactos/lib/msacm/Makefile.ros index 3fc9715f3e9..e53d73cd5ac 100644 --- a/reactos/lib/msacm/Makefile.ros +++ b/reactos/lib/msacm/Makefile.ros @@ -1,21 +1,12 @@ -# $Id: Makefile.ros,v 1.1 2004/03/10 15:22:44 silverblade Exp $ - -TARGET_NAME = msacm32 - -TARGET_OBJECTS = driver.o filter.o format.o internal.o msacm32_main.o pcmconverter.o stream.o - -TARGET_CFLAGS = -D__REACTOS__ - -TARGET_SDKLIBS = winmm.a libwine.a advapi32.a kernel32.a ws2_32.a wine_uuid.a ntdll.a - -TARGET_BASE = 0x77300000 - -TARGET_RC_SRCS = msacm.rc -TARGET_RC_BINSRC = msacm.rc -TARGET_RC_BINARIES = - -default: all - -DEP_OBJECTS = $(TARGET_OBJECTS) - -include $(TOOLS_PATH)/depend.mk +# $Id: Makefile.ros,v 1.2 2004/07/14 18:30:54 sedwards Exp $ +TARGET_NAME = msacm32 +TARGET_OBJECTS = driver.o filter.o format.o internal.o msacm32_main.o pcmconverter.o stream.o +TARGET_CFLAGS = -D__REACTOS__ +TARGET_SDKLIBS = winmm.a user32.a advapi32.a kernel32.a ntdll.a libwine.a +TARGET_BASE = $(TARGET_BASE_LIB_MSACM) +TARGET_RC_SRCS = msacm.rc +TARGET_RC_BINSRC = +TARGET_RC_BINARIES = +default: all +DEP_OBJECTS = $(TARGET_OBJECTS) +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/msacm/Makefile.ros-template b/reactos/lib/msacm/Makefile.ros-template index ad08d203471..b9a2fa1f289 100644 --- a/reactos/lib/msacm/Makefile.ros-template +++ b/reactos/lib/msacm/Makefile.ros-template @@ -1,12 +1,12 @@ -# $Id: Makefile.ros-template,v 1.2 2004/05/29 21:24:44 hbirr Exp $ +# $Id: Makefile.ros-template,v 1.3 2004/07/14 18:30:54 sedwards Exp $ -TARGET_NAME = iphlpapi +TARGET_NAME = msacm32 TARGET_OBJECTS = @C_SRCS@ TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -TARGET_SDKLIBS = @IMPORTS@ libwine.a advapi32.a kernel32.a ws2_32.a wine_uuid.a ntdll.a +TARGET_SDKLIBS = @IMPORTS@ ntdll.a libwine.a TARGET_BASE = $(TARGET_BASE_LIB_MSACM) diff --git a/reactos/lib/msacm/driver.c b/reactos/lib/msacm/driver.c index b473f9c4d73..dab014f4db3 100644 --- a/reactos/lib/msacm/driver.c +++ b/reactos/lib/msacm/driver.c @@ -49,19 +49,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(msacm); MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd) { - if (!phadid) + TRACE("(%p, %p, %08lx, %08lx, %08lx)\n", + phadid, hinstModule, lParam, dwPriority, fdwAdd); + + if (!phadid) { + WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; + } /* Check if any unknown flags */ if (fdwAdd & ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND| - ACM_DRIVERADDF_GLOBAL)) + ACM_DRIVERADDF_GLOBAL)) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } /* Check if any incompatible flags */ if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) && - (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND)) + (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND)) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a * LoadDriver on it, to be sure we can call SendDriverMessage on the @@ -98,12 +107,18 @@ MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose) PWINE_ACMDRIVERID padid; PWINE_ACMDRIVER* tpad; - if (fdwClose) + TRACE("(%p, %08lx)\n", had, fdwClose); + + if (fdwClose) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } pad = MSACM_GetDriver(had); - if (!pad) + if (!pad) { + WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; + } padid = pad->obj.pACMDriverID; @@ -132,29 +147,44 @@ MMRESULT WINAPI acmDriverDetailsA(HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, D MMRESULT mmr; ACMDRIVERDETAILSW addw; + TRACE("(%p, %p, %08lx)\n", hadid, padd, fdwDetails); + + if (!padd) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + if (padd->cbStruct < 4) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + addw.cbStruct = sizeof(addw); mmr = acmDriverDetailsW(hadid, &addw, fdwDetails); if (mmr == 0) { - padd->fccType = addw.fccType; - padd->fccComp = addw.fccComp; - padd->wMid = addw.wMid; - padd->wPid = addw.wPid; - padd->vdwACM = addw.vdwACM; - padd->vdwDriver = addw.vdwDriver; - padd->fdwSupport = addw.fdwSupport; - padd->cFormatTags = addw.cFormatTags; - padd->cFilterTags = addw.cFilterTags; - padd->hicon = addw.hicon; - WideCharToMultiByte( CP_ACP, 0, addw.szShortName, -1, padd->szShortName, - sizeof(padd->szShortName), NULL, NULL ); - WideCharToMultiByte( CP_ACP, 0, addw.szLongName, -1, padd->szLongName, - sizeof(padd->szLongName), NULL, NULL ); - WideCharToMultiByte( CP_ACP, 0, addw.szCopyright, -1, padd->szCopyright, - sizeof(padd->szCopyright), NULL, NULL ); - WideCharToMultiByte( CP_ACP, 0, addw.szLicensing, -1, padd->szLicensing, - sizeof(padd->szLicensing), NULL, NULL ); - WideCharToMultiByte( CP_ACP, 0, addw.szFeatures, -1, padd->szFeatures, - sizeof(padd->szFeatures), NULL, NULL ); + ACMDRIVERDETAILSA padda; + + padda.fccType = addw.fccType; + padda.fccComp = addw.fccComp; + padda.wMid = addw.wMid; + padda.wPid = addw.wPid; + padda.vdwACM = addw.vdwACM; + padda.vdwDriver = addw.vdwDriver; + padda.fdwSupport = addw.fdwSupport; + padda.cFormatTags = addw.cFormatTags; + padda.cFilterTags = addw.cFilterTags; + padda.hicon = addw.hicon; + WideCharToMultiByte( CP_ACP, 0, addw.szShortName, -1, padda.szShortName, + sizeof(padda.szShortName), NULL, NULL ); + WideCharToMultiByte( CP_ACP, 0, addw.szLongName, -1, padda.szLongName, + sizeof(padda.szLongName), NULL, NULL ); + WideCharToMultiByte( CP_ACP, 0, addw.szCopyright, -1, padda.szCopyright, + sizeof(padda.szCopyright), NULL, NULL ); + WideCharToMultiByte( CP_ACP, 0, addw.szLicensing, -1, padda.szLicensing, + sizeof(padda.szLicensing), NULL, NULL ); + WideCharToMultiByte( CP_ACP, 0, addw.szFeatures, -1, padda.szFeatures, + sizeof(padda.szFeatures), NULL, NULL ); + memcpy(padd, &padda, min(padd->cbStruct, sizeof(*padd))); } return mmr; } @@ -167,14 +197,30 @@ MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, D HACMDRIVER acmDrvr; MMRESULT mmr; - if (fdwDetails) + TRACE("(%p, %p, %08lx)\n", hadid, padd, fdwDetails); + + if (!padd) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + if (padd->cbStruct < 4) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + if (fdwDetails) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } mmr = acmDriverOpen(&acmDrvr, hadid, 0); if (mmr == MMSYSERR_NOERROR) { - mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)padd, 0); + ACMDRIVERDETAILSW paddw; + mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)&paddw, 0); acmDriverClose(acmDrvr, 0); + memcpy(padd, &paddw, min(padd->cbStruct, sizeof(*padd))); } return mmr; @@ -188,10 +234,17 @@ MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWOR PWINE_ACMDRIVERID padid; DWORD fdwSupport; - if (!fnCallback) return MMSYSERR_INVALPARAM; + TRACE("(%p, %08lx, %08lx)\n", fnCallback, dwInstance, fdwEnum); - if (fdwEnum & ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) + if (!fnCallback) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + if (fdwEnum & ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) { fdwSupport = padid->fdwSupport; @@ -216,15 +269,23 @@ MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID { PWINE_ACMOBJ pao; - if (!phadid) - return MMSYSERR_INVALPARAM; + TRACE("(%p, %p, %08lx)\n", hao, phadid, fdwDriverID); - if (fdwDriverID) + if (fdwDriverID) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE); - if (!pao) + if (!pao) { + WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; + } + + if (!phadid) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } *phadid = (HACMDRIVERID) pao->pACMDriverID; @@ -237,11 +298,15 @@ MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID */ LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + TRACE("(%p, %04x, %08lx, %08lx\n", had, uMsg, lParam1, lParam2); + if ((uMsg >= ACMDM_USER && uMsg < ACMDM_RESERVED_LOW) || uMsg == ACMDM_DRIVER_ABOUT || uMsg == DRV_QUERYCONFIGURE || uMsg == DRV_CONFIGURE) return MSACM_Message(had, uMsg, lParam1, lParam2); + + WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; } @@ -256,19 +321,27 @@ MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpe TRACE("(%p, %p, %08lu)\n", phad, hadid, fdwOpen); - if (!phad) + if (!phad) { + WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; + } - if (fdwOpen) + if (fdwOpen) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } padid = MSACM_GetDriverID(hadid); - if (!padid) + if (!padid) { + WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; + } pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER)); - if (!pad) + if (!pad) { + WARN("no memory\n"); return MMSYSERR_NOMEM; + } pad->obj.dwType = WINE_ACMOBJ_DRIVER; pad->obj.pACMDriverID = padid; @@ -317,6 +390,7 @@ MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpe return MMSYSERR_NOERROR; gotError: + WARN("failed: ret = %08x\n", ret); if (pad && !pad->hDrvr) HeapFree(MSACM_hHeap, 0, pad); return ret; @@ -335,25 +409,35 @@ MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fd HKEY hPriorityKey; DWORD dwPriorityCounter; + TRACE("(%p, %08lx, %08lx)\n", hadid, dwPriority, fdwPriority); + padid = MSACM_GetDriverID(hadid); - if (!padid) + if (!padid) { + WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; + } /* Check for unknown flags */ if (fdwPriority & ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE| - ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END)) + ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END)) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } /* Check for incompatible flags */ if ((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) && - (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE)) + (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE)) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } /* Check for incompatible flags */ if ((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) && - (fdwPriority & ACM_DRIVERPRIORITYF_END)) + (fdwPriority & ACM_DRIVERPRIORITYF_END)) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } lError = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Microsoft\\Multimedia\\" @@ -361,8 +445,10 @@ MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fd &hPriorityKey ); /* FIXME: Create key */ - if (lError != ERROR_SUCCESS) + if (lError != ERROR_SUCCESS) { + WARN("RegOpenKeyA failed\n"); return MMSYSERR_ERROR; + } for (dwPriorityCounter = 1; ; dwPriorityCounter++) { snprintf(szSubKey, 17, "Priority%ld", dwPriorityCounter); @@ -377,6 +463,7 @@ MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fd RegCloseKey(hPriorityKey); + WARN("RegQueryValueA failed\n"); return MMSYSERR_ERROR; } @@ -387,12 +474,18 @@ MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove) { PWINE_ACMDRIVERID padid; - padid = MSACM_GetDriverID(hadid); - if (!padid) - return MMSYSERR_INVALHANDLE; + TRACE("(%p, %08lx)\n", hadid, fdwRemove); - if (fdwRemove) + padid = MSACM_GetDriverID(hadid); + if (!padid) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } + + if (fdwRemove) { + WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; + } MSACM_UnregisterDriver(padid); diff --git a/reactos/lib/msacm/format.c b/reactos/lib/msacm/format.c index b6825689140..b64f8b0db5d 100644 --- a/reactos/lib/msacm/format.c +++ b/reactos/lib/msacm/format.c @@ -317,8 +317,8 @@ MMRESULT WINAPI acmFormatDetailsA(HACMDRIVER had, PACMFORMATDETAILSA pafd, MMRESULT WINAPI acmFormatDetailsW(HACMDRIVER had, PACMFORMATDETAILSW pafd, DWORD fdwDetails) { MMRESULT mmr; - static WCHAR fmt1[] = {'%','d',' ','H','z',0}; - static WCHAR fmt2[] = {';',' ','%','d',' ','b','i','t','s',0}; + static const WCHAR fmt1[] = {'%','d',' ','H','z',0}; + static const WCHAR fmt2[] = {';',' ','%','d',' ','b','i','t','s',0}; ACMFORMATTAGDETAILSA aftd; TRACE("(%p, %p, %ld)\n", had, pafd, fdwDetails); @@ -411,6 +411,12 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda, ACMFORMATDETAILSW afdw; struct MSACM_FormatEnumWtoA_Instance afei; + if (!pafda) + return MMSYSERR_INVALPARAM; + + if (pafda->cbStruct < sizeof(*pafda)) + return MMSYSERR_INVALPARAM; + memset(&afdw, 0, sizeof(afdw)); afdw.cbStruct = sizeof(afdw); afdw.dwFormatIndex = pafda->dwFormatIndex; @@ -489,7 +495,11 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd, TRACE("(%p, %p, %p, %ld, %ld)\n", had, pafd, fnCallback, dwInstance, fdwEnum); - if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM; + if (!pafd) + return MMSYSERR_INVALPARAM; + + if (pafd->cbStruct < sizeof(*pafd)) + return MMSYSERR_INVALPARAM; if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS| ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE| @@ -731,6 +741,15 @@ MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, ACMFORMATTAGDETAILSW aftdw; struct MSACM_FormatTagEnumWtoA_Instance aftei; + if (!paftda) + return MMSYSERR_INVALPARAM; + + if (paftda->cbStruct < sizeof(*paftda)) + return MMSYSERR_INVALPARAM; + + if (fdwEnum != 0) + return MMSYSERR_INVALFLAG; + memset(&aftdw, 0, sizeof(aftdw)); aftdw.cbStruct = sizeof(aftdw); aftdw.dwFormatTagIndex = paftda->dwFormatTagIndex; @@ -758,7 +777,14 @@ MMRESULT WINAPI acmFormatTagEnumW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, TRACE("(%p, %p, %p, %ld, %ld)\n", had, paftd, fnCallback, dwInstance, fdwEnum); - if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM; + if (!paftd) + return MMSYSERR_INVALPARAM; + + if (paftd->cbStruct < sizeof(*paftd)) + return MMSYSERR_INVALPARAM; + + if (fdwEnum != 0) + return MMSYSERR_INVALFLAG; /* (WS) MSDN info page says that if had != 0, then we should find * the specific driver to get its tags from. Therefore I'm removing diff --git a/reactos/lib/msacm/internal.c b/reactos/lib/msacm/internal.c index d54c7640214..9cb8002a380 100644 --- a/reactos/lib/msacm/internal.c +++ b/reactos/lib/msacm/internal.c @@ -236,7 +236,7 @@ static BOOL MSACM_WriteCache(PWINE_ACMDRIVERID padid) /*********************************************************************** * MSACM_RegisterDriver() */ -PWINE_ACMDRIVERID MSACM_RegisterDriver(LPWSTR pszDriverAlias, LPWSTR pszFileName, +PWINE_ACMDRIVERID MSACM_RegisterDriver(LPCWSTR pszDriverAlias, LPCWSTR pszFileName, HINSTANCE hinstModule) { PWINE_ACMDRIVERID padid; @@ -283,48 +283,50 @@ PWINE_ACMDRIVERID MSACM_RegisterDriver(LPWSTR pszDriverAlias, LPWSTR pszFileName */ void MSACM_RegisterAllDrivers(void) { - LPWSTR pszBuffer; - DWORD dwBufferLength; - static WCHAR msacm32[] = {'m','s','a','c','m','3','2','.','d','l','l','\0'}; - static WCHAR msacmW[] = {'M','S','A','C','M','.'}; - static WCHAR drv32[] = {'d','r','i','v','e','r','s','3','2','\0'}; - static WCHAR sys[] = {'s','y','s','t','e','m','.','i','n','i','\0'}; + static const WCHAR msacm32[] = {'m','s','a','c','m','3','2','.','d','l','l','\0'}; + static const WCHAR msacmW[] = {'M','S','A','C','M','.'}; + static const WCHAR drv32[] = {'d','r','i','v','e','r','s','3','2','\0'}; + static const WCHAR sys[] = {'s','y','s','t','e','m','.','i','n','i','\0'}; + static const WCHAR drvkey[] = {'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s',' ','N','T','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'D','r','i','v','e','r','s','3','2','\0'}; + DWORD i, cnt = 0, bufLen, lRet; + WCHAR buf[2048], *name, *s; + FILETIME lastWrite; + HKEY hKey; - /* FIXME - * What if the user edits system.ini while the program is running? - * Does Windows handle that? - */ - if (MSACM_pFirstACMDriverID) - return; + /* FIXME: What if the user edits system.ini while the program is running? + * Does Windows handle that? */ + if (MSACM_pFirstACMDriverID) return; - /* FIXME: Does not work! How do I determine the section length? */ - dwBufferLength = 1024; -/* EPP GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */ - - pszBuffer = (LPWSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength * sizeof(WCHAR)); - if (GetPrivateProfileSectionW(drv32, pszBuffer, dwBufferLength, sys)) - { - LPWSTR s = pszBuffer, s2; - - while (*s) - { - CharUpperBuffW(s, 6); - if (memcmp(s, msacmW, 6 * sizeof(WCHAR)) == 0) - { - s2 = s; - while (*s2 != '\0' && *s2 != '=') s2++; - if (*s2) - { - *s2 = '\0'; - MSACM_RegisterDriver(s, s2 + 1, 0); - *s2 = '='; - } - } - s += strlenW(s) + 1; /* Either next char or \0 */ + lRet = RegOpenKeyExW(HKEY_LOCAL_MACHINE, drvkey, 0, KEY_QUERY_VALUE, &hKey); + if (lRet == ERROR_SUCCESS) { + RegQueryInfoKeyW( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); + for (i = 0; i < cnt; i++) { + bufLen = sizeof(buf) / sizeof(buf[0]); + lRet = RegEnumKeyExW(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); + if (lRet != ERROR_SUCCESS) continue; + if (strncmpiW(buf, msacmW, sizeof(msacmW)/sizeof(msacmW[0]))) continue; + if (!(name = strchrW(buf, '='))) continue; + *name = 0; + MSACM_RegisterDriver(buf, name + 1, 0); } + RegCloseKey( hKey ); } - HeapFree(MSACM_hHeap, 0, pszBuffer); + if (GetPrivateProfileSectionW(drv32, buf, sizeof(buf)/sizeof(buf[0]), sys)) + { + for(s = buf; *s; s += strlenW(s) + 1) + { + if (strncmpiW(s, msacmW, sizeof(msacmW)/sizeof(msacmW[0]))) continue; + if (!(name = strchrW(s, '='))) continue; + *name = 0; + MSACM_RegisterDriver(s, name + 1, 0); + *name = '='; + } + } MSACM_RegisterDriver(msacm32, msacm32, 0); } diff --git a/reactos/lib/msacm/makefile b/reactos/lib/msacm/makefile index 24c40308492..fbf1cf844af 100644 --- a/reactos/lib/msacm/makefile +++ b/reactos/lib/msacm/makefile @@ -1,23 +1,9 @@ -# $Id: makefile +# $Id: makefile,v 1.2 2004/07/14 18:30:54 sedwards Exp $ PATH_TO_TOP = ../.. TARGET_TYPE = winedll -TARGET_NAME = msacm32 - -TARGET_BASE = 0x777c0000 - -TARGET_CFLAGS += -DYDEBUG -DUNICODE -D_UNICODE -D__USE_W32API -D__REACTOS__ -Wall -Werror -# -D_WIN32_WINNT=0x0500 - -TARGET_SDKLIBS = ntdll.a winmm.a - -DEP_OBJECTS = $(TARGET_OBJECTS) - include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk - -include $(TOOLS_PATH)/depend.mk - diff --git a/reactos/lib/msacm/msacm.rc b/reactos/lib/msacm/msacm.rc index 3aee776beeb..186ab00b7de 100644 --- a/reactos/lib/msacm/msacm.rc +++ b/reactos/lib/msacm/msacm.rc @@ -24,7 +24,9 @@ #include "wineacm.h" #include "msacm_En.rc" +#include "msacm_Es.rc" #include "msacm_Fr.rc" #include "msacm_It.rc" +#include "msacm_Ja.rc" #include "msacm_Nl.rc" #include "msacm_Pt.rc" diff --git a/reactos/lib/msacm/msacm32_main.c b/reactos/lib/msacm/msacm32_main.c index 6ca97e9e3be..dde962a2dfe 100644 --- a/reactos/lib/msacm/msacm32_main.c +++ b/reactos/lib/msacm/msacm32_main.c @@ -120,6 +120,7 @@ MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) /* fall through */ case ACM_METRIC_COUNT_LOCAL_DRIVERS: if (hao) return MMSYSERR_INVALHANDLE; + if (!pMetric) return MMSYSERR_INVALPARAM; for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid)) val++; @@ -131,6 +132,7 @@ MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) /* fall through */ case ACM_METRIC_COUNT_LOCAL_CODECS: if (hao) return MMSYSERR_INVALHANDLE; + if (!pMetric) return MMSYSERR_INVALPARAM; for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) && @@ -144,6 +146,7 @@ MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) /* fall through */ case ACM_METRIC_COUNT_LOCAL_CONVERTERS: if (hao) return MMSYSERR_INVALHANDLE; + if (!pMetric) return MMSYSERR_INVALPARAM; for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) && @@ -157,6 +160,7 @@ MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) /* fall through */ case ACM_METRIC_COUNT_LOCAL_FILTERS: if (hao) return MMSYSERR_INVALHANDLE; + if (!pMetric) return MMSYSERR_INVALPARAM; for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) && @@ -170,6 +174,7 @@ MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) /* fall through */ case ACM_METRIC_COUNT_LOCAL_DISABLED: if (hao) return MMSYSERR_INVALHANDLE; + if (!pMetric) return MMSYSERR_INVALPARAM; for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid)) val++; @@ -204,10 +209,17 @@ MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric) } else { return MMSYSERR_INVALHANDLE; } + if (!pMetric) return MMSYSERR_INVALPARAM; *(LPDWORD)pMetric = val; break; case ACM_METRIC_COUNT_HARDWARE: + if (hao) return MMSYSERR_INVALHANDLE; + if (!pMetric) return MMSYSERR_INVALPARAM; + *(LPDWORD)pMetric = 0; + FIXME("ACM_METRIC_COUNT_HARDWARE not implemented\n"); + break; + case ACM_METRIC_HARDWARE_WAVE_INPUT: case ACM_METRIC_HARDWARE_WAVE_OUTPUT: case ACM_METRIC_MAX_SIZE_FILTER: diff --git a/reactos/lib/msacm/msacm_Es.rc b/reactos/lib/msacm/msacm_Es.rc new file mode 100644 index 00000000000..642e06780c5 --- /dev/null +++ b/reactos/lib/msacm/msacm_Es.rc @@ -0,0 +1,56 @@ +/* + * Spanish resource file for MS ACM + * + * Copyright 2004 José Manuel Ferrer Ortiz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Selección de sonido" +FONT 8, "MS Shell Dlg" +BEGIN + + LTEXT "&Nombre:", -1, 5, 5, 115, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + PUSHBUTTON "&Guardar como...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "&Eliminar", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "&Formato:", -1, 5, 41, 44, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + LTEXT "A&tributos:", -1, 5, 59, 44, 8, NOT WS_GROUP + +#if 0 + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | + CBS_OWNERDRAWFIXED | CBS_HASSTRINGS +#else + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#endif + DEFPUSHBUTTON "Aceptar", IDOK, 48, 80, 40, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "&Ayuda", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END diff --git a/reactos/lib/msacm/msacm_It.rc b/reactos/lib/msacm/msacm_It.rc index 40d93d64e3e..4fdfb93a9aa 100644 --- a/reactos/lib/msacm/msacm_It.rc +++ b/reactos/lib/msacm/msacm_It.rc @@ -2,7 +2,7 @@ * Italian resource file for MS ACM * * Copyright 2000 Eric Pouech - * Copyright 2003 Ivan Leo Murray-Smith + * Copyright 2003 Ivan Leo Puoti * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/reactos/lib/msacm/msacm_Ja.rc b/reactos/lib/msacm/msacm_Ja.rc new file mode 100644 index 00000000000..01e7ba31372 --- /dev/null +++ b/reactos/lib/msacm/msacm_Ja.rc @@ -0,0 +1,56 @@ +/* + * Japanese resource file for MS ACM + * + * Copyright 2000 Hajime Segawa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ƒTƒEƒ“ƒh‚Ì‘I‘ð" +FONT 9, "MS UI Gothic" +BEGIN + + LTEXT "–¼‘O(&N):", -1, 5, 5, 115, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + PUSHBUTTON "–¼‘O‚ð•t‚¯‚ĕۑ¶(&S)...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "íœ(&R)", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "ƒtƒH[ƒ}ƒbƒg(&F):", -1, 5, 41, 44, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + LTEXT "‘®«(&A):", -1, 5, 59, 44, 8, NOT WS_GROUP + +#if 0 + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | + CBS_OWNERDRAWFIXED | CBS_HASSTRINGS +#else + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#endif + DEFPUSHBUTTON "OK", IDOK, 48, 80, 40, 14 + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "ƒwƒ‹ƒv(&H)", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END diff --git a/reactos/lib/msacm/pcmconverter.c b/reactos/lib/msacm/pcmconverter.c new file mode 100644 index 00000000000..3f335d005ce --- /dev/null +++ b/reactos/lib/msacm/pcmconverter.c @@ -0,0 +1,1223 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MSACM32 library + * + * Copyright 2000 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * FIXME / TODO list + * + most of the computation should be done in fixed point arithmetic + * instead of floating point (16 bits for integral part, and 16 bits + * for fractional part for example) + * + implement PCM_FormatSuggest function + * + get rid of hack for PCM_DriverProc (msacm32.dll shouldn't export + * a DriverProc, but this would require implementing a generic + * embedded driver handling scheme in msacm32.dll which isn't done yet + */ + +#include "config.h" + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "wingdi.h" +#include "winnls.h" +#include "winuser.h" + +#include "msacmdrv.h" +#include "wineacm.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +/*********************************************************************** + * PCM_drvOpen + */ +static DWORD PCM_drvOpen(LPCSTR str, PACMDRVOPENDESCW adod) +{ + TRACE("(%p, %p)\n", str, adod); + + return (adod == NULL) || + (adod->fccType == ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC && + adod->fccComp == ACMDRIVERDETAILS_FCCCOMP_UNDEFINED); +} + +/*********************************************************************** + * PCM_drvClose + */ +static DWORD PCM_drvClose(DWORD dwDevID) +{ + TRACE("(%ld)\n", dwDevID); + + return 1; +} + +#define NUM_PCM_FORMATS (sizeof(PCM_Formats) / sizeof(PCM_Formats[0])) +#define NUM_OF(a,b) (((a)+(b)-1)/(b)) + +/* flags for fdwDriver */ +#define PCM_RESAMPLE 1 + +/* data used while converting */ +typedef struct tagAcmPcmData { + /* conversion routine, depending if rate conversion is required */ + union { + void (*cvtKeepRate)(const unsigned char*, int, unsigned char*); + void (*cvtChangeRate)(struct tagAcmPcmData*, const unsigned char*, + LPDWORD, unsigned char*, LPDWORD); + } cvt; + /* the following fields are used only with rate conversion) */ + DWORD srcPos; /* position in source stream */ + double dstPos; /* position in destination stream */ + double dstIncr; /* value to increment dst stream when src stream + is incremented by 1 */ + /* last source stream value read */ + union { + unsigned char b; /* 8 bit value */ + short s; /* 16 bit value */ + } last[2]; /* two channels max (stereo) */ +} AcmPcmData; + +/* table to list all supported formats... those are the basic ones. this + * also helps given a unique index to each of the supported formats + */ +static struct { + int nChannels; + int nBits; + int rate; +} PCM_Formats[] = { + {1, 8, 8000}, {2, 8, 8000}, {1, 16, 8000}, {2, 16, 8000}, + {1, 8, 11025}, {2, 8, 11025}, {1, 16, 11025}, {2, 16, 11025}, + {1, 8, 22050}, {2, 8, 22050}, {1, 16, 22050}, {2, 16, 22050}, + {1, 8, 44100}, {2, 8, 44100}, {1, 16, 44100}, {2, 16, 44100}, + {1, 8, 48000}, {2, 8, 48000}, {1, 16, 48000}, {2, 16, 48000}, + {1, 8, 96000}, {2, 8, 96000}, {1, 16, 96000}, {2, 16, 96000} +}; + +/*********************************************************************** + * PCM_GetFormatIndex + */ +static DWORD PCM_GetFormatIndex(LPWAVEFORMATEX wfx) +{ + int i; + TRACE("(%p)\n", wfx); + + for (i = 0; i < NUM_PCM_FORMATS; i++) { + if (wfx->nChannels == PCM_Formats[i].nChannels && + wfx->nSamplesPerSec == PCM_Formats[i].rate && + wfx->wBitsPerSample == PCM_Formats[i].nBits) + return i; + } + return 0xFFFFFFFF; +} + +/* PCM Conversions: + * + * parameters: + * + 8 bit unsigned vs 16 bit signed + * + mono vs stereo (1 or 2 channels) + * + sampling rate (8.0, 11.025, 22.05, 44.1 kHz are defined, but algo + * shall work in all cases) + * + * mono => stereo: copy the same sample on Left & Right channels + * stereo =) mono: use the average value of samples from Left & Right channels + * resampling; we lookup for each destination sample the two source adjacent + * samples were src <= dst < src+1 (dst is increased by a fractional + * value which is equivalent to the increment by one on src); then we + * use a linear interpolation between src and src+1 + */ + +/*********************************************************************** + * C816 + * + * Converts a 8 bit sample to a 16 bit one + */ +static inline short C816(unsigned char b) +{ + return (short)((b+(b << 8))-32768); +} + +/*********************************************************************** + * C168 + * + * Converts a 16 bit sample to a 8 bit one (data loss !!) + */ +static inline unsigned char C168(short s) +{ + return HIBYTE(s) ^ (unsigned char)0x80; +} + +/*********************************************************************** + * R16 + * + * Read a 16 bit sample (correctly handles endianess) + */ +static inline short R16(const unsigned char* src) +{ + return (short)((unsigned short)src[0] | ((unsigned short)src[1] << 8)); +} + +/*********************************************************************** + * W16 + * + * Write a 16 bit sample (correctly handles endianess) + */ +static inline void W16(unsigned char* dst, short s) +{ + dst[0] = LOBYTE(s); + dst[1] = HIBYTE(s); +} + +/*********************************************************************** + * M16 + * + * Convert the (l,r) 16 bit stereo sample into a 16 bit mono + * (takes the mid-point of the two values) + */ +static inline short M16(short l, short r) +{ + return (l + r) / 2; +} + +/*********************************************************************** + * M8 + * + * Convert the (l,r) 8 bit stereo sample into a 8 bit mono + * (takes the mid-point of the two values) + */ +static inline unsigned char M8(unsigned char a, unsigned char b) +{ + return (unsigned char)((a + b) / 2); +} + +/* the conversion routines without rate conversion are labelled cvtK + * where : + * is the (M)ono/(S)tereo configuration of input channel + * is the (M)ono/(S)tereo configuration of output channel + * is the number of bits of input channel (8 or 16) + * is the number of bits of output channel (8 or 16) + * + * in the parameters, ns is always the number of samples, so the size of input + * buffer (resp output buffer) is ns * ( == 'Mono' ? 1:2) * ( == 8 ? 1:2) + */ + +static void cvtMM88K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + memcpy(dst, src, ns); +} + +static void cvtSS88K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + memcpy(dst, src, ns * 2); +} + +static void cvtMM1616K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + memcpy(dst, src, ns * 2); +} + +static void cvtSS1616K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + memcpy(dst, src, ns * 4); +} + +static void cvtMS88K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + *dst++ = *src; + *dst++ = *src++; + } +} + +static void cvtMS816K(const unsigned char* src, int ns, unsigned char* dst) +{ + short v; + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + v = C816(*src++); + W16(dst, v); dst += 2; + W16(dst, v); dst += 2; + } +} + +static void cvtMS168K(const unsigned char* src, int ns, unsigned char* dst) +{ + unsigned char v; + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + v = C168(R16(src)); src += 2; + *dst++ = v; + *dst++ = v; + } +} + +static void cvtMS1616K(const unsigned char* src, int ns, unsigned char* dst) +{ + short v; + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + v = R16(src); src += 2; + W16(dst, v); dst += 2; + W16(dst, v); dst += 2; + } +} + +static void cvtSM88K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + *dst++ = M8(src[0], src[1]); + src += 2; + } +} + +static void cvtSM816K(const unsigned char* src, int ns, unsigned char* dst) +{ + short v; + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + v = M16(C816(src[0]), C816(src[1])); + src += 2; + W16(dst, v); dst += 2; + } +} + +static void cvtSM168K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + *dst++ = C168(M16(R16(src), R16(src + 2))); + src += 4; + } +} + +static void cvtSM1616K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + W16(dst, M16(R16(src),R16(src+2))); dst += 2; + src += 4; + } +} + +static void cvtMM816K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + W16(dst, C816(*src++)); dst += 2; + } +} + +static void cvtSS816K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + W16(dst, C816(*src++)); dst += 2; + W16(dst, C816(*src++)); dst += 2; + } +} + +static void cvtMM168K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + *dst++ = C168(R16(src)); src += 2; + } +} + +static void cvtSS168K(const unsigned char* src, int ns, unsigned char* dst) +{ + TRACE("(%p, %d, %p)\n", src, ns, dst); + + while (ns--) { + *dst++ = C168(R16(src)); src += 2; + *dst++ = C168(R16(src)); src += 2; + } +} + +static void (*PCM_ConvertKeepRate[16])(const unsigned char*, int, unsigned char*) = { + cvtSS88K, cvtSM88K, cvtMS88K, cvtMM88K, + cvtSS816K, cvtSM816K, cvtMS816K, cvtMM816K, + cvtSS168K, cvtSM168K, cvtMS168K, cvtMM168K, + cvtSS1616K, cvtSM1616K, cvtMS1616K, cvtMM1616K, +}; + +/*********************************************************************** + * I + * + * Interpolate the value at r (r in ]0, 1]) between the two points v1 and v2 + * Linear interpolation is used + */ +static inline double I(double v1, double v2, double r) +{ + if (0.0 >= r || r > 1.0) FIXME("r!! %f\n", r); + return (1.0 - r) * v1 + r * v2; +} + +static void cvtSS88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->last[1].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + *dst++ = I(apd->last[0].b, src[0], r); + *dst++ = I(apd->last[1].b, src[1], r); + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +/* the conversion routines with rate conversion are labelled cvtC + * where : + * is the (M)ono/(S)tereo configuration of input channel + * is the (M)ono/(S)tereo configuration of output channel + * is the number of bits of input channel (8 or 16) + * is the number of bits of output channel (8 or 16) + * + */ +static void cvtSM88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->last[1].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + *dst++ = I(M8(apd->last[0].b, apd->last[1].b), M8(src[0], src[1]), r); + else + *dst++ = M8(apd->last[0].b, apd->last[1].b); + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtMS88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + dst[0] = dst[1] = I(apd->last[0].b, src[0], r); + else + dst[0] = dst[1] = apd->last[0].b; + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtMM88C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + *dst++ = I(apd->last[0].b, src[0], r); + else + *dst++ = apd->last[0].b; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtSS816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->last[1].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + W16(dst, I(C816(apd->last[0].b), C816(src[0]), r)); + else + W16(dst, C816(apd->last[0].b)); + dst += 2; + if (*nsrc) /* don't go off end of data */ + W16(dst, I(C816(apd->last[1].b), C816(src[1]), r)); + else + W16(dst, C816(apd->last[1].b)); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtSM816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->last[1].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + W16(dst, I(M16(C816(apd->last[0].b), C816(apd->last[1].b)), + M16(C816(src[0]), C816(src[1])), r)); + else + W16(dst, M16(C816(apd->last[0].b), C816(apd->last[1].b))); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtMS816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + short v; + TRACE("(%p, %p, %p->(%ld), %p, %p->(%ld))\n", apd, src, nsrc, *nsrc, dst, ndst, *ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + v = I(C816(apd->last[0].b), C816(src[0]), r); + else + v = C816(apd->last[0].b); + W16(dst, v); dst += 2; + W16(dst, v); dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtMM816C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].b = *src++; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + W16(dst, I(C816(apd->last[0].b), C816(src[0]), r)); + else + W16(dst, C816(apd->last[0].b)); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtSS168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->last[1].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) { /* don't go off end of data */ + *dst++ = C168(I(apd->last[0].s, R16(src) , r)); + *dst++ = C168(I(apd->last[1].s, R16(src+2), r)); + } else { + *dst++ = C168(apd->last[0].s); + *dst++ = C168(apd->last[1].s); + } + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtSM168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->last[1].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + *dst++ = C168(I(M16(apd->last[0].s, apd->last[1].s), + M16(R16(src), R16(src + 2)), r)); + else + *dst++ = C168(M16(apd->last[0].s, apd->last[1].s)); + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + + +static void cvtMS168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + dst[0] = dst[1] = C168(I(apd->last[0].s, R16(src), r)); + else + dst[0] = dst[1] = C168(apd->last[0].s); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + + +static void cvtMM168C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + *dst++ = C168(I(apd->last[0].s, R16(src), r)); + else + *dst++ = C168(apd->last[0].s); + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtSS1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->last[1].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + W16(dst, I(apd->last[0].s, R16(src), r)); + else + W16(dst, apd->last[0].s); + dst += 2; + if (*nsrc) /* don't go off end of data */ + W16(dst, I(apd->last[1].s, R16(src+2), r)); + else + W16(dst, apd->last[1].s); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtSM1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->last[1].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + W16(dst, I(M16(apd->last[0].s, apd->last[1].s), + M16(R16(src), R16(src+2)), r)); + else + W16(dst, M16(apd->last[0].s, apd->last[1].s)); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtMS1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + short v; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + v = I(apd->last[0].s, R16(src), r); + else + v = apd->last[0].s; + W16(dst, v); dst += 2; + W16(dst, v); dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void cvtMM1616C(AcmPcmData* apd, const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) +{ + double r; + TRACE("(%p, %p, %p, %p, %p)\n", apd, src, nsrc, dst, ndst); + + while (*nsrc != 0 && *ndst != 0) { + while ((r = (double)apd->srcPos - apd->dstPos) <= 0) { + if (*nsrc == 0) return; + apd->last[0].s = R16(src); src += 2; + apd->srcPos++; + (*nsrc)--; + } + /* now do the interpolation */ + if (*nsrc) /* don't go off end of data */ + W16(dst, I(apd->last[0].s, R16(src), r)); + else + W16(dst, apd->last[0].s); + dst += 2; + apd->dstPos += apd->dstIncr; + (*ndst)--; + } +} + +static void (*PCM_ConvertChangeRate[16])(AcmPcmData* apd, + const unsigned char* src, LPDWORD nsrc, + unsigned char* dst, LPDWORD ndst) = { + cvtSS88C, cvtSM88C, cvtMS88C, cvtMM88C, + cvtSS816C, cvtSM816C, cvtMS816C, cvtMM816C, + cvtSS168C, cvtSM168C, cvtMS168C, cvtMM168C, + cvtSS1616C, cvtSM1616C, cvtMS1616C, cvtMM1616C, +}; + +/*********************************************************************** + * PCM_DriverDetails + * + */ +static LRESULT PCM_DriverDetails(PACMDRIVERDETAILSW add) +{ + TRACE("(%p)\n", add); + + add->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; + add->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; + add->wMid = 0xFF; + add->wPid = 0x00; + add->vdwACM = 0x01000000; + add->vdwDriver = 0x01000000; + add->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CONVERTER; + add->cFormatTags = 1; + add->cFilterTags = 0; + add->hicon = NULL; + MultiByteToWideChar( CP_ACP, 0, "WINE-PCM", -1, + add->szShortName, sizeof(add->szShortName)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, "Wine PCM converter", -1, + add->szLongName, sizeof(add->szLongName)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, "Brought to you by the Wine team...", -1, + add->szCopyright, sizeof(add->szCopyright)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, "Refer to LICENSE file", -1, + add->szLicensing, sizeof(add->szLicensing)/sizeof(WCHAR) ); + add->szFeatures[0] = 0; + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_FormatTagDetails + * + */ +static LRESULT PCM_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery) +{ + TRACE("(%p, %08lx)\n", aftd, dwQuery); + + switch (dwQuery) { + case ACM_FORMATTAGDETAILSF_INDEX: + if (aftd->dwFormatTagIndex != 0) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + break; + case ACM_FORMATTAGDETAILSF_FORMATTAG: + if (aftd->dwFormatTag != WAVE_FORMAT_PCM) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + break; + case ACM_FORMATTAGDETAILSF_LARGESTSIZE: + if (aftd->dwFormatTag != WAVE_FORMAT_UNKNOWN && + aftd->dwFormatTag != WAVE_FORMAT_PCM) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + break; + default: + WARN("Unsupported query %08lx\n", dwQuery); + return MMSYSERR_NOTSUPPORTED; + } + + aftd->dwFormatTagIndex = 0; + aftd->dwFormatTag = WAVE_FORMAT_PCM; + aftd->cbFormatSize = sizeof(PCMWAVEFORMAT); + aftd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CONVERTER; + aftd->cStandardFormats = NUM_PCM_FORMATS; + aftd->szFormatTag[0] = 0; + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_FormatDetails + * + */ +static LRESULT PCM_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery) +{ + TRACE("(%p, %08lx)\n", afd, dwQuery); + + switch (dwQuery) { + case ACM_FORMATDETAILSF_FORMAT: + if (PCM_GetFormatIndex(afd->pwfx) == 0xFFFFFFFF) { + return ACMERR_NOTPOSSIBLE; + WARN("not possible\n"); + } + break; + case ACM_FORMATDETAILSF_INDEX: + assert(afd->dwFormatIndex < NUM_PCM_FORMATS); + afd->pwfx->wFormatTag = WAVE_FORMAT_PCM; + afd->pwfx->nChannels = PCM_Formats[afd->dwFormatIndex].nChannels; + afd->pwfx->nSamplesPerSec = PCM_Formats[afd->dwFormatIndex].rate; + afd->pwfx->wBitsPerSample = PCM_Formats[afd->dwFormatIndex].nBits; + /* native MSACM uses a PCMWAVEFORMAT structure, so cbSize is not + * accessible afd->pwfx->cbSize = 0; + */ + afd->pwfx->nBlockAlign = + (afd->pwfx->nChannels * afd->pwfx->wBitsPerSample) / 8; + afd->pwfx->nAvgBytesPerSec = + afd->pwfx->nSamplesPerSec * afd->pwfx->nBlockAlign; + break; + default: + WARN("Unsupported query %08lx\n", dwQuery); + return MMSYSERR_NOTSUPPORTED; + } + + afd->dwFormatTag = WAVE_FORMAT_PCM; + afd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CONVERTER; + afd->szFormat[0] = 0; /* let MSACM format this for us... */ + afd->cbwfx = sizeof(PCMWAVEFORMAT); + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_FormatSuggest + * + */ +static LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs) +{ + TRACE("(%p)\n", adfs); + + /* some tests ... */ + if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) || + adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) || + PCM_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + + /* is no suggestion for destination, then copy source value */ + if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS)) { + adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels; + } + if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC)) { + adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec; + } + if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE)) { + adfs->pwfxDst->wBitsPerSample = adfs->pwfxSrc->wBitsPerSample; + } + if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) { + if (adfs->pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + adfs->pwfxDst->wFormatTag = adfs->pwfxSrc->wFormatTag; + } + /* check if result is ok */ + if (PCM_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + + /* recompute other values */ + adfs->pwfxDst->nBlockAlign = (adfs->pwfxDst->nChannels * adfs->pwfxDst->wBitsPerSample) / 8; + adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign; + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_Reset + * + */ +static void PCM_Reset(AcmPcmData* apd, int srcNumBits) +{ + TRACE("(%p, %d)\n", apd, srcNumBits); + + apd->srcPos = 0; + apd->dstPos = 0; + /* initialize with neutral value */ + if (srcNumBits == 16) { + apd->last[0].s = 0; + apd->last[1].s = 0; + } else { + apd->last[0].b = (BYTE)0x80; + apd->last[1].b = (BYTE)0x80; + } +} + +/*********************************************************************** + * PCM_StreamOpen + * + */ +static LRESULT PCM_StreamOpen(PACMDRVSTREAMINSTANCE adsi) +{ + AcmPcmData* apd; + int idx = 0; + + TRACE("(%p)\n", adsi); + + assert(!(adsi->fdwOpen & ACM_STREAMOPENF_ASYNC)); + + if (PCM_GetFormatIndex(adsi->pwfxSrc) == 0xFFFFFFFF || + PCM_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF) { + WARN("not possible\n"); + return ACMERR_NOTPOSSIBLE; + } + + apd = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmPcmData)); + if (apd == 0) { + WARN("no memory\n"); + return MMSYSERR_NOMEM; + } + + adsi->dwDriver = (DWORD)apd; + adsi->fdwDriver = 0; + + if (adsi->pwfxSrc->wBitsPerSample == 16) idx += 8; + if (adsi->pwfxDst->wBitsPerSample == 16) idx += 4; + if (adsi->pwfxSrc->nChannels == 1) idx += 2; + if (adsi->pwfxDst->nChannels == 1) idx += 1; + + if (adsi->pwfxSrc->nSamplesPerSec == adsi->pwfxDst->nSamplesPerSec) { + apd->cvt.cvtKeepRate = PCM_ConvertKeepRate[idx]; + } else { + adsi->fdwDriver |= PCM_RESAMPLE; + apd->dstIncr = (double)(adsi->pwfxSrc->nSamplesPerSec) / + (double)(adsi->pwfxDst->nSamplesPerSec); + PCM_Reset(apd, adsi->pwfxSrc->wBitsPerSample); + apd->cvt.cvtChangeRate = PCM_ConvertChangeRate[idx]; + } + + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_StreamClose + * + */ +static LRESULT PCM_StreamClose(PACMDRVSTREAMINSTANCE adsi) +{ + TRACE("(%p)\n", adsi); + + HeapFree(GetProcessHeap(), 0, (void*)adsi->dwDriver); + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_round + * + */ +static inline DWORD PCM_round(DWORD a, DWORD b, DWORD c) +{ + assert(c); + /* to be sure, always return an entire number of c... */ + return ((double)a * (double)b + (double)c - 1) / (double)c; +} + +/*********************************************************************** + * PCM_StreamSize + * + */ +static LRESULT PCM_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss) +{ + DWORD srcMask = ~(adsi->pwfxSrc->nBlockAlign - 1); + DWORD dstMask = ~(adsi->pwfxDst->nBlockAlign - 1); + + TRACE("(%p, %p)\n", adsi, adss); + + switch (adss->fdwSize) { + case ACM_STREAMSIZEF_DESTINATION: + /* cbDstLength => cbSrcLength */ + adss->cbSrcLength = PCM_round(adss->cbDstLength & dstMask, + adsi->pwfxSrc->nAvgBytesPerSec, + adsi->pwfxDst->nAvgBytesPerSec) & srcMask; + break; + case ACM_STREAMSIZEF_SOURCE: + /* cbSrcLength => cbDstLength */ + adss->cbDstLength = PCM_round(adss->cbSrcLength & srcMask, + adsi->pwfxDst->nAvgBytesPerSec, + adsi->pwfxSrc->nAvgBytesPerSec) & dstMask; + break; + default: + WARN("Unsupported query %08lx\n", adss->fdwSize); + return MMSYSERR_NOTSUPPORTED; + } + return MMSYSERR_NOERROR; +} + +/*********************************************************************** + * PCM_StreamConvert + * + */ +static LRESULT PCM_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEADER adsh) +{ + AcmPcmData* apd = (AcmPcmData*)adsi->dwDriver; + DWORD nsrc = NUM_OF(adsh->cbSrcLength, adsi->pwfxSrc->nBlockAlign); + DWORD ndst = NUM_OF(adsh->cbDstLength, adsi->pwfxDst->nBlockAlign); + + TRACE("(%p, %p)\n", adsi, adsh); + + TRACE("nsrc=%ld,adsh->cbSrcLength=%ld\n", nsrc, adsh->cbSrcLength); + TRACE("ndst=%ld,adsh->cbDstLength=%ld\n", ndst, adsh->cbDstLength); + TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", + adsi->pwfxSrc->wFormatTag, adsi->pwfxSrc->nChannels, adsi->pwfxSrc->nSamplesPerSec, adsi->pwfxSrc->nAvgBytesPerSec, + adsi->pwfxSrc->nBlockAlign, adsi->pwfxSrc->wBitsPerSample, adsi->pwfxSrc->cbSize); + TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", + adsi->pwfxDst->wFormatTag, adsi->pwfxDst->nChannels, adsi->pwfxDst->nSamplesPerSec, adsi->pwfxDst->nAvgBytesPerSec, + adsi->pwfxDst->nBlockAlign, adsi->pwfxDst->wBitsPerSample, adsi->pwfxDst->cbSize); + + if (adsh->fdwConvert & + ~(ACM_STREAMCONVERTF_BLOCKALIGN| + ACM_STREAMCONVERTF_END| + ACM_STREAMCONVERTF_START)) { + FIXME("Unsupported fdwConvert (%08lx), ignoring it\n", adsh->fdwConvert); + } + /* ACM_STREAMCONVERTF_BLOCKALIGN + * currently all conversions are block aligned, so do nothing for this flag + * ACM_STREAMCONVERTF_END + * no pending data, so do nothing for this flag + */ + if ((adsh->fdwConvert & ACM_STREAMCONVERTF_START) && + (adsi->fdwDriver & PCM_RESAMPLE)) { + PCM_Reset(apd, adsi->pwfxSrc->wBitsPerSample); + } + + /* do the job */ + if (adsi->fdwDriver & PCM_RESAMPLE) { + DWORD nsrc2 = nsrc; + DWORD ndst2 = ndst; + + apd->cvt.cvtChangeRate(apd, adsh->pbSrc, &nsrc2, adsh->pbDst, &ndst2); + nsrc -= nsrc2; + ndst -= ndst2; + } else { + if (nsrc < ndst) ndst = nsrc; else nsrc = ndst; + + /* nsrc is now equal to ndst */ + apd->cvt.cvtKeepRate(adsh->pbSrc, nsrc, adsh->pbDst); + } + + adsh->cbSrcLengthUsed = nsrc * adsi->pwfxSrc->nBlockAlign; + adsh->cbDstLengthUsed = ndst * adsi->pwfxDst->nBlockAlign; + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * DriverProc (MSACM32.@) + */ +LRESULT CALLBACK PCM_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg, + LPARAM dwParam1, LPARAM dwParam2) +{ + TRACE("(%08lx %08lx %u %08lx %08lx);\n", + dwDevID, (DWORD)hDriv, wMsg, dwParam1, dwParam2); + + switch (wMsg) { + case DRV_LOAD: return 1; + case DRV_FREE: return 1; + case DRV_OPEN: return PCM_drvOpen((LPSTR)dwParam1, (PACMDRVOPENDESCW)dwParam2); + case DRV_CLOSE: return PCM_drvClose(dwDevID); + case DRV_ENABLE: return 1; + case DRV_DISABLE: return 1; + case DRV_QUERYCONFIGURE: return 1; + case DRV_CONFIGURE: MessageBoxA(0, "MSACM PCM filter !", "Wine Driver", MB_OK); return 1; + case DRV_INSTALL: return DRVCNF_RESTART; + case DRV_REMOVE: return DRVCNF_RESTART; + + case ACMDM_DRIVER_NOTIFY: + /* no caching from other ACM drivers is done so far */ + return MMSYSERR_NOERROR; + + case ACMDM_DRIVER_DETAILS: + return PCM_DriverDetails((PACMDRIVERDETAILSW)dwParam1); + + case ACMDM_FORMATTAG_DETAILS: + return PCM_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2); + + case ACMDM_FORMAT_DETAILS: + return PCM_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2); + + case ACMDM_FORMAT_SUGGEST: + return PCM_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1); + + case ACMDM_STREAM_OPEN: + return PCM_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1); + + case ACMDM_STREAM_CLOSE: + return PCM_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1); + + case ACMDM_STREAM_SIZE: + return PCM_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2); + + case ACMDM_STREAM_CONVERT: + return PCM_StreamConvert((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMHEADER)dwParam2); + + case ACMDM_HARDWARE_WAVE_CAPS_INPUT: + case ACMDM_HARDWARE_WAVE_CAPS_OUTPUT: + /* this converter is not a hardware driver */ + case ACMDM_FILTERTAG_DETAILS: + case ACMDM_FILTER_DETAILS: + /* this converter is not a filter */ + case ACMDM_STREAM_RESET: + /* only needed for asynchronous driver... we aren't, so just say it */ + case ACMDM_STREAM_PREPARE: + case ACMDM_STREAM_UNPREPARE: + /* nothing special to do here... so don't do anything */ + return MMSYSERR_NOTSUPPORTED; + + default: + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } + return 0; +} diff --git a/reactos/lib/msacm/stream.c b/reactos/lib/msacm/stream.c new file mode 100644 index 00000000000..5c427ec62d4 --- /dev/null +++ b/reactos/lib/msacm/stream.c @@ -0,0 +1,478 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ + +/* + * MSACM32 library + * + * Copyright 1998 Patrik Stridvall + * 1999 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* TODO + * + asynchronous conversion is not implemented + * + callback/notification + * * acmStreamMessage + * + properly close ACM streams + */ + +#include +#include +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wine/debug.h" +#include "mmsystem.h" +#include "mmreg.h" +#include "msacm.h" +#include "msacmdrv.h" +#include "wineacm.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msacm); + +static PWINE_ACMSTREAM ACM_GetStream(HACMSTREAM has) +{ + TRACE("(%p)\n", has); + + return (PWINE_ACMSTREAM)has; +} + +/*********************************************************************** + * acmStreamClose (MSACM32.@) + */ +MMRESULT WINAPI acmStreamClose(HACMSTREAM has, DWORD fdwClose) +{ + PWINE_ACMSTREAM was; + MMRESULT ret; + + TRACE("(%p, %ld)\n", has, fdwClose); + + if ((was = ACM_GetStream(has)) == NULL) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } + ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_CLOSE, (DWORD)&was->drvInst, 0); + if (ret == MMSYSERR_NOERROR) { + if (was->hAcmDriver) + acmDriverClose(was->hAcmDriver, 0L); + HeapFree(MSACM_hHeap, 0, was); + } + TRACE("=> (%d)\n", ret); + return ret; +} + +/*********************************************************************** + * acmStreamConvert (MSACM32.@) + */ +MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash, + DWORD fdwConvert) +{ + PWINE_ACMSTREAM was; + MMRESULT ret = MMSYSERR_NOERROR; + PACMDRVSTREAMHEADER padsh; + + TRACE("(%p, %p, %ld)\n", has, pash, fdwConvert); + + if ((was = ACM_GetStream(has)) == NULL) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } + if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER)) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + if (!(pash->fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED)) { + WARN("unprepared header\n"); + return ACMERR_UNPREPARED; + } + + /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same + * size. some fields are private to msacm internals, and are exposed + * in ACMSTREAMHEADER in the dwReservedDriver array + */ + padsh = (PACMDRVSTREAMHEADER)pash; + + /* check that pointers have not been modified */ + if (padsh->pbPreparedSrc != padsh->pbSrc || + padsh->cbPreparedSrcLength < padsh->cbSrcLength || + padsh->pbPreparedDst != padsh->pbDst || + padsh->cbPreparedDstLength < padsh->cbDstLength) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + padsh->fdwConvert = fdwConvert; + + ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_CONVERT, (DWORD)&was->drvInst, (DWORD)padsh); + if (ret == MMSYSERR_NOERROR) { + padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE; + } + TRACE("=> (%d)\n", ret); + return ret; +} + +/*********************************************************************** + * acmStreamMessage (MSACM32.@) + */ +MMRESULT WINAPI acmStreamMessage(HACMSTREAM has, UINT uMsg, LPARAM lParam1, + LPARAM lParam2) +{ + FIXME("(%p, %u, %ld, %ld): stub\n", has, uMsg, lParam1, lParam2); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return MMSYSERR_ERROR; +} + +/*********************************************************************** + * acmStreamOpen (MSACM32.@) + */ +MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc, + PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen) +{ + PWINE_ACMSTREAM was; + PWINE_ACMDRIVER wad; + MMRESULT ret; + int wfxSrcSize; + int wfxDstSize; + WAVEFORMATEX wfxSrc, wfxDst; + + TRACE("(%p, %p, %p, %p, %p, %ld, %ld, %ld)\n", + phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen); + + /* NOTE: pwfxSrc and/or pwfxDst can point to a structure smaller than + * WAVEFORMATEX so don't use them directly when not sure */ + if (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) { + memcpy(&wfxSrc, pwfxSrc, sizeof(PCMWAVEFORMAT)); + wfxSrc.wBitsPerSample = pwfxSrc->wBitsPerSample; + wfxSrc.cbSize = 0; + pwfxSrc = &wfxSrc; + } + + if (pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { + memcpy(&wfxDst, pwfxDst, sizeof(PCMWAVEFORMAT)); + wfxDst.wBitsPerSample = pwfxDst->wBitsPerSample; + wfxDst.cbSize = 0; + pwfxDst = &wfxDst; + } + + TRACE("src [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", + pwfxSrc->wFormatTag, pwfxSrc->nChannels, pwfxSrc->nSamplesPerSec, pwfxSrc->nAvgBytesPerSec, + pwfxSrc->nBlockAlign, pwfxSrc->wBitsPerSample, pwfxSrc->cbSize); + + TRACE("dst [wFormatTag=%u, nChannels=%u, nSamplesPerSec=%lu, nAvgBytesPerSec=%lu, nBlockAlign=%u, wBitsPerSample=%u, cbSize=%u]\n", + pwfxDst->wFormatTag, pwfxDst->nChannels, pwfxDst->nSamplesPerSec, pwfxDst->nAvgBytesPerSec, + pwfxDst->nBlockAlign, pwfxDst->wBitsPerSample, pwfxDst->cbSize); + + /* (WS) In query mode, phas should be NULL. If it is not, then instead + * of returning an error we are making sure it is NULL, preventing some + * applications that pass garbage for phas from crashing. + */ + if (fdwOpen & ACM_STREAMOPENF_QUERY) phas = NULL; + + if (pwfltr && (pwfxSrc->wFormatTag != pwfxDst->wFormatTag)) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + wfxSrcSize = wfxDstSize = sizeof(WAVEFORMATEX); + if (pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) wfxSrcSize += pwfxSrc->cbSize; + if (pwfxDst->wFormatTag != WAVE_FORMAT_PCM) wfxDstSize += pwfxDst->cbSize; + + was = HeapAlloc(MSACM_hHeap, 0, sizeof(*was) + wfxSrcSize + wfxDstSize + + ((pwfltr) ? sizeof(WAVEFILTER) : 0)); + if (was == NULL) { + WARN("no memory\n"); + return MMSYSERR_NOMEM; + } + + was->drvInst.cbStruct = sizeof(was->drvInst); + was->drvInst.pwfxSrc = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was)); + memcpy(was->drvInst.pwfxSrc, pwfxSrc, wfxSrcSize); + was->drvInst.pwfxDst = (PWAVEFORMATEX)((LPSTR)was + sizeof(*was) + wfxSrcSize); + memcpy(was->drvInst.pwfxDst, pwfxDst, wfxDstSize); + if (pwfltr) { + was->drvInst.pwfltr = (PWAVEFILTER)((LPSTR)was + sizeof(*was) + wfxSrcSize + wfxDstSize); + memcpy(was->drvInst.pwfltr, pwfltr, sizeof(WAVEFILTER)); + } else { + was->drvInst.pwfltr = NULL; + } + was->drvInst.dwCallback = dwCallback; + was->drvInst.dwInstance = dwInstance; + was->drvInst.fdwOpen = fdwOpen; + was->drvInst.fdwDriver = 0L; + was->drvInst.dwDriver = 0L; + /* real value will be stored once ACMDM_STREAM_OPEN succeeds */ + was->drvInst.has = 0L; + + if (had) { + if (!(wad = MSACM_GetDriver(had))) { + ret = MMSYSERR_INVALPARAM; + goto errCleanUp; + } + + was->obj.dwType = WINE_ACMOBJ_STREAM; + was->obj.pACMDriverID = wad->obj.pACMDriverID; + was->pDrv = wad; + was->hAcmDriver = 0; /* not to close it in acmStreamClose */ + + ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L); + if (ret != MMSYSERR_NOERROR) + goto errCleanUp; + } else { + PWINE_ACMDRIVERID wadi; + + ret = ACMERR_NOTPOSSIBLE; + for (wadi = MSACM_pFirstACMDriverID; wadi; wadi = wadi->pNextACMDriverID) { + if ((wadi->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) || + !MSACM_FindFormatTagInCache(wadi, pwfxSrc->wFormatTag, NULL) || + !MSACM_FindFormatTagInCache(wadi, pwfxDst->wFormatTag, NULL)) + continue; + ret = acmDriverOpen(&had, (HACMDRIVERID)wadi, 0L); + if (ret != MMSYSERR_NOERROR) + continue; + if ((wad = MSACM_GetDriver(had)) != 0) { + was->obj.dwType = WINE_ACMOBJ_STREAM; + was->obj.pACMDriverID = wad->obj.pACMDriverID; + was->pDrv = wad; + was->hAcmDriver = had; + + ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L); + TRACE("%s => %08x\n", debugstr_w(wadi->pszDriverAlias), ret); + if (ret == MMSYSERR_NOERROR) { + if (fdwOpen & ACM_STREAMOPENF_QUERY) { + acmDriverClose(had, 0L); + } + break; + } + } + /* no match, close this acm driver and try next one */ + acmDriverClose(had, 0L); + } + if (ret != MMSYSERR_NOERROR) { + ret = ACMERR_NOTPOSSIBLE; + goto errCleanUp; + } + } + ret = MMSYSERR_NOERROR; + was->drvInst.has = (HACMSTREAM)was; + if (!(fdwOpen & ACM_STREAMOPENF_QUERY)) { + if (phas) + *phas = (HACMSTREAM)was; + TRACE("=> (%d)\n", ret); + return ret; + } +errCleanUp: + if (phas) + *phas = NULL; + HeapFree(MSACM_hHeap, 0, was); + TRACE("=> (%d)\n", ret); + return ret; +} + + +/*********************************************************************** + * acmStreamPrepareHeader (MSACM32.@) + */ +MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, + DWORD fdwPrepare) +{ + PWINE_ACMSTREAM was; + MMRESULT ret = MMSYSERR_NOERROR; + PACMDRVSTREAMHEADER padsh; + + TRACE("(%p, %p, %ld)\n", has, pash, fdwPrepare); + + if ((was = ACM_GetStream(has)) == NULL) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } + if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER)) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + if (fdwPrepare) + ret = MMSYSERR_INVALFLAG; + + if (pash->fdwStatus & ACMSTREAMHEADER_STATUSF_DONE) + return MMSYSERR_NOERROR; + + /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same + * size. some fields are private to msacm internals, and are exposed + * in ACMSTREAMHEADER in the dwReservedDriver array + */ + padsh = (PACMDRVSTREAMHEADER)pash; + + padsh->fdwConvert = fdwPrepare; + padsh->padshNext = NULL; + padsh->fdwDriver = padsh->dwDriver = 0L; + + padsh->fdwPrepared = 0; + padsh->dwPrepared = 0; + padsh->pbPreparedSrc = 0; + padsh->cbPreparedSrcLength = 0; + padsh->pbPreparedDst = 0; + padsh->cbPreparedDstLength = 0; + + ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_PREPARE, (DWORD)&was->drvInst, (DWORD)padsh); + if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) { + ret = MMSYSERR_NOERROR; + padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE); + padsh->fdwStatus |= ACMSTREAMHEADER_STATUSF_PREPARED; + padsh->fdwPrepared = padsh->fdwStatus; + padsh->dwPrepared = 0; + padsh->pbPreparedSrc = padsh->pbSrc; + padsh->cbPreparedSrcLength = padsh->cbSrcLength; + padsh->pbPreparedDst = padsh->pbDst; + padsh->cbPreparedDstLength = padsh->cbDstLength; + } else { + padsh->fdwPrepared = 0; + padsh->dwPrepared = 0; + padsh->pbPreparedSrc = 0; + padsh->cbPreparedSrcLength = 0; + padsh->pbPreparedDst = 0; + padsh->cbPreparedDstLength = 0; + } + TRACE("=> (%d)\n", ret); + return ret; +} + +/*********************************************************************** + * acmStreamReset (MSACM32.@) + */ +MMRESULT WINAPI acmStreamReset(HACMSTREAM has, DWORD fdwReset) +{ + PWINE_ACMSTREAM was; + MMRESULT ret = MMSYSERR_NOERROR; + + TRACE("(%p, %ld)\n", has, fdwReset); + + if (fdwReset) { + WARN("invalid flag\n"); + ret = MMSYSERR_INVALFLAG; + } else if ((was = ACM_GetStream(has)) == NULL) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } else if (was->drvInst.fdwOpen & ACM_STREAMOPENF_ASYNC) { + ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_RESET, (DWORD)&was->drvInst, 0); + } + TRACE("=> (%d)\n", ret); + return ret; +} + +/*********************************************************************** + * acmStreamSize (MSACM32.@) + */ +MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput, + LPDWORD pdwOutputBytes, DWORD fdwSize) +{ + PWINE_ACMSTREAM was; + ACMDRVSTREAMSIZE adss; + MMRESULT ret; + + TRACE("(%p, %ld, %p, %ld)\n", has, cbInput, pdwOutputBytes, fdwSize); + + if ((was = ACM_GetStream(has)) == NULL) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } + if ((fdwSize & ~ACM_STREAMSIZEF_QUERYMASK) != 0) { + WARN("invalid flag\n"); + return MMSYSERR_INVALFLAG; + } + + *pdwOutputBytes = 0L; + + switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) { + case ACM_STREAMSIZEF_DESTINATION: + adss.cbDstLength = cbInput; + adss.cbSrcLength = 0; + break; + case ACM_STREAMSIZEF_SOURCE: + adss.cbSrcLength = cbInput; + adss.cbDstLength = 0; + break; + default: + WARN("invalid flag\n"); + return MMSYSERR_INVALFLAG; + } + + adss.cbStruct = sizeof(adss); + adss.fdwSize = fdwSize; + ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_SIZE, + (DWORD)&was->drvInst, (DWORD)&adss); + if (ret == MMSYSERR_NOERROR) { + switch (fdwSize & ACM_STREAMSIZEF_QUERYMASK) { + case ACM_STREAMSIZEF_DESTINATION: + *pdwOutputBytes = adss.cbSrcLength; + break; + case ACM_STREAMSIZEF_SOURCE: + *pdwOutputBytes = adss.cbDstLength; + break; + } + } + TRACE("=> (%d) [%lu]\n", ret, *pdwOutputBytes); + return ret; +} + +/*********************************************************************** + * acmStreamUnprepareHeader (MSACM32.@) + */ +MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, + DWORD fdwUnprepare) +{ + PWINE_ACMSTREAM was; + MMRESULT ret = MMSYSERR_NOERROR; + PACMDRVSTREAMHEADER padsh; + + TRACE("(%p, %p, %ld)\n", has, pash, fdwUnprepare); + + if ((was = ACM_GetStream(has)) == NULL) { + WARN("invalid handle\n"); + return MMSYSERR_INVALHANDLE; + } + if (!pash || pash->cbStruct < sizeof(ACMSTREAMHEADER)) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + if (!(pash->fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED)) { + WARN("unprepared header\n"); + return ACMERR_UNPREPARED; + } + + /* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same + * size. some fields are private to msacm internals, and are exposed + * in ACMSTREAMHEADER in the dwReservedDriver array + */ + padsh = (PACMDRVSTREAMHEADER)pash; + + /* check that pointers have not been modified */ + if (padsh->pbPreparedSrc != padsh->pbSrc || + padsh->cbPreparedSrcLength < padsh->cbSrcLength || + padsh->pbPreparedDst != padsh->pbDst || + padsh->cbPreparedDstLength < padsh->cbDstLength) { + WARN("invalid parameter\n"); + return MMSYSERR_INVALPARAM; + } + + padsh->fdwConvert = fdwUnprepare; + + ret = SendDriverMessage(was->pDrv->hDrvr, ACMDM_STREAM_UNPREPARE, (DWORD)&was->drvInst, (DWORD)padsh); + if (ret == MMSYSERR_NOERROR || ret == MMSYSERR_NOTSUPPORTED) { + ret = MMSYSERR_NOERROR; + padsh->fdwStatus &= ~(ACMSTREAMHEADER_STATUSF_DONE|ACMSTREAMHEADER_STATUSF_INQUEUE|ACMSTREAMHEADER_STATUSF_PREPARED); + } + TRACE("=> (%d)\n", ret); + return ret; +} diff --git a/reactos/lib/msacm/wineacm.h b/reactos/lib/msacm/wineacm.h new file mode 100644 index 00000000000..5244bfb1800 --- /dev/null +++ b/reactos/lib/msacm/wineacm.h @@ -0,0 +1,363 @@ +/* -*- tab-width: 8; c-basic-offset: 4 -*- */ +/* + * Copyright 2000 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_WINEACM_H +#define __WINE_WINEACM_H + +#ifndef __REACTOS__ +#include "wine/windef16.h" +//#include "wine/mmsystem16.h" + +/*********************************************************************** + * Win16 definitions + */ +typedef BOOL16 (CALLBACK *ACMDRIVERENUMCB16)( + HACMDRIVERID16 hadid, DWORD dwInstance, DWORD fdwSupport +); +typedef UINT (CALLBACK *ACMFILTERCHOOSEHOOKPROC16)( + HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam +); +typedef UINT16 (CALLBACK *ACMFORMATCHOOSEHOOKPROC16)( + HWND16 hwnd, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam +); + +typedef struct _ACMDRIVERDETAILS16 +{ + DWORD cbStruct; + + FOURCC fccType; + FOURCC fccComp; + + WORD wMid; + WORD wPid; + + DWORD vdwACM; + DWORD vdwDriver; + + DWORD fdwSupport; + DWORD cFormatTags; + DWORD cFilterTags; + + HICON16 hicon; + + CHAR szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS]; + CHAR szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS]; + CHAR szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS]; + CHAR szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS]; + CHAR szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS]; +} ACMDRIVERDETAILS16, *NPACMDRIVERDETAILS16, *LPACMDRIVERDETAILS16; + +typedef struct _ACMFILTERCHOOSE16 +{ + DWORD cbStruct; + DWORD fdwStyle; + + HWND16 hwndOwner; + + LPWAVEFILTER pwfltr; + DWORD cbwfltr; + + LPCSTR pszTitle; + + char szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; + char szFilter[ACMFILTERDETAILS_FILTER_CHARS]; + LPSTR pszName; + DWORD cchName; + + DWORD fdwEnum; + LPWAVEFILTER pwfltrEnum; + + HINSTANCE16 hInstance; + LPCSTR pszTemplateName; + LPARAM lCustData; + ACMFILTERCHOOSEHOOKPROC16 pfnHook; +} ACMFILTERCHOOSE16, *NPACMFILTERCHOOSE16, *LPACMFILTERCHOOSE16; + +typedef struct _ACMFILTERDETAILS16 +{ + DWORD cbStruct; + DWORD dwFilterIndex; + DWORD dwFilterTag; + DWORD fdwSupport; + LPWAVEFILTER pwfltr; + DWORD cbwfltr; + CHAR szFilter[ACMFILTERDETAILS_FILTER_CHARS]; +} ACMFILTERDETAILS16, *NPACMFILTERDETAILS16, *LPACMFILTERDETAILS16; + +typedef struct _ACMFILTERTAGDETAILS16 +{ + DWORD cbStruct; + DWORD dwFilterTagIndex; + DWORD dwFilterTag; + DWORD cbFilterSize; + DWORD fdwSupport; + DWORD cStandardFilters; + CHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; +} ACMFILTERTAGDETAILS16, *NPACMFILTERTAGDETAILS16, *LPACMFILTERTAGDETAILS16; + +typedef struct _ACMFORMATCHOOSE16 +{ + DWORD cbStruct; + DWORD fdwStyle; + + HWND16 hwndOwner; + + LPWAVEFORMATEX pwfx; + DWORD cbwfx; + LPCSTR pszTitle; + + CHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; + CHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; + + LPSTR pszName; + DWORD cchName; + + DWORD fdwEnum; + LPWAVEFORMATEX pwfxEnum; + + HINSTANCE16 hInstance; + LPCSTR pszTemplateName; + LPARAM lCustData; + ACMFORMATCHOOSEHOOKPROC16 pfnHook; +} ACMFORMATCHOOSE16, *NPACMFORMATCHOOSE16, *LPACMFORMATCHOOSE16; + +typedef struct _ACMFORMATDETAILS16 +{ + DWORD cbStruct; + DWORD dwFormatIndex; + DWORD dwFormatTag; + DWORD fdwSupport; + LPWAVEFORMATEX pwfx; + DWORD cbwfx; + CHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; +} ACMFORMATDETAILS16, *NPACMFORMATDETAILS16, *LPACMFORMATDETAILS16; + +typedef struct _ACMFORMATTAGDETAILS16 +{ + DWORD cbStruct; + DWORD dwFormatTagIndex; + DWORD dwFormatTag; + DWORD cbFormatSize; + DWORD fdwSupport; + DWORD cStandardFormats; + CHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; +} ACMFORMATTAGDETAILS16, *NPACMFORMATTAGDETAILS16, *LPACMFORMATTAGDETAILS16; + +typedef ACMSTREAMHEADER ACMSTREAMHEADER16, *NPACMSTREAMHEADER16, *LPACMSTREAMHEADER16; + +typedef BOOL16 (CALLBACK *ACMFILTERENUMCB16)( + HACMDRIVERID16 hadid, LPACMFILTERDETAILS16 pafd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL16 (CALLBACK *ACMFILTERTAGENUMCB16)( + HACMDRIVERID16 hadid, LPACMFILTERTAGDETAILS16 paftd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL16 (CALLBACK *ACMFORMATENUMCB16)( + HACMDRIVERID16 hadid, LPACMFORMATDETAILS16 pafd, + DWORD dwInstance, DWORD fdwSupport +); + +typedef BOOL16 (CALLBACK *ACMFORMATTAGENUMCB16)( + HACMDRIVERID16 hadid, LPACMFORMATTAGDETAILS16 paftd, + DWORD dwInstance, DWORD fdwSupport +); + +/*********************************************************************** + * Functions - Win16 + */ + +DWORD WINAPI acmGetVersion16( +); +MMRESULT16 WINAPI acmMetrics16( + HACMOBJ16 hao, UINT16 uMetric, LPVOID pMetric +); +MMRESULT16 WINAPI acmDriverEnum16( + ACMDRIVERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT16 WINAPI acmDriverDetails16( + HACMDRIVERID16 hadid, LPACMDRIVERDETAILS16 padd, DWORD fdwDetails +); +MMRESULT16 WINAPI acmDriverAdd16( + LPHACMDRIVERID16 phadid, HINSTANCE16 hinstModule, + LPARAM lParam, DWORD dwPriority, DWORD fdwAdd +); +MMRESULT16 WINAPI acmDriverRemove16( + HACMDRIVERID16 hadid, DWORD fdwRemove +); +MMRESULT16 WINAPI acmDriverOpen16( + LPHACMDRIVER16 phad, HACMDRIVERID16 hadid, DWORD fdwOpen +); +MMRESULT16 WINAPI acmDriverClose16( + HACMDRIVER16 had, DWORD fdwClose +); +LRESULT WINAPI acmDriverMessage16( + HACMDRIVER16 had, UINT16 uMsg, LPARAM lParam1, LPARAM lParam2 +); +MMRESULT16 WINAPI acmDriverID16( + HACMOBJ16 hao, LPHACMDRIVERID16 phadid, DWORD fdwDriverID +); +MMRESULT16 WINAPI acmDriverPriority16( + HACMDRIVERID16 hadid, DWORD dwPriority, DWORD fdwPriority +); +MMRESULT16 WINAPI acmFormatTagDetails16( + HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd, DWORD fdwDetails +); +MMRESULT16 WINAPI acmFormatTagEnum16( + HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd, + ACMFORMATTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT16 WINAPI acmFormatChoose16( + LPACMFORMATCHOOSE16 pafmtc +); +MMRESULT16 WINAPI acmFormatDetails16( + HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd, DWORD fdwDetails +); +MMRESULT16 WINAPI acmFormatEnum16( + HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd, + ACMFORMATENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT16 WINAPI acmFormatSuggest16( + HACMDRIVER16 had, LPWAVEFORMATEX pwfxSrc, + LPWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest +); +MMRESULT16 WINAPI acmFilterTagDetails16( + HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd, DWORD fdwDetails +); +MMRESULT16 WINAPI acmFilterTagEnum16( + HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd, + ACMFILTERTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT16 WINAPI acmFilterChoose16( + LPACMFILTERCHOOSE16 pafltrc +); +MMRESULT16 WINAPI acmFilterDetails16( + HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd, DWORD fdwDetails +); +MMRESULT16 WINAPI acmFilterEnum16( + HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd, + ACMFILTERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum +); +MMRESULT16 WINAPI acmStreamOpen16( + LPHACMSTREAM16 phas, HACMDRIVER16 had, + LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst, + LPWAVEFILTER pwfltr, DWORD dwCallback, + DWORD dwInstance, DWORD fdwOpen +); +MMRESULT16 WINAPI acmStreamClose16( + HACMSTREAM16 has, DWORD fdwClose +); +MMRESULT16 WINAPI acmStreamSize16( + HACMSTREAM16 has, DWORD cbInput, + LPDWORD pdwOutputBytes, DWORD fdwSize +); +MMRESULT16 WINAPI acmStreamConvert16( + HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwConvert +); +MMRESULT16 WINAPI acmStreamReset16( + HACMSTREAM16 has, DWORD fdwReset +); +MMRESULT16 WINAPI acmStreamPrepareHeader16( + HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwPrepare +); +MMRESULT16 WINAPI acmStreamUnprepareHeader16( + HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwUnprepare +); +#endif + +/*********************************************************************** + * Wine specific - Win32 + */ +typedef struct _WINE_ACMDRIVERID *PWINE_ACMDRIVERID; +typedef struct _WINE_ACMDRIVER *PWINE_ACMDRIVER; + +#define WINE_ACMOBJ_DONTCARE 0x5EED0000 +#define WINE_ACMOBJ_DRIVERID 0x5EED0001 +#define WINE_ACMOBJ_DRIVER 0x5EED0002 +#define WINE_ACMOBJ_STREAM 0x5EED0003 + +typedef struct _WINE_ACMOBJ +{ + DWORD dwType; + PWINE_ACMDRIVERID pACMDriverID; +} WINE_ACMOBJ, *PWINE_ACMOBJ; + +typedef struct _WINE_ACMDRIVER +{ + WINE_ACMOBJ obj; + HDRVR hDrvr; + PWINE_ACMDRIVER pNextACMDriver; +} WINE_ACMDRIVER; + +typedef struct _WINE_ACMSTREAM +{ + WINE_ACMOBJ obj; + PWINE_ACMDRIVER pDrv; + ACMDRVSTREAMINSTANCE drvInst; + HACMDRIVER hAcmDriver; +} WINE_ACMSTREAM, *PWINE_ACMSTREAM; + +typedef struct _WINE_ACMDRIVERID +{ + WINE_ACMOBJ obj; + LPWSTR pszDriverAlias; + LPWSTR pszFileName; + HINSTANCE hInstModule; /* NULL if global */ + PWINE_ACMDRIVER pACMDriverList; + PWINE_ACMDRIVERID pNextACMDriverID; + PWINE_ACMDRIVERID pPrevACMDriverID; + /* information about the driver itself, either gotten from registry or driver itself */ + DWORD cFilterTags; + DWORD cFormatTags; + DWORD fdwSupport; + struct { + DWORD dwFormatTag; + DWORD cbwfx; + }* aFormatTag; +} WINE_ACMDRIVERID; + +/* From internal.c */ +extern HANDLE MSACM_hHeap; +extern PWINE_ACMDRIVERID MSACM_pFirstACMDriverID; +extern PWINE_ACMDRIVERID MSACM_pLastACMDriverID; +extern PWINE_ACMDRIVERID MSACM_RegisterDriver(LPCWSTR pszDriverAlias, LPCWSTR pszFileName, + HINSTANCE hinstModule); +extern void MSACM_RegisterAllDrivers(void); +extern PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p); +extern void MSACM_UnregisterAllDrivers(void); +extern PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID); +extern PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver); +extern PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type); + +extern MMRESULT MSACM_Message(HACMDRIVER, UINT, LPARAM, LPARAM); +extern BOOL MSACM_FindFormatTagInCache(WINE_ACMDRIVERID*, DWORD, LPDWORD); + +/* From msacm32.c */ +extern HINSTANCE MSACM_hInstance32; + +/* From pcmcnvtr.c */ +LRESULT CALLBACK PCM_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg, + LPARAM dwParam1, LPARAM dwParam2); + +/* Dialog box templates */ +#include "msacmdlg.h" + +#endif /* __WINE_WINEACM_H */ From dcbabca8728c922efd2bc97dedf10872f092c571 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 14 Jul 2004 20:48:58 +0000 Subject: [PATCH 293/356] - Change the prototype of DIB_*_BitBlt* functions to take a pointer to a BLTINFO structure instead of many parameters. - Make DIB_GetSource and DIB_GetSourceIndex macros. - Add IntEngCreateSrcMonoXlate. - Change the semantics of IntEngCreate*Xlate functions to treat palette mode == 0 as mode of the passed palette. - Add XlateBrush and XlatePen to the DC structure. - Fixed the bad design decision that caused mess when one brush was selected into more than one DC. - Remove incorrect Int[Get/Set]DCColor implementation (used by [Get/Set]DC[Pen/Brush]Color). - Get rid of compiler warnings in Win32k. svn path=/trunk/; revision=10116 --- reactos/include/win32k/brush.h | 12 +- reactos/include/win32k/dc.h | 3 + reactos/subsys/win32k/dib/dib.c | 81 ++--- reactos/subsys/win32k/dib/dib.h | 209 ++++++------ reactos/subsys/win32k/dib/dib16bpp.c | 248 +++++++------- reactos/subsys/win32k/dib/dib1bpp.c | 221 ++++++------- reactos/subsys/win32k/dib/dib24bpp.c | 198 +++++------- reactos/subsys/win32k/dib/dib32bpp.c | 247 +++++++------- reactos/subsys/win32k/dib/dib4bpp.c | 251 +++++++-------- reactos/subsys/win32k/dib/dib8bpp.c | 253 +++++++-------- reactos/subsys/win32k/eng/bitblt.c | 60 +++- reactos/subsys/win32k/eng/copybits.c | 38 ++- reactos/subsys/win32k/eng/lineto.c | 16 +- reactos/subsys/win32k/eng/mouse.c | 9 +- reactos/subsys/win32k/eng/xlate.c | 72 ++++- reactos/subsys/win32k/include/inteng.h | 5 + reactos/subsys/win32k/include/intgdi.h | 6 + reactos/subsys/win32k/ntuser/winpos.c | 102 +++--- reactos/subsys/win32k/objects/bitmaps.c | 166 +++------- reactos/subsys/win32k/objects/brush.c | 90 ++++-- reactos/subsys/win32k/objects/cliprgn.c | 6 +- reactos/subsys/win32k/objects/color.c | 11 +- reactos/subsys/win32k/objects/coord.c | 8 +- reactos/subsys/win32k/objects/dc.c | 391 +++++------------------ reactos/subsys/win32k/objects/fillshap.c | 132 ++++---- reactos/subsys/win32k/objects/icm.c | 13 +- reactos/subsys/win32k/objects/line.c | 12 +- reactos/subsys/win32k/objects/metafile.c | 28 +- reactos/subsys/win32k/objects/paint.c | 5 +- reactos/subsys/win32k/objects/path.c | 14 +- reactos/subsys/win32k/objects/pen.c | 4 +- reactos/subsys/win32k/objects/print.c | 9 +- reactos/subsys/win32k/objects/region.c | 7 +- reactos/subsys/win32k/objects/text.c | 31 +- reactos/subsys/win32k/objects/wingl.c | 8 +- 35 files changed, 1322 insertions(+), 1644 deletions(-) diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h index 1c6a9050740..e191ec63e21 100644 --- a/reactos/include/win32k/brush.h +++ b/reactos/include/win32k/brush.h @@ -36,14 +36,9 @@ typedef struct COLORREF crBack; COLORREF crFore; ULONG ulPalTime; -#if 0 ULONG ulSurfTime; PVOID ulRealization; ULONG Unknown4C[3]; -#else - BRUSHOBJ BrushObject; - ULONG Unknown50[2]; -#endif POINT ptPenWidth; ULONG ulPenStyle; DWORD *pStyle; @@ -51,6 +46,13 @@ typedef struct ULONG Unknown6C; } GDIBRUSHOBJ, *PGDIBRUSHOBJ; +typedef struct +{ + BRUSHOBJ BrushObject; + PGDIBRUSHOBJ GdiBrushObject; + XLATEOBJ *XlateObject; +} GDIBRUSHINST, *PGDIBRUSHINST; + /* GDI Brush Attributes */ #define GDIBRUSH_NEED_BK_CLR 0x0002 /* Background color is needed */ diff --git a/reactos/include/win32k/dc.h b/reactos/include/win32k/dc.h index dc7cf9e0cae..f0733848462 100644 --- a/reactos/include/win32k/dc.h +++ b/reactos/include/win32k/dc.h @@ -100,6 +100,9 @@ typedef struct _DC CLIPOBJ *CombinedClip; + XLATEOBJ *XlateBrush; + XLATEOBJ *XlatePen; + INT saveLevel; WIN_DC_INFO w; diff --git a/reactos/subsys/win32k/dib/dib.c b/reactos/subsys/win32k/dib/dib.c index 2ed9d8a906a..07471c237d2 100644 --- a/reactos/subsys/win32k/dib/dib.c +++ b/reactos/subsys/win32k/dib/dib.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib.c,v 1.11 2004/07/03 13:55:35 navaraf Exp $ */ +/* $Id: dib.c,v 1.12 2004/07/14 20:48:56 navaraf Exp $ */ #include /* Static data */ @@ -29,106 +29,66 @@ DIB_FUNCTIONS DibFunctionsForBitmapFormat[] = /* 0 */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt }, /* BMF_1BPP */ { DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine, - DIB_1BPP_BitBlt, DIB_1BPP_StretchBlt, DIB_1BPP_TransparentBlt + DIB_1BPP_BitBlt, DIB_1BPP_BitBltSrcCopy, DIB_1BPP_StretchBlt, + DIB_1BPP_TransparentBlt }, /* BMF_4BPP */ { DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine, - DIB_4BPP_BitBlt, DIB_4BPP_StretchBlt, DIB_4BPP_TransparentBlt + DIB_4BPP_BitBlt, DIB_4BPP_BitBltSrcCopy, DIB_4BPP_StretchBlt, + DIB_4BPP_TransparentBlt }, /* BMF_8BPP */ { DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine, - DIB_8BPP_BitBlt, DIB_8BPP_StretchBlt, DIB_8BPP_TransparentBlt + DIB_8BPP_BitBlt, DIB_8BPP_BitBltSrcCopy, DIB_8BPP_StretchBlt, + DIB_8BPP_TransparentBlt }, /* BMF_16BPP */ { DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine, - DIB_16BPP_BitBlt, DIB_16BPP_StretchBlt, DIB_16BPP_TransparentBlt + DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_16BPP_StretchBlt, + DIB_16BPP_TransparentBlt }, /* BMF_24BPP */ { DIB_24BPP_PutPixel, DIB_24BPP_GetPixel, DIB_24BPP_HLine, DIB_24BPP_VLine, - DIB_24BPP_BitBlt, DIB_24BPP_StretchBlt, DIB_24BPP_TransparentBlt + DIB_24BPP_BitBlt, DIB_24BPP_BitBltSrcCopy, DIB_24BPP_StretchBlt, + DIB_24BPP_TransparentBlt }, /* BMF_32BPP */ { DIB_32BPP_PutPixel, DIB_32BPP_GetPixel, DIB_32BPP_HLine, DIB_32BPP_VLine, - DIB_32BPP_BitBlt, DIB_32BPP_StretchBlt, DIB_32BPP_TransparentBlt + DIB_32BPP_BitBlt, DIB_32BPP_BitBltSrcCopy, DIB_32BPP_StretchBlt, + DIB_32BPP_TransparentBlt }, /* BMF_4RLE */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt }, /* BMF_8RLE */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt }, /* BMF_JPEG */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt }, /* BMF_PNG */ { Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine, - Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt + Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt } }; -ULONG -DIB_GetSource(SURFOBJ* SourceSurf, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation) -{ - switch (SourceSurf->iBitmapFormat) - { - case BMF_1BPP: - return(XLATEOBJ_iXlate(ColorTranslation, DIB_1BPP_GetPixel(SourceSurf, sx, sy))); - case BMF_4BPP: - return(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy))); - case BMF_8BPP: - return(XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy))); - case BMF_16BPP: - return(XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy))); - case BMF_24BPP: - return(XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy))); - case BMF_32BPP: - return(XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy))); - default: - DPRINT1("DIB_GetSource: Unhandled number of bits per pixel in source (%d).\n", BitsPerFormat(SourceSurf->iBitmapFormat)); - return(0); - } -} - -ULONG -DIB_GetSourceIndex(SURFOBJ* SourceSurf, ULONG sx, ULONG sy) -{ - switch (SourceSurf->iBitmapFormat) - { - case BMF_1BPP: - return DIB_1BPP_GetPixel(SourceSurf, sx, sy); - case BMF_4BPP: - return DIB_4BPP_GetPixel(SourceSurf, sx, sy); - case BMF_8BPP: - return DIB_8BPP_GetPixel(SourceSurf, sx, sy); - case BMF_16BPP: - return DIB_16BPP_GetPixel(SourceSurf, sx, sy); - case BMF_24BPP: - return DIB_24BPP_GetPixel(SourceSurf, sx, sy); - case BMF_32BPP: - return DIB_32BPP_GetPixel(SourceSurf, sx, sy); - default: - DPRINT1("DIB_GetOriginalSource: Unhandled number of bits per pixel in source (%d).\n", BitsPerFormat(SourceSurf->iBitmapFormat)); - return(0); - } -} - ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern) { @@ -249,10 +209,7 @@ VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c) return; } -BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* BrushObj, POINTL BrushOrign, - XLATEOBJ *ColorTranslation, ULONG Rop4) +BOOLEAN Dummy_BitBlt(PBLTINFO BltInfo) { return FALSE; } diff --git a/reactos/subsys/win32k/dib/dib.h b/reactos/subsys/win32k/dib/dib.h index b6ca70fa58c..909c779fa2d 100644 --- a/reactos/subsys/win32k/dib/dib.h +++ b/reactos/subsys/win32k/dib/dib.h @@ -1,11 +1,25 @@ #ifndef _W32K_DIB_DIB_H #define _W32K_DIB_DIB_H +typedef struct _BLTINFO +{ + SURFOBJ *DestSurface; + SURFOBJ *SourceSurface; + SURFOBJ *PatternSurface; + XLATEOBJ *XlateSourceToDest; + XLATEOBJ *XlatePatternToDest; + RECTL DestRect; + POINTL SourcePoint; + BRUSHOBJ *Brush; + POINTL BrushOrigin; + ULONG Rop4; +} BLTINFO, *PBLTINFO; + typedef VOID (*PFN_DIB_PutPixel)(SURFOBJ*,LONG,LONG,ULONG); typedef ULONG (*PFN_DIB_GetPixel)(SURFOBJ*,LONG,LONG); typedef VOID (*PFN_DIB_HLine)(SURFOBJ*,LONG,LONG,LONG,ULONG); typedef VOID (*PFN_DIB_VLine)(SURFOBJ*,LONG,LONG,LONG,ULONG); -typedef BOOLEAN (*PFN_DIB_BitBlt)(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,BRUSHOBJ*,POINTL,XLATEOBJ*,ULONG); +typedef BOOLEAN (*PFN_DIB_BitBlt)(PBLTINFO); typedef BOOLEAN (*PFN_DIB_StretchBlt)(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); typedef BOOLEAN (*PFN_DIB_TransparentBlt)(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); @@ -16,137 +30,92 @@ typedef struct PFN_DIB_HLine DIB_HLine; PFN_DIB_VLine DIB_VLine; PFN_DIB_BitBlt DIB_BitBlt; + PFN_DIB_BitBlt DIB_BitBltSrcCopy; PFN_DIB_StretchBlt DIB_StretchBlt; PFN_DIB_TransparentBlt DIB_TransparentBlt; } DIB_FUNCTIONS; extern DIB_FUNCTIONS DibFunctionsForBitmapFormat[]; +VOID Dummy_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG Dummy_GetPixel(SURFOBJ*,LONG,LONG); +VOID Dummy_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID Dummy_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN Dummy_BitBlt(PBLTINFO); +BOOLEAN Dummy_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN Dummy_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +VOID DIB_1BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG DIB_1BPP_GetPixel(SURFOBJ*,LONG,LONG); +VOID DIB_1BPP_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID DIB_1BPP_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN DIB_1BPP_BitBlt(PBLTINFO); +BOOLEAN DIB_1BPP_BitBltSrcCopy(PBLTINFO); +BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +VOID DIB_4BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG DIB_4BPP_GetPixel(SURFOBJ*,LONG,LONG); +VOID DIB_4BPP_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID DIB_4BPP_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN DIB_4BPP_BitBlt(PBLTINFO); +BOOLEAN DIB_4BPP_BitBltSrcCopy(PBLTINFO); +BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +VOID DIB_8BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG DIB_8BPP_GetPixel(SURFOBJ*,LONG,LONG); +VOID DIB_8BPP_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID DIB_8BPP_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN DIB_8BPP_BitBlt(PBLTINFO); +BOOLEAN DIB_8BPP_BitBltSrcCopy(PBLTINFO); +BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +VOID DIB_16BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG DIB_16BPP_GetPixel(SURFOBJ*,LONG,LONG); +VOID DIB_16BPP_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID DIB_16BPP_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN DIB_16BPP_BitBlt(PBLTINFO); +BOOLEAN DIB_16BPP_BitBltSrcCopy(PBLTINFO); +BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +VOID DIB_24BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG DIB_24BPP_GetPixel(SURFOBJ*,LONG,LONG); +VOID DIB_24BPP_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID DIB_24BPP_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN DIB_24BPP_BitBlt(PBLTINFO); +BOOLEAN DIB_24BPP_BitBltSrcCopy(PBLTINFO); +BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +VOID DIB_32BPP_PutPixel(SURFOBJ*,LONG,LONG,ULONG); +ULONG DIB_32BPP_GetPixel(SURFOBJ*,LONG,LONG); +VOID DIB_32BPP_HLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +VOID DIB_32BPP_VLine(SURFOBJ*,LONG,LONG,LONG,ULONG); +BOOLEAN DIB_32BPP_BitBlt(PBLTINFO); +BOOLEAN DIB_32BPP_BitBltSrcCopy(PBLTINFO); +BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIPOBJ*,XLATEOBJ*,ULONG); +BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG); + +#define ROP_USES_SOURCE(Rop4) (((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000)) +#define ROP_USES_PATTERN(Rop4) (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) + extern unsigned char notmask[2]; extern unsigned char altnotmask[2]; #define MASK1BPP(x) (1<<(7-((x)&7))) -ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern); -ULONG DIB_GetSource(SURFOBJ* SourceSurf, ULONG sx, ULONG sy, XLATEOBJ* ColorTranslation); -ULONG DIB_GetSourceIndex(SURFOBJ* SourceSurf, ULONG sx, ULONG sy); -VOID Dummy_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG Dummy_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID Dummy_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN Dummy_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* BrushObj, POINTL BrushOrign, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrign, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN Dummy_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); +ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern); -VOID DIB_1BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG DIB_1BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID DIB_1BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID DIB_1BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN DIB_1BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN DIB_1BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); +#define DIB_GetSource(SourceSurf,sx,sy,ColorTranslation) \ + XLATEOBJ_iXlate(ColorTranslation, \ + DibFunctionsForBitmapFormat[SourceSurf->iBitmapFormat]. \ + DIB_GetPixel(SourceSurf, sx, sy)) -VOID DIB_4BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG DIB_4BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID DIB_4BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID DIB_4BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); - -VOID DIB_8BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG DIB_8BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID DIB_8BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID DIB_8BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN DIB_8BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); - -VOID DIB_16BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG DIB_16BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID DIB_16BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID DIB_16BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN DIB_16BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); - -VOID DIB_24BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG DIB_24BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID DIB_24BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID DIB_24BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN DIB_24BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); - -VOID DIB_32BPP_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c); -ULONG DIB_32BPP_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y); -VOID DIB_32BPP_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c); -VOID DIB_32BPP_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c); -BOOLEAN DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - BRUSHOBJ* Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4); -BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, RECTL *SourceRect, - POINTL* MaskOrigin, POINTL BrushOrigin, - CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, - ULONG Mode); -BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - RECTL* DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation, ULONG iTransColor); +#define DIB_GetSourceIndex(SourceSurf,sx,sy) \ + DibFunctionsForBitmapFormat[SourceSurf->iBitmapFormat]. \ + DIB_GetPixel(SourceSurf, sx, sy) #endif /* _W32K_DIB_DIB_H */ diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 339bcb66c0d..33cc1e46cbe 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib16bpp.c,v 1.34 2004/07/03 17:40:24 navaraf Exp $ */ +/* $Id: dib16bpp.c,v 1.35 2004/07/14 20:48:56 navaraf Exp $ */ #include VOID @@ -67,32 +67,30 @@ DIB_16BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) } } -BOOLEAN STATIC -DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation) +BOOLEAN +DIB_16BPP_BitBltSrcCopy(PBLTINFO BltInfo) { LONG i, j, sx, sy, xColor, f1; PBYTE SourceBits, DestBits, SourceLine, DestLine; PBYTE SourceBits_4BPP, SourceLine_4BPP; - DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 2 * DestRect->left; + DestBits = BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta) + 2 * BltInfo->DestRect.left; - switch(SourceSurf->iBitmapFormat) + switch(BltInfo->SourceSurface->iBitmapFormat) { case BMF_1BPP: - sx = SourcePoint->x; - sy = SourcePoint->y; + sx = BltInfo->SourcePoint.x; + sy = BltInfo->SourcePoint.y; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) { - DIB_16BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 0)); + DIB_16BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); } else { - DIB_16BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 1)); + DIB_16BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); } sx++; } @@ -101,161 +99,161 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_4BPP: - SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); + SourceBits_4BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.x >> 1); - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_4BPP = SourceBits_4BPP; - sx = SourcePoint->x; + sx = BltInfo->SourcePoint.x; f1 = sx & 1; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); - DIB_16BPP_PutPixel(DestSurf, i, j, xColor); + DIB_16BPP_PutPixel(BltInfo->DestSurface, i, j, xColor); if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } sx++; } - SourceBits_4BPP += SourceSurf->lDelta; + SourceBits_4BPP += BltInfo->SourceSurface->lDelta; } break; case BMF_8BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(ColorTranslation, *SourceBits); + *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceBits); SourceBits += 1; DestBits += 2; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_16BPP: - if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) + if (NULL == BltInfo->XlateSourceToDest || 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL)) { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceBits = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; - for (j = DestRect->top; j < DestRect->bottom; j++) + SourceBits = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { - RtlMoveMemory(DestBits, SourceBits, 2 * (DestRect->right - DestRect->left)); - SourceBits += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, 2 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); + SourceBits += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } } else { - SourceBits = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + 2 * SourcePoint->x; - DestBits = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + 2 * DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceBits = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; + DestBits = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 2 * BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { - RtlMoveMemory(DestBits, SourceBits, 2 * (DestRect->right - DestRect->left)); - SourceBits -= SourceSurf->lDelta; - DestBits -= DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, 2 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); + SourceBits -= BltInfo->SourceSurface->lDelta; + DestBits -= BltInfo->DestSurface->lDelta; } } } else { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(ColorTranslation, *((WORD *)SourceBits)); + *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *((WORD *)SourceBits)); SourceBits += 2; DestBits += 2; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } } else { - SourceLine = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + 2 * SourcePoint->x; - DestLine = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + 2 * DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceLine = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; + DestLine = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 2 * BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(ColorTranslation, *((WORD *)SourceBits)); + *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *((WORD *)SourceBits)); SourceBits += 2; DestBits += 2; } - SourceLine -= SourceSurf->lDelta; - DestLine -= DestSurf->lDelta; + SourceLine -= BltInfo->SourceSurface->lDelta; + DestLine -= BltInfo->DestSurface->lDelta; } } } break; case BMF_24BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 3 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = (*(SourceBits + 2) << 0x10) + (*(SourceBits + 1) << 0x08) + (*(SourceBits)); - *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(ColorTranslation, xColor); + *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 3; DestBits += 2; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_32BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(ColorTranslation, *((PDWORD) SourceBits)); + *((WORD *)DestBits) = (WORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *((PDWORD) SourceBits)); SourceBits += 4; DestBits += 2; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; default: - DPRINT1("DIB_16BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DPRINT1("DIB_16BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); return FALSE; } @@ -263,124 +261,94 @@ DIB_16BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } BOOLEAN -DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - BRUSHOBJ *Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_16BPP_BitBlt(PBLTINFO BltInfo) { - ULONG X, Y; + ULONG DestX, DestY; ULONG SourceX, SourceY; - ULONG wd, Dest, Source = 0, Pattern = 0; - PULONG DestBits; + ULONG PatternY = 0; + ULONG Dest, Source = 0, Pattern = 0; BOOL UsesSource; BOOL UsesPattern; + PULONG DestBits; ULONG RoundedRight; - /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; - HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj = NULL; - ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; - if (Rop4 == SRCCOPY) - { - return DIB_16BPP_BitBltSrcCopy( - DestSurf, - SourceSurf, - DestRect, - SourcePoint, - ColorTranslation); - } - - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; + UsesSource = ROP_USES_SOURCE(BltInfo->Rop4); + UsesPattern = ROP_USES_PATTERN(BltInfo->Rop4); + RoundedRight = BltInfo->DestRect.right - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) & 0x1); + SourceY = BltInfo->SourcePoint.y; + DestBits = (PULONG)( + BltInfo->DestSurface->pvScan0 + + (BltInfo->DestRect.left << 1) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); + if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + if (BltInfo->PatternSurface) { - PBITMAPOBJ PatternBitmap; - - GdiBrush = CONTAINING_RECORD( - Brush, - GDIBRUSHOBJ, - BrushObject); - - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - - PatternObj = &PatternBitmap->SurfObj; - PatternWidth = PatternObj->sizlBitmap.cx; - PatternHeight = PatternObj->sizlBitmap.cy; - - UsesPattern = TRUE; + PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % + BltInfo->PatternSurface->sizlBitmap.cy; } else { - UsesPattern = FALSE; - Pattern = (Brush->iSolidColor & 0xFFFF) | - ((Brush->iSolidColor & 0xFFFF) << 16); + Pattern = BltInfo->Brush->iSolidColor | + (BltInfo->Brush->iSolidColor << 16); } } - - wd = ((DestRect->right - DestRect->left) << 1) - DestSurf->lDelta; - RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x1); - SourceY = SourcePoint->y; - DestBits = (PULONG)( - DestSurf->pvScan0 + - (DestRect->left << 1) + - DestRect->top * DestSurf->lDelta); - for (Y = DestRect->top; Y < DestRect->bottom; Y++) + for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) { - SourceX = SourcePoint->x; + SourceX = BltInfo->SourcePoint.x; - if(UsesPattern) - PatternY = (Y + BrushOrigin.y) % PatternHeight; - - for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) + for (DestX = BltInfo->DestRect.left; DestX < RoundedRight; DestX += 2, DestBits++, SourceX += 2) { Dest = *DestBits; if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); - Source |= DIB_GetSource(SourceSurf, SourceX + 1, SourceY, ColorTranslation) << 16; + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + 1, SourceY, BltInfo->XlateSourceToDest) << 16; } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 1) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 16; } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern); } - if (X < DestRect->right) + if (DestX < BltInfo->DestRect.right) { Dest = *((PUSHORT)DestBits); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - DIB_16BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); + DIB_16BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xFFFF); DestBits = (PULONG)((ULONG_PTR)DestBits + 2); } SourceY++; + if (BltInfo->PatternSurface) + { + PatternY++; + PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; + } DestBits = (PULONG)( - (ULONG_PTR)DestBits - wd); + (ULONG_PTR)DestBits - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 1) + + BltInfo->DestSurface->lDelta); } - - if (PatternSurface != NULL) - BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index bace95e7501..cdc4ef2b634 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib1bpp.c,v 1.31 2004/07/03 17:40:24 navaraf Exp $ */ +/* $Id: dib1bpp.c,v 1.32 2004/07/14 20:48:56 navaraf Exp $ */ #include VOID @@ -227,30 +227,27 @@ DIB_1BPP_BitBltSrcCopy_From1BPP ( } BOOLEAN -DIB_1BPP_BitBltSrcCopy( - SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation) +DIB_1BPP_BitBltSrcCopy(PBLTINFO BltInfo) { - LONG i, j, sx, sy = SourcePoint->y; + LONG i, j, sx, sy = BltInfo->SourcePoint.y; - switch ( SourceSurf->iBitmapFormat ) + switch ( BltInfo->SourceSurface->iBitmapFormat ) { case BMF_1BPP: - DIB_1BPP_BitBltSrcCopy_From1BPP ( DestSurf, SourceSurf, DestRect, SourcePoint ); + DIB_1BPP_BitBltSrcCopy_From1BPP ( BltInfo->DestSurface, BltInfo->SourceSurface, &BltInfo->DestRect, &BltInfo->SourcePoint ); break; case BMF_4BPP: - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)) == 0) + if(XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy)) == 0) { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 0); } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 1); } sx++; } @@ -259,16 +256,16 @@ DIB_1BPP_BitBltSrcCopy( break; case BMF_8BPP: - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)) == 0) + if(XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, DIB_8BPP_GetPixel(BltInfo->SourceSurface, sx, sy)) == 0) { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 0); } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 1); } sx++; } @@ -277,16 +274,16 @@ DIB_1BPP_BitBltSrcCopy( break; case BMF_16BPP: - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)) == 0) + if(XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, DIB_16BPP_GetPixel(BltInfo->SourceSurface, sx, sy)) == 0) { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 0); } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 1); } sx++; } @@ -295,16 +292,16 @@ DIB_1BPP_BitBltSrcCopy( break; case BMF_24BPP: - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)) == 0) + if(XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, DIB_24BPP_GetPixel(BltInfo->SourceSurface, sx, sy)) == 0) { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 0); } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 1); } sx++; } @@ -313,16 +310,16 @@ DIB_1BPP_BitBltSrcCopy( break; case BMF_32BPP: - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)) == 0) + if(XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, DIB_32BPP_GetPixel(BltInfo->SourceSurface, sx, sy)) == 0) { - DIB_1BPP_PutPixel(DestSurf, i, j, 0); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 0); } else { - DIB_1BPP_PutPixel(DestSurf, i, j, 1); + DIB_1BPP_PutPixel(BltInfo->DestSurface, i, j, 1); } sx++; } @@ -331,7 +328,7 @@ DIB_1BPP_BitBltSrcCopy( break; default: - DbgPrint("DIB_1BPP_BitBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DbgPrint("DIB_1BPP_BitBlt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); return FALSE; } @@ -339,99 +336,70 @@ DIB_1BPP_BitBltSrcCopy( } BOOLEAN -DIB_1BPP_BitBlt( - SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - BRUSHOBJ *Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_1BPP_BitBlt(PBLTINFO BltInfo) { - ULONG X, Y, SourceX, SourceY, k; + ULONG DestX, DestY; + ULONG SourceX, SourceY; + ULONG PatternY = 0; ULONG Dest, Source = 0, Pattern = 0; + ULONG Index; + BOOLEAN UsesSource; + BOOLEAN UsesPattern; PULONG DestBits; - BOOL UsesSource; - BOOL UsesPattern; ULONG RoundedRight; - BYTE NoBits; - /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; - HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj = NULL; - ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; +/* BYTE NoBits;*/ - if (Rop4 == SRCCOPY) - { - return DIB_1BPP_BitBltSrcCopy( - DestSurf, - SourceSurf, - DestRect, - SourcePoint, - ColorTranslation); - } + UsesSource = ROP_USES_SOURCE(BltInfo->Rop4); + UsesPattern = ROP_USES_PATTERN(BltInfo->Rop4); - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; + RoundedRight = BltInfo->DestRect.right - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) & 31); + SourceY = BltInfo->SourcePoint.y; if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + if (BltInfo->PatternSurface) { - PBITMAPOBJ PatternBitmap; - - GdiBrush = CONTAINING_RECORD( - Brush, - GDIBRUSHOBJ, - BrushObject); - - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - - PatternObj = &PatternBitmap->SurfObj; - PatternWidth = PatternObj->sizlBitmap.cx; - PatternHeight = PatternObj->sizlBitmap.cy; - - UsesPattern = TRUE; + PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % + BltInfo->PatternSurface->sizlBitmap.cy; } else { - UsesPattern = FALSE; - Pattern = Brush->iSolidColor; + /* FIXME: Shouldn't it be expanded? */ + Pattern = BltInfo->Brush->iSolidColor; } } - RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 31); - SourceY = SourcePoint->y; - - for (Y = DestRect->top; Y < DestRect->bottom; Y++) + for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) { - SourceX = SourcePoint->x; + DestX = BltInfo->DestRect.left; + SourceX = BltInfo->SourcePoint.x; DestBits = (PULONG)( - DestSurf->pvScan0 + - (DestRect->left >> 3) + - Y * DestSurf->lDelta); + BltInfo->DestSurface->pvScan0 + + (BltInfo->DestRect.left >> 3) + + DestY * BltInfo->DestSurface->lDelta); - if(UsesPattern) - PatternY = (Y + BrushOrigin.y) % PatternHeight; - - X = DestRect->left; - if (X & 31) + if (DestX & 31) { +#if 0 /* FIXME: This case is completely untested!!! */ Dest = *((PBYTE)DestBits); - NoBits = 31 - (X & 31); + NoBits = 31 - (DestX & 31); if (UsesSource) { Source = 0; - for (k = 31 - NoBits; k < NoBits; k++) - Source |= (DIB_GetSource(SourceSurf, SourceX + k, SourceY, ColorTranslation) << (31 - k)); + /* FIXME: This is incorrect! */ + for (Index = 31 - NoBits; Index >= 0; Index++) + Source |= (DIB_GetSource(SourceSurf, SourceX + Index, SourceY, ColorTranslation) << (31 - Index)); } - if (UsesPattern) + if (BltInfo->PatternSurface) { Pattern = 0; - for (k = 31 - NoBits; k < NoBits; k++) - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + k) % PatternWidth, PatternY) << (31 - k)); + for (k = 31 - NoBits; k >= 0; k++) + Pattern |= (DIB_GetSource(PatternObj, (X + BrushOrigin.x + k) % PatternWidth, PatternY, BltInfo->XlatePatternToDest) << (31 - k)); } Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); @@ -440,69 +408,72 @@ DIB_1BPP_BitBlt( *DestBits = Dest; - X += NoBits; + DestX += NoBits; SourceX += NoBits; +#endif } - for (; X < RoundedRight; X += 32, DestBits++, SourceX++) + for (; DestX < RoundedRight; DestX += 32, DestBits++, SourceX++) { Dest = *DestBits; if (UsesSource) { Source = 0; - for (k = 0; k < 8; k++) + for (Index = 0; Index < 8; Index++) { - Source |= (DIB_GetSource(SourceSurf, SourceX + k, SourceY, ColorTranslation) << (7 - k)); - Source |= (DIB_GetSource(SourceSurf, SourceX + k + 8, SourceY, ColorTranslation) << (8 + (7 - k))); - Source |= (DIB_GetSource(SourceSurf, SourceX + k + 16, SourceY, ColorTranslation) << (16 + (7 - k))); - Source |= (DIB_GetSource(SourceSurf, SourceX + k + 24, SourceY, ColorTranslation) << (24 + (7 - k))); + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + Index, SourceY, BltInfo->XlateSourceToDest) << (7 - Index); + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + Index + 8, SourceY, BltInfo->XlateSourceToDest) << (8 + (7 - Index)); + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + Index + 16, SourceY, BltInfo->XlateSourceToDest) << (16 + (7 - Index)); + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + Index + 24, SourceY, BltInfo->XlateSourceToDest) << (24 + (7 - Index)); } } - if (UsesPattern) + if (BltInfo->PatternSurface) { Pattern = 0; - for (k = 0; k < 8; k++) + for (Index = 0; Index < 8; Index++) { - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + k) % PatternWidth, PatternY) << (7 - k)); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + k + 8) % PatternWidth, PatternY) << (8 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + k + 16) % PatternWidth, PatternY) << (16 + (7 - k))); - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x + k + 24) % PatternWidth, PatternY) << (24 + (7 - k))); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + Index) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << (7 - Index); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + Index + 8) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << (8 + (7 - Index)); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + Index + 16) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << (16 + (7 - Index)); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + Index + 24) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << (24 + (7 - Index)); } } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern); } - if (X < DestRect->right) + if (DestX < BltInfo->DestRect.right) { // Dest = *DestBits; - for (; X < DestRect->right; X++, SourceX++) + for (; DestX < BltInfo->DestRect.right; DestX++, SourceX++) { // Dest = *DestBits; - Dest = DIB_1BPP_GetPixel(DestSurf, X, Y); + Dest = DIB_1BPP_GetPixel(BltInfo->DestSurface, DestX, DestY); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY); + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); + DIB_1BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF); // Dest >>= 1; } } SourceY++; + if (BltInfo->PatternSurface) + { + PatternY++; + PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; + } } - - if (PatternSurface != NULL) - BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 9d158967ab6..7b7ebabba0d 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib24bpp.c,v 1.30 2004/07/03 17:40:24 navaraf Exp $ */ +/* $Id: dib24bpp.c,v 1.31 2004/07/14 20:48:56 navaraf Exp $ */ #include VOID @@ -66,33 +66,31 @@ DIB_24BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) } BOOLEAN -DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation) +DIB_24BPP_BitBltSrcCopy(PBLTINFO BltInfo) { LONG i, j, sx, sy, xColor, f1; PBYTE SourceBits, DestBits, SourceLine, DestLine; PBYTE SourceBits_4BPP, SourceLine_4BPP; PWORD SourceBits_16BPP, SourceLine_16BPP; - DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + DestRect->left * 3; + DestBits = BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta) + BltInfo->DestRect.left * 3; - switch(SourceSurf->iBitmapFormat) + switch(BltInfo->SourceSurface->iBitmapFormat) { case BMF_1BPP: - sx = SourcePoint->x; - sy = SourcePoint->y; + sx = BltInfo->SourcePoint.x; + sy = BltInfo->SourcePoint.y; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) { - DIB_24BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 0)); + DIB_24BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); } else { - DIB_24BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 1)); + DIB_24BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); } sx++; } @@ -101,18 +99,18 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_4BPP: - SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); + SourceBits_4BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.x >> 1); - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_4BPP = SourceBits_4BPP; DestLine = DestBits; - sx = SourcePoint->x; + sx = BltInfo->SourcePoint.x; f1 = sx & 1; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); *DestLine++ = xColor & 0xff; *(PWORD)DestLine = xColor >> 8; @@ -121,114 +119,114 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sx++; } - SourceBits_4BPP += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + SourceBits_4BPP += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } break; case BMF_8BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, *SourceBits); + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceBits); *DestBits = xColor & 0xff; *(PWORD)(DestBits + 1) = xColor >> 8; SourceBits += 1; DestBits += 3; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_16BPP: - SourceBits_16BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; + SourceBits_16BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_16BPP = SourceBits_16BPP; DestLine = DestBits; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, *SourceLine_16BPP); + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceLine_16BPP); *DestLine++ = xColor & 0xff; *(PWORD)DestLine = xColor >> 8; DestLine += 2; SourceLine_16BPP++; } - SourceBits_16BPP = (PWORD)((PBYTE)SourceBits_16BPP + SourceSurf->lDelta); - DestBits += DestSurf->lDelta; + SourceBits_16BPP = (PWORD)((PBYTE)SourceBits_16BPP + BltInfo->SourceSurface->lDelta); + DestBits += BltInfo->DestSurface->lDelta; } break; case BMF_24BPP: - if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) + if (NULL == BltInfo->XlateSourceToDest || 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL)) { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceBits = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; - for (j = DestRect->top; j < DestRect->bottom; j++) + SourceBits = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 3 * BltInfo->SourcePoint.x; + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { - RtlMoveMemory(DestBits, SourceBits, 3 * (DestRect->right - DestRect->left)); - SourceBits += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, 3 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); + SourceBits += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } } else { - SourceBits = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + 3 * SourcePoint->x; - DestBits = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + 3 * DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceBits = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 3 * BltInfo->SourcePoint.x; + DestBits = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 3 * BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { - RtlMoveMemory(DestBits, SourceBits, 3 * (DestRect->right - DestRect->left)); - SourceBits -= SourceSurf->lDelta; - DestBits -= DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, 3 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); + SourceBits -= BltInfo->SourceSurface->lDelta; + DestBits -= BltInfo->DestSurface->lDelta; } } } else { /* FIXME */ - DPRINT1("DIB_24BPP_Bitblt: Unhandled ColorTranslation for 16 -> 16 copy\n"); + DPRINT1("DIB_24BPP_Bitblt: Unhandled BltInfo->XlateSourceToDest for 16 -> 16 copy\n"); return FALSE; } break; case BMF_32BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, *((PDWORD) SourceBits)); + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *((PDWORD) SourceBits)); *DestBits = xColor & 0xff; *(PWORD)(DestBits + 1) = xColor >> 8; SourceBits += 4; DestBits += 3; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; default: - DbgPrint("DIB_24BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DbgPrint("DIB_24BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); return FALSE; } @@ -236,102 +234,70 @@ DIB_24BPP_BitBltSrcCopy( SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } BOOLEAN -DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - BRUSHOBJ *Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_24BPP_BitBlt(PBLTINFO BltInfo) { - ULONG X, Y; + ULONG DestX, DestY; ULONG SourceX, SourceY; + ULONG PatternY = 0; ULONG Dest, Source = 0, Pattern = 0; - PBYTE DestBits; BOOL UsesSource; BOOL UsesPattern; - /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; - HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj = NULL; - ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; + PBYTE DestBits; - if (Rop4 == SRCCOPY) - { - return DIB_24BPP_BitBltSrcCopy( - DestSurf, - SourceSurf, - DestRect, - SourcePoint, - ColorTranslation); - } - - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; + UsesSource = ROP_USES_SOURCE(BltInfo->Rop4); + UsesPattern = ROP_USES_PATTERN(BltInfo->Rop4); + SourceY = BltInfo->SourcePoint.y; + DestBits = (PBYTE)( + BltInfo->DestSurface->pvScan0 + + (BltInfo->DestRect.left << 1) + BltInfo->DestRect.left + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); + if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + if (BltInfo->PatternSurface) { - PBITMAPOBJ PatternBitmap; - - GdiBrush = CONTAINING_RECORD( - Brush, - GDIBRUSHOBJ, - BrushObject); - - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - - PatternObj = &PatternBitmap->SurfObj; - PatternWidth = PatternObj->sizlBitmap.cx; - PatternHeight = PatternObj->sizlBitmap.cy; - - UsesPattern = TRUE; + PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % + BltInfo->PatternSurface->sizlBitmap.cy; } else { - UsesPattern = FALSE; - Pattern = Brush->iSolidColor; + Pattern = BltInfo->Brush->iSolidColor; } } - SourceY = SourcePoint->y; - DestBits = (PBYTE)( - DestSurf->pvScan0 + - (DestRect->left << 1) + DestRect->left + - DestRect->top * DestSurf->lDelta); - - for (Y = DestRect->top; Y < DestRect->bottom; Y++) + for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) { - SourceX = SourcePoint->x; + SourceX = BltInfo->SourcePoint.x; - if(UsesPattern) - PatternY = (Y + BrushOrigin.y) % PatternHeight; - - for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) + for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits += 3, SourceX++) { Dest = *((PUSHORT)DestBits) + (*(DestBits + 2) << 16); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - Dest = DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFFFF; + Dest = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xFFFFFF; *(PUSHORT)(DestBits) = Dest & 0xFFFF; *(DestBits + 2) = Dest >> 16; } SourceY++; - DestBits -= (DestRect->right - DestRect->left) * 3; - DestBits += DestSurf->lDelta; + if (BltInfo->PatternSurface) + { + PatternY++; + PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; + } + DestBits -= (BltInfo->DestRect.right - BltInfo->DestRect.left) * 3; + DestBits += BltInfo->DestSurface->lDelta; } - - if (PatternSurface != NULL) - BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index a9ffaaf613c..7b9d490698b 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib32bpp.c,v 1.29 2004/07/03 17:40:24 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.30 2004/07/14 20:48:56 navaraf Exp $ */ #include VOID @@ -67,33 +67,31 @@ DIB_32BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) } BOOLEAN -DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation) +DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo) { LONG i, j, sx, sy, xColor, f1; PBYTE SourceBits, DestBits, SourceLine, DestLine; PBYTE SourceBits_4BPP, SourceLine_4BPP; PDWORD Source32, Dest32; - DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + 4 * DestRect->left; + DestBits = BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left; - switch(SourceSurf->iBitmapFormat) + switch(BltInfo->SourceSurface->iBitmapFormat) { case BMF_1BPP: - sx = SourcePoint->x; - sy = SourcePoint->y; + sx = BltInfo->SourcePoint.x; + sy = BltInfo->SourcePoint.y; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) { - DIB_32BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 0)); + DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); } else { - DIB_32BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 1)); + DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); } sx++; } @@ -102,182 +100,182 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_4BPP: - SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); + SourceBits_4BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.x >> 1); - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_4BPP = SourceBits_4BPP; - sx = SourcePoint->x; + sx = BltInfo->SourcePoint.x; f1 = sx & 1; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); - DIB_32BPP_PutPixel(DestSurf, i, j, xColor); + DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, xColor); if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } sx++; } - SourceBits_4BPP += SourceSurf->lDelta; + SourceBits_4BPP += BltInfo->SourceSurface->lDelta; } break; case BMF_8BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = *SourceBits; - *((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(ColorTranslation, xColor); + *((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 1; DestBits += 4; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_16BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = *((PWORD) SourceBits); - *((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(ColorTranslation, xColor); + *((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 2; DestBits += 4; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_24BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 3 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = (*(SourceBits + 2) << 0x10) + (*(SourceBits + 1) << 0x08) + (*(SourceBits)); - *((PDWORD)DestBits) = (DWORD)XLATEOBJ_iXlate(ColorTranslation, xColor); + *((PDWORD)DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 3; DestBits += 4; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_32BPP: - if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) + if (NULL == BltInfo->XlateSourceToDest || 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL)) { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceBits = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; - for (j = DestRect->top; j < DestRect->bottom; j++) + SourceBits = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { - RtlMoveMemory(DestBits, SourceBits, 4 * (DestRect->right - DestRect->left)); - SourceBits += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, 4 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); + SourceBits += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } } else { - SourceBits = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + 4 * SourcePoint->x; - DestBits = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + 4 * DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceBits = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; + DestBits = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { - RtlMoveMemory(DestBits, SourceBits, 4 * (DestRect->right - DestRect->left)); - SourceBits -= SourceSurf->lDelta; - DestBits -= DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, 4 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); + SourceBits -= BltInfo->SourceSurface->lDelta; + DestBits -= BltInfo->DestSurface->lDelta; } } } else { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceBits = (SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x); - for (j = DestRect->top; j < DestRect->bottom; j++) + SourceBits = (BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x); + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { - if (DestRect->left < SourcePoint->x) + if (BltInfo->DestRect.left < BltInfo->SourcePoint.x) { Dest32 = (DWORD *) DestBits; Source32 = (DWORD *) SourceBits; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - *Dest32++ = XLATEOBJ_iXlate(ColorTranslation, *Source32++); + *Dest32++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32++); } } else { - Dest32 = (DWORD *) DestBits + (DestRect->right - DestRect->left - 1); - Source32 = (DWORD *) SourceBits + (DestRect->right - DestRect->left - 1); - for (i = DestRect->right - 1; DestRect->left <= i; i--) + Dest32 = (DWORD *) DestBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); + Source32 = (DWORD *) SourceBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); + for (i = BltInfo->DestRect.right - 1; BltInfo->DestRect.left <= i; i--) { - *Dest32-- = XLATEOBJ_iXlate(ColorTranslation, *Source32--); + *Dest32-- = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32--); } } - SourceBits += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + SourceBits += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } } else { - SourceBits = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + 4 * SourcePoint->x; - DestBits = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + 4 * DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceBits = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; + DestBits = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { - if (DestRect->left < SourcePoint->x) + if (BltInfo->DestRect.left < BltInfo->SourcePoint.x) { Dest32 = (DWORD *) DestBits; Source32 = (DWORD *) SourceBits; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { - *Dest32++ = XLATEOBJ_iXlate(ColorTranslation, *Source32++); + *Dest32++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32++); } } else { - Dest32 = (DWORD *) DestBits + (DestRect->right - DestRect->left - 1); - Source32 = (DWORD *) SourceBits + (DestRect->right - DestRect->left - 1); - for (i = DestRect->right; DestRect->left < i; i--) + Dest32 = (DWORD *) DestBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); + Source32 = (DWORD *) SourceBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); + for (i = BltInfo->DestRect.right; BltInfo->DestRect.left < i; i--) { - *Dest32-- = XLATEOBJ_iXlate(ColorTranslation, *Source32--); + *Dest32-- = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32--); } } - SourceBits -= SourceSurf->lDelta; - DestBits -= DestSurf->lDelta; + SourceBits -= BltInfo->SourceSurface->lDelta; + DestBits -= BltInfo->DestSurface->lDelta; } } } break; default: - DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); return FALSE; } @@ -285,101 +283,70 @@ DIB_32BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } BOOLEAN -DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - BRUSHOBJ *Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_32BPP_BitBlt(PBLTINFO BltInfo) { - ULONG X, Y; + ULONG DestX, DestY; ULONG SourceX, SourceY; - ULONG Dest, Source = 0, Pattern = 0, wd; - PULONG DestBits; + ULONG PatternY = 0; + ULONG Dest, Source = 0, Pattern = 0; BOOL UsesSource; BOOL UsesPattern; - /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; - HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj = NULL; - ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; + PULONG DestBits; - if (Rop4 == SRCCOPY) - { - return DIB_32BPP_BitBltSrcCopy( - DestSurf, - SourceSurf, - DestRect, - SourcePoint, - ColorTranslation); - } + UsesSource = ROP_USES_SOURCE(BltInfo->Rop4); + UsesPattern = ROP_USES_PATTERN(BltInfo->Rop4); + + SourceY = BltInfo->SourcePoint.y; + DestBits = (PULONG)( + BltInfo->DestSurface->pvScan0 + + (BltInfo->DestRect.left << 2) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; - if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + if (BltInfo->PatternSurface) { - PBITMAPOBJ PatternBitmap; - - GdiBrush = CONTAINING_RECORD( - Brush, - GDIBRUSHOBJ, - BrushObject); - - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - - PatternObj = &PatternBitmap->SurfObj; - PatternWidth = PatternObj->sizlBitmap.cx; - PatternHeight = PatternObj->sizlBitmap.cy; - - UsesPattern = TRUE; + PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % + BltInfo->PatternSurface->sizlBitmap.cy; } else { - UsesPattern = FALSE; - Pattern = Brush->iSolidColor; + Pattern = BltInfo->Brush->iSolidColor; } } - - SourceY = SourcePoint->y; - DestBits = (PULONG)( - DestSurf->pvScan0 + - (DestRect->left << 2) + - DestRect->top * DestSurf->lDelta); - wd = ((DestRect->right - DestRect->left) << 2) - DestSurf->lDelta; - for (Y = DestRect->top; Y < DestRect->bottom; Y++) + for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) { - SourceX = SourcePoint->x; + SourceX = BltInfo->SourcePoint.x; - if(UsesPattern) - PatternY = (Y + BrushOrigin.y) % PatternHeight; - - for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) + for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++, SourceX++) { Dest = *DestBits; if (UsesSource) { - Source = DIB_GetSource(SourceSurf, SourceX, SourceY, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (X + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern); } SourceY++; + if (BltInfo->PatternSurface) + { + PatternY++; + PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; + } DestBits = (PULONG)( - (ULONG_PTR)DestBits - wd); + (ULONG_PTR)DestBits - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 2) - + BltInfo->DestSurface->lDelta); } - - if (PatternSurface != NULL) - BITMAPOBJ_UnlockBitmap(PatternSurface); return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 6f25051fb5f..524fc4a3228 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib4bpp.c,v 1.37 2004/07/03 17:40:24 navaraf Exp $ */ +/* $Id: dib4bpp.c,v 1.38 2004/07/14 20:48:56 navaraf Exp $ */ #include VOID @@ -60,34 +60,34 @@ DIB_4BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) } } -BOOLEAN STATIC -DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ* ColorTranslation) +BOOLEAN +DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo) { LONG i, j, sx, sy, f2, xColor; PBYTE SourceBits_24BPP, SourceLine_24BPP; PBYTE DestBits, DestLine, SourceBits_8BPP, SourceLine_8BPP; PBYTE SourceBits, SourceLine; - DestBits = DestSurf->pvScan0 + (DestRect->left>>1) + DestRect->top * DestSurf->lDelta; + DestBits = BltInfo->DestSurface->pvScan0 + + (BltInfo->DestRect.left >> 1) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta; - switch(SourceSurf->iBitmapFormat) + switch (BltInfo->SourceSurface->iBitmapFormat) { case BMF_1BPP: - sx = SourcePoint->x; - sy = SourcePoint->y; + sx = BltInfo->SourcePoint.x; + sy = BltInfo->SourcePoint.y; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) { - DIB_4BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 0)); + DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); } else { - DIB_4BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 1)); + DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); } sx++; } @@ -96,21 +96,21 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_4BPP: - sy = SourcePoint->y; + sy = BltInfo->SourcePoint.y; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; + sx = BltInfo->SourcePoint.x; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if (NULL != ColorTranslation) + if (NULL != BltInfo->XlateSourceToDest) { - DIB_4BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy))); + DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy))); } else { - DIB_4BPP_PutPixel(DestSurf, i, j, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); + DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy)); } sx++; } @@ -119,124 +119,118 @@ DIB_4BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_8BPP: - SourceBits_8BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; + SourceBits_8BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_8BPP = SourceBits_8BPP; DestLine = DestBits; - f2 = DestRect->left & 1; + f2 = BltInfo->DestRect.left & 1; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { *DestLine = (*DestLine & notmask[f2]) | - ((XLATEOBJ_iXlate(ColorTranslation, *SourceLine_8BPP)) << ((4 * (1 - f2)))); + ((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceLine_8BPP)) << ((4 * (1 - f2)))); if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; } SourceLine_8BPP++; } - SourceBits_8BPP += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + SourceBits_8BPP += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } break; case BMF_16BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - f2 = DestRect->left & 1; + f2 = BltInfo->DestRect.left & 1; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = *((PWORD) SourceBits); *DestBits = (*DestBits & notmask[f2]) | - ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1 - f2)))); + ((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2)))); if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; } SourceBits += 2; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_24BPP: - SourceBits_24BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x * 3; + SourceBits_24BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x * 3; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_24BPP = SourceBits_24BPP; DestLine = DestBits; - f2 = DestRect->left & 1; + f2 = BltInfo->DestRect.left & 1; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { xColor = (*(SourceLine_24BPP + 2) << 0x10) + (*(SourceLine_24BPP + 1) << 0x08) + (*(SourceLine_24BPP)); *DestLine = (*DestLine & notmask[f2]) | - ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1 - f2)))); + ((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2)))); if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; } SourceLine_24BPP+=3; } - SourceBits_24BPP += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + SourceBits_24BPP += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } break; case BMF_32BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - f2 = DestRect->left & 1; + f2 = BltInfo->DestRect.left & 1; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = *((PDWORD) SourceBits); *DestBits = (*DestBits & notmask[f2]) | - ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1 - f2)))); + ((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2)))); if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; } SourceBits += 4; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; default: - DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); return FALSE; } return(TRUE); } BOOLEAN -DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - BRUSHOBJ *Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_4BPP_BitBlt(PBLTINFO BltInfo) { - LONG i, j, sx, sy; + ULONG DestX, DestY; + ULONG SourceX, SourceY; + ULONG PatternY = 0; ULONG Dest, Source = 0, Pattern = 0; + BOOLEAN UsesSource; + BOOLEAN UsesPattern; PULONG DestBits; - BOOL UsesSource; - BOOL UsesPattern; LONG RoundedRight; - /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; - HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj = NULL; - ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; static const ULONG ExpandSolidColor[16] = { 0x00000000 /* 0 */, @@ -257,126 +251,107 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, 0xFFFFFFFF /* 15 */, }; - if (Rop4 == SRCCOPY) - { - return DIB_4BPP_BitBltSrcCopy( - DestSurf, - SourceSurf, - DestRect, - SourcePoint, - ColorTranslation); - } + UsesSource = ROP_USES_SOURCE(BltInfo->Rop4); + UsesPattern = ROP_USES_PATTERN(BltInfo->Rop4); - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; + SourceY = BltInfo->SourcePoint.y; + RoundedRight = BltInfo->DestRect.right - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) & 0x7); if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + if (BltInfo->PatternSurface) { - PBITMAPOBJ PatternBitmap; - - GdiBrush = CONTAINING_RECORD( - Brush, - GDIBRUSHOBJ, - BrushObject); - - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - - PatternObj = &PatternBitmap->SurfObj; - PatternWidth = PatternObj->sizlBitmap.cx; - PatternHeight = PatternObj->sizlBitmap.cy; - - UsesPattern = TRUE; + PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % + BltInfo->PatternSurface->sizlBitmap.cy; } else { - UsesPattern = FALSE; - Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; + Pattern = ExpandSolidColor[BltInfo->Brush->iSolidColor]; } } - - sy = SourcePoint->y; - RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x7); - for (j = DestRect->top; j < DestRect->bottom; j++, sy++) + for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) { - DestBits = (PULONG)(DestSurf->pvScan0 + (DestRect->left >> 1) + j * DestSurf->lDelta); - sx = SourcePoint->x; - i = DestRect->left; + DestBits = (PULONG)( + BltInfo->DestSurface->pvScan0 + + (BltInfo->DestRect.left >> 1) + + DestY * BltInfo->DestSurface->lDelta); + SourceX = BltInfo->SourcePoint.x; + DestX = BltInfo->DestRect.left; - if (UsesPattern) - PatternY = (j + BrushOrigin.y) % PatternHeight; - - if (i & 0x1) + if (DestX & 0x1) { - Dest = DIB_4BPP_GetPixel(DestSurf, i, j); + Dest = DIB_4BPP_GetPixel(BltInfo->DestSurface, DestX, DestY); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, sx, sy, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); + DIB_4BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF); - i++; - sx++; + DestX++; + SourceX++; DestBits = (PULONG)((ULONG_PTR)DestBits + 1); } - for (; i < RoundedRight; i += 8, sx += 8, DestBits++) + for (; DestX < RoundedRight; DestX += 8, SourceX += 8, DestBits++) { Dest = *DestBits; if (UsesSource) { Source = - (DIB_GetSource(SourceSurf, sx + 1, sy, ColorTranslation)) | - (DIB_GetSource(SourceSurf, sx + 0, sy, ColorTranslation) << 4) | - (DIB_GetSource(SourceSurf, sx + 3, sy, ColorTranslation) << 8) | - (DIB_GetSource(SourceSurf, sx + 2, sy, ColorTranslation) << 12) | - (DIB_GetSource(SourceSurf, sx + 5, sy, ColorTranslation) << 16) | - (DIB_GetSource(SourceSurf, sx + 4, sy, ColorTranslation) << 20) | - (DIB_GetSource(SourceSurf, sx + 7, sy, ColorTranslation) << 24) | - (DIB_GetSource(SourceSurf, sx + 6, sy, ColorTranslation) << 28); + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 1, SourceY, BltInfo->XlateSourceToDest)) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 0, SourceY, BltInfo->XlateSourceToDest) << 4) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 3, SourceY, BltInfo->XlateSourceToDest) << 8) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 2, SourceY, BltInfo->XlateSourceToDest) << 12) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 5, SourceY, BltInfo->XlateSourceToDest) << 16) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 4, SourceY, BltInfo->XlateSourceToDest) << 20) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 7, SourceY, BltInfo->XlateSourceToDest) << 24) | + (DIB_GetSource(BltInfo->SourceSurface, SourceX + 6, SourceY, BltInfo->XlateSourceToDest) << 28); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 0) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 1) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 0) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 4; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 3) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 8; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 2) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 12; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 5) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 16; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 4) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 20; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 7) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 24; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 6) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 28; } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern); } /* Process the rest of pixel on the line */ - for (; i < DestRect->right; i++, sx++) + for (; DestX < BltInfo->DestRect.right; DestX++, SourceX++) { - Dest = DIB_4BPP_GetPixel(DestSurf, i, j); + Dest = DIB_4BPP_GetPixel(BltInfo->DestSurface, DestX, DestY); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, sx, sy, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); + DIB_4BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF); } - } - if (PatternSurface != NULL) - BITMAPOBJ_UnlockBitmap(PatternSurface); + SourceY++; + if (BltInfo->PatternSurface) + { + PatternY++; + PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; + } + } return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 2c189913c33..c521445c6d2 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib8bpp.c,v 1.28 2004/07/03 17:40:24 navaraf Exp $ */ +/* $Id: dib8bpp.c,v 1.29 2004/07/14 20:48:56 navaraf Exp $ */ #include VOID @@ -65,32 +65,30 @@ DIB_8BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c) } BOOLEAN -DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - XLATEOBJ *ColorTranslation) +DIB_8BPP_BitBltSrcCopy(PBLTINFO BltInfo) { LONG i, j, sx, sy, xColor, f1; PBYTE SourceBits, DestBits, SourceLine, DestLine; PBYTE SourceBits_4BPP, SourceLine_4BPP; - DestBits = DestSurf->pvScan0 + (DestRect->top * DestSurf->lDelta) + DestRect->left; + DestBits = BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta) + BltInfo->DestRect.left; - switch(SourceSurf->iBitmapFormat) + switch(BltInfo->SourceSurface->iBitmapFormat) { case BMF_1BPP: - sx = SourcePoint->x; - sy = SourcePoint->y; + sx = BltInfo->SourcePoint.x; + sy = BltInfo->SourcePoint.y; - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { - sx = SourcePoint->x; - for (i=DestRect->left; iright; i++) + sx = BltInfo->SourcePoint.x; + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) { - DIB_8BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 0)); + DIB_8BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); } else { - DIB_8BPP_PutPixel(DestSurf, i, j, XLATEOBJ_iXlate(ColorTranslation, 1)); + DIB_8BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); } sx++; } @@ -99,159 +97,159 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_4BPP: - SourceBits_4BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + (SourcePoint->x >> 1); + SourceBits_4BPP = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.x >> 1); - for (j=DestRect->top; jbottom; j++) + for (j=BltInfo->DestRect.top; jDestRect.bottom; j++) { SourceLine_4BPP = SourceBits_4BPP; - sx = SourcePoint->x; + sx = BltInfo->SourcePoint.x; f1 = sx & 1; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - xColor = XLATEOBJ_iXlate(ColorTranslation, + xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); - DIB_8BPP_PutPixel(DestSurf, i, j, xColor); + DIB_8BPP_PutPixel(BltInfo->DestSurface, i, j, xColor); if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } sx++; } - SourceBits_4BPP += SourceSurf->lDelta; + SourceBits_4BPP += BltInfo->SourceSurface->lDelta; } break; case BMF_8BPP: - if (NULL == ColorTranslation || 0 != (ColorTranslation->flXlate & XO_TRIVIAL)) + if (NULL == BltInfo->XlateSourceToDest || 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL)) { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceBits = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; - for (j = DestRect->top; j < DestRect->bottom; j++) + SourceBits = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { - RtlMoveMemory(DestBits, SourceBits, DestRect->right - DestRect->left); - SourceBits += SourceSurf->lDelta; - DestBits += DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, BltInfo->DestRect.right - BltInfo->DestRect.left); + SourceBits += BltInfo->SourceSurface->lDelta; + DestBits += BltInfo->DestSurface->lDelta; } } else { - SourceBits = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + SourcePoint->x; - DestBits = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceBits = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; + DestBits = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { - RtlMoveMemory(DestBits, SourceBits, DestRect->right - DestRect->left); - SourceBits -= SourceSurf->lDelta; - DestBits -= DestSurf->lDelta; + RtlMoveMemory(DestBits, SourceBits, BltInfo->DestRect.right - BltInfo->DestRect.left); + SourceBits -= BltInfo->SourceSurface->lDelta; + DestBits -= BltInfo->DestSurface->lDelta; } } } else { - if (DestRect->top < SourcePoint->y) + if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) { - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - *DestBits++ = XLATEOBJ_iXlate(ColorTranslation, *SourceBits++); + *DestBits++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceBits++); } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } } else { - SourceLine = SourceSurf->pvScan0 + ((SourcePoint->y + DestRect->bottom - DestRect->top - 1) * SourceSurf->lDelta) + SourcePoint->x; - DestLine = DestSurf->pvScan0 + ((DestRect->bottom - 1) * DestSurf->lDelta) + DestRect->left; - for (j = DestRect->bottom - 1; DestRect->top <= j; j--) + SourceLine = BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; + DestLine = BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + BltInfo->DestRect.left; + for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) { SourceBits = SourceLine; DestBits = DestLine; - for (i=DestRect->left; iright; i++) + for (i=BltInfo->DestRect.left; iDestRect.right; i++) { - *DestBits++ = XLATEOBJ_iXlate(ColorTranslation, *SourceBits++); + *DestBits++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceBits++); } - SourceLine -= SourceSurf->lDelta; - DestLine -= DestSurf->lDelta; + SourceLine -= BltInfo->SourceSurface->lDelta; + DestLine -= BltInfo->DestSurface->lDelta; } } } break; case BMF_16BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = *((PWORD) SourceBits); - *DestBits = XLATEOBJ_iXlate(ColorTranslation, xColor); + *DestBits = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 2; DestBits += 1; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_24BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 3 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 3 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = (*(SourceBits + 2) << 0x10) + (*(SourceBits + 1) << 0x08) + (*(SourceBits)); - *DestBits = XLATEOBJ_iXlate(ColorTranslation, xColor); + *DestBits = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 3; DestBits += 1; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; case BMF_32BPP: - SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x; + SourceLine = BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; DestLine = DestBits; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) { SourceBits = SourceLine; DestBits = DestLine; - for (i = DestRect->left; i < DestRect->right; i++) + for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) { xColor = *((PDWORD) SourceBits); - *DestBits = XLATEOBJ_iXlate(ColorTranslation, xColor); + *DestBits = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); SourceBits += 4; DestBits += 1; } - SourceLine += SourceSurf->lDelta; - DestLine += DestSurf->lDelta; + SourceLine += BltInfo->SourceSurface->lDelta; + DestLine += BltInfo->DestSurface->lDelta; } break; default: - DPRINT1("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DPRINT1("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); return FALSE; } @@ -259,124 +257,99 @@ DIB_8BPP_BitBltSrcCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, } BOOLEAN -DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, - PRECTL DestRect, POINTL *SourcePoint, - BRUSHOBJ *Brush, POINTL BrushOrigin, - XLATEOBJ *ColorTranslation, ULONG Rop4) +DIB_8BPP_BitBlt(PBLTINFO BltInfo) { - LONG i, j, k, sx, sy; + ULONG DestX, DestY; + ULONG SourceX, SourceY; + ULONG PatternY = 0; ULONG Dest, Source = 0, Pattern = 0; - PULONG DestBits; BOOL UsesSource; BOOL UsesPattern; + PULONG DestBits; LONG RoundedRight; - /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; - HBITMAP PatternSurface = NULL; - SURFOBJ *PatternObj = NULL; - ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; - if (Rop4 == SRCCOPY) - { - return DIB_8BPP_BitBltSrcCopy( - DestSurf, - SourceSurf, - DestRect, - SourcePoint, - ColorTranslation); - } + UsesSource = ROP_USES_SOURCE(BltInfo->Rop4); + UsesPattern = ROP_USES_PATTERN(BltInfo->Rop4); - UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); - UsesPattern = (((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000)) && Brush; + SourceY = BltInfo->SourcePoint.y; + RoundedRight = BltInfo->DestRect.right - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) & 0x7); if (UsesPattern) { - if (Brush->iSolidColor == 0xFFFFFFFF) + if (BltInfo->PatternSurface) { - PBITMAPOBJ PatternBitmap; - - GdiBrush = CONTAINING_RECORD( - Brush, - GDIBRUSHOBJ, - BrushObject); - - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); - - PatternObj = &PatternBitmap->SurfObj; - PatternWidth = PatternObj->sizlBitmap.cx; - PatternHeight = PatternObj->sizlBitmap.cy; - - UsesPattern = TRUE; + PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) % + BltInfo->PatternSurface->sizlBitmap.cy; } else { - UsesPattern = FALSE; - Pattern = (Brush->iSolidColor & 0xFF) | - ((Brush->iSolidColor & 0xFF) << 8) | - ((Brush->iSolidColor & 0xFF) << 16) | - ((Brush->iSolidColor & 0xFF) << 24); + Pattern = BltInfo->Brush->iSolidColor | + (BltInfo->Brush->iSolidColor << 8) | + (BltInfo->Brush->iSolidColor << 16) | + (BltInfo->Brush->iSolidColor << 24); } } - - RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x3); - sy = SourcePoint->y; - for (j = DestRect->top; j < DestRect->bottom; j++) + for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++) { - sx = SourcePoint->x; - DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); + SourceX = BltInfo->SourcePoint.x; + DestBits = (PULONG)( + BltInfo->DestSurface->pvScan0 + + BltInfo->DestRect.left + + DestY * BltInfo->DestSurface->lDelta); - if(UsesPattern) - PatternY = (j + BrushOrigin.y) % PatternHeight; - - for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++) + for (DestX = BltInfo->DestRect.left; DestX < RoundedRight; DestX += 4, DestBits++) { Dest = *DestBits; if (UsesSource) { - Source = 0; - for (k = 0; k < 4; k++) - Source |= (DIB_GetSource(SourceSurf, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX + (DestX - BltInfo->DestRect.left), SourceY, BltInfo->XlateSourceToDest); + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + (DestX - BltInfo->DestRect.left) + 1, SourceY, BltInfo->XlateSourceToDest) << 8; + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + (DestX - BltInfo->DestRect.left) + 2, SourceY, BltInfo->XlateSourceToDest) << 16; + Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX + (DestX - BltInfo->DestRect.left) + 3, SourceY, BltInfo->XlateSourceToDest) << 24; } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16; - Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 1) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 8; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 2) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 16; + Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 3) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest) << 24; } - *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); + + *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern); } - if (i < DestRect->right) + if (DestX < BltInfo->DestRect.right) { - for (; i < DestRect->right; i++) + for (; DestX < BltInfo->DestRect.right; DestX++) { - Dest = DIB_8BPP_GetPixel(DestSurf, i, j); + Dest = DIB_8BPP_GetPixel(BltInfo->DestSurface, DestX, DestY); if (UsesSource) { - Source = DIB_GetSource(SourceSurf, sx + (i - DestRect->left), sy, ColorTranslation); + Source = DIB_GetSource(BltInfo->SourceSurface, SourceX + (DestX - BltInfo->DestRect.left), SourceY, BltInfo->XlateSourceToDest); } - if (UsesPattern) + if (BltInfo->PatternSurface) { - Pattern = DIB_1BPP_GetPixel(PatternObj, (i + BrushOrigin.x) % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack; + Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY, BltInfo->XlatePatternToDest); } - DIB_8BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF); + DIB_8BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xFFFF); } } - sy++; + SourceY++; + if (BltInfo->PatternSurface) + { + PatternY++; + PatternY %= BltInfo->PatternSurface->sizlBitmap.cy; + } } - if (PatternSurface != NULL) - BITMAPOBJ_UnlockBitmap(PatternSurface); - return TRUE; } diff --git a/reactos/subsys/win32k/eng/bitblt.c b/reactos/subsys/win32k/eng/bitblt.c index ae128872510..30ce8fc26ab 100644 --- a/reactos/subsys/win32k/eng/bitblt.c +++ b/reactos/subsys/win32k/eng/bitblt.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitblt.c,v 1.57 2004/07/03 17:40:25 navaraf Exp $ +/* $Id: bitblt.c,v 1.58 2004/07/14 20:48:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -88,7 +88,7 @@ BltMask(SURFOBJ* Dest, BYTE *tMask, *lMask; static BYTE maskbit[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; /* Pattern brushes */ - PGDIBRUSHOBJ GdiBrush = NULL; + PGDIBRUSHINST GdiBrush = NULL; HBITMAP PatternSurface = NULL; SURFOBJ *PatternObj = NULL; ULONG PatternWidth = 0, PatternHeight = 0, PatternY = 0; @@ -107,11 +107,11 @@ BltMask(SURFOBJ* Dest, GdiBrush = CONTAINING_RECORD( Brush, - GDIBRUSHOBJ, + GDIBRUSHINST, BrushObject); - PatternSurface = GdiBrush->hbmPattern; - PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->hbmPattern); + PatternSurface = GdiBrush->GdiBrushObject->hbmPattern; + PatternBitmap = BITMAPOBJ_LockBitmap(GdiBrush->GdiBrushObject->hbmPattern); PatternObj = &PatternBitmap->SurfObj; PatternWidth = PatternObj->sizlBitmap.cx; @@ -140,7 +140,7 @@ BltMask(SURFOBJ* Dest, { DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_PutPixel( Dest, DestRect->left + i, DestRect->top + j, - DIB_1BPP_GetPixel(PatternObj, (DestRect->left + i) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack); + DIB_GetSource(PatternObj, (DestRect->left + i) % PatternWidth, PatternY, GdiBrush->XlateObject)); } } c8++; @@ -198,18 +198,44 @@ CallDibBitBlt(SURFOBJ* OutputObj, POINTL* BrushOrigin, ROP4 Rop4) { - POINTL RealBrushOrigin; - if (BrushOrigin == NULL) - { - RealBrushOrigin.x = RealBrushOrigin.y = 0; - } - else - { - RealBrushOrigin = *BrushOrigin; - } + BLTINFO BltInfo; + PGDIBRUSHINST GdiBrush = NULL; + BITMAPOBJ *bmPattern; + BOOLEAN Result; - return DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_BitBlt( - OutputObj, InputObj, OutputRect, InputPoint, Brush, RealBrushOrigin, ColorTranslation, Rop4); + BltInfo.DestSurface = OutputObj; + BltInfo.SourceSurface = InputObj; + BltInfo.PatternSurface = NULL; + BltInfo.XlateSourceToDest = ColorTranslation; + BltInfo.DestRect = *OutputRect; + BltInfo.SourcePoint = *InputPoint; + + if (Rop4 == SRCCOPY) + return DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo); + + BltInfo.XlatePatternToDest = NULL; + BltInfo.Brush = Brush; + BltInfo.BrushOrigin = *BrushOrigin; + BltInfo.Rop4 = Rop4; + + /* Pattern brush */ + if (ROP_USES_PATTERN(Rop4) && Brush->iSolidColor == 0xFFFFFFFF) + { + GdiBrush = CONTAINING_RECORD(Brush, GDIBRUSHINST, BrushObject); + bmPattern = BITMAPOBJ_LockBitmap(GdiBrush->GdiBrushObject->hbmPattern); + BltInfo.PatternSurface = &bmPattern->SurfObj; + BltInfo.XlatePatternToDest = GdiBrush->XlateObject; + } + + Result = DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_BitBlt(&BltInfo); + + /* Pattern brush */ + if (ROP_USES_PATTERN(Rop4) && Brush->iSolidColor == 0xFFFFFFFF) + { + BITMAPOBJ_UnlockBitmap(BltInfo.PatternSurface->hsurf); + } + + return Result; } INT abs(INT nm); diff --git a/reactos/subsys/win32k/eng/copybits.c b/reactos/subsys/win32k/eng/copybits.c index 94b45914de0..c055c054c16 100644 --- a/reactos/subsys/win32k/eng/copybits.c +++ b/reactos/subsys/win32k/eng/copybits.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: copybits.c,v 1.25 2004/07/03 13:55:35 navaraf Exp $ +/* $Id: copybits.c,v 1.26 2004/07/14 20:48:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,11 +41,9 @@ EngCopyBits(SURFOBJ *Dest, { BOOLEAN ret; BYTE clippingType; - RECTL rclTmp; - POINTL ptlTmp; RECT_ENUM RectEnum; BOOL EnumMore; - POINTL BrushOrigin; + BLTINFO BltInfo; MouseSafetyOnDrawStart(Source, SourcePoint->x, SourcePoint->y, (SourcePoint->x + abs(DestRect->right - DestRect->left)), @@ -114,13 +112,20 @@ EngCopyBits(SURFOBJ *Dest, clippingType = Clip->iDComplexity; } - BrushOrigin.x = BrushOrigin.y = 0; + BltInfo.DestSurface = Dest; + BltInfo.SourceSurface = Source; + BltInfo.PatternSurface = NULL; + BltInfo.XlateSourceToDest = ColorTranslation; + BltInfo.XlatePatternToDest = NULL; + BltInfo.Rop4 = SRCCOPY; switch(clippingType) { case DC_TRIVIAL: - DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBlt( - Dest, Source, DestRect, SourcePoint, NULL, BrushOrigin, ColorTranslation, SRCCOPY); + BltInfo.DestRect = *DestRect; + BltInfo.SourcePoint = *SourcePoint; + + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo); MouseSafetyOnDrawEnd(Dest); MouseSafetyOnDrawEnd(Source); @@ -129,13 +134,12 @@ EngCopyBits(SURFOBJ *Dest, case DC_RECT: // Clip the blt to the clip rectangle - EngIntersectRect(&rclTmp, DestRect, &Clip->rclBounds); + EngIntersectRect(&BltInfo.DestRect, DestRect, &Clip->rclBounds); - ptlTmp.x = SourcePoint->x + rclTmp.left - DestRect->left; - ptlTmp.y = SourcePoint->y + rclTmp.top - DestRect->top; + BltInfo.SourcePoint.x = SourcePoint->x + BltInfo.DestRect.left - DestRect->left; + BltInfo.SourcePoint.y = SourcePoint->y + BltInfo.DestRect.top - DestRect->top; - DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBlt( - Dest, Source, &rclTmp, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY); + DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo); MouseSafetyOnDrawEnd(Dest); MouseSafetyOnDrawEnd(Source); @@ -155,13 +159,13 @@ EngCopyBits(SURFOBJ *Dest, RECTL* prcl = &RectEnum.arcl[0]; do { - EngIntersectRect(prcl, prcl, DestRect); + EngIntersectRect(&BltInfo.DestRect, prcl, DestRect); - ptlTmp.x = SourcePoint->x + prcl->left - DestRect->left; - ptlTmp.y = SourcePoint->y + prcl->top - DestRect->top; + BltInfo.SourcePoint.x = SourcePoint->x + prcl->left - DestRect->left; + BltInfo.SourcePoint.y = SourcePoint->y + prcl->top - DestRect->top; - if(!DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBlt( - Dest, Source, prcl, &ptlTmp, NULL, BrushOrigin, ColorTranslation, SRCCOPY)) return FALSE; + if(!DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo)) + return FALSE; prcl++; diff --git a/reactos/subsys/win32k/eng/lineto.c b/reactos/subsys/win32k/eng/lineto.c index 94bd8fee0dd..0f6f39dad9b 100644 --- a/reactos/subsys/win32k/eng/lineto.c +++ b/reactos/subsys/win32k/eng/lineto.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: lineto.c,v 1.34 2004/07/03 13:55:35 navaraf Exp $ + * $Id: lineto.c,v 1.35 2004/07/14 20:48:57 navaraf Exp $ */ #include @@ -40,7 +40,7 @@ TranslateRects(RECT_ENUM *RectEnum, POINTL* Translate) /* * Draw a line from top-left to bottom-right */ -static void FASTCALL +void FASTCALL NWtoSE(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) @@ -111,7 +111,7 @@ NWtoSE(SURFOBJ* OutputObj, CLIPOBJ* Clip, } } -static void FASTCALL +void FASTCALL SWtoNE(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) @@ -181,7 +181,7 @@ SWtoNE(SURFOBJ* OutputObj, CLIPOBJ* Clip, } } -static void FASTCALL +void FASTCALL NEtoSW(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) @@ -251,7 +251,7 @@ NEtoSW(SURFOBJ* OutputObj, CLIPOBJ* Clip, } } -static void FASTCALL +void FASTCALL SEtoNW(SURFOBJ* OutputObj, CLIPOBJ* Clip, BRUSHOBJ* Brush, LONG x, LONG y, LONG deltax, LONG deltay, POINTL* Translate) @@ -492,15 +492,15 @@ IntEngLineTo(BITMAPOBJ *DestObj, { BOOLEAN ret; SURFOBJ *DestSurf = &DestObj->SurfObj; - PGDIBRUSHOBJ GdiBrush; + PGDIBRUSHINST GdiBrush; RECTL b; GdiBrush = CONTAINING_RECORD( Brush, - GDIBRUSHOBJ, + GDIBRUSHINST, BrushObject); - if (GdiBrush->flAttrs & GDIBRUSH_IS_NULL) + if (GdiBrush->GdiBrushObject->flAttrs & GDIBRUSH_IS_NULL) return TRUE; /* No success yet */ diff --git a/reactos/subsys/win32k/eng/mouse.c b/reactos/subsys/win32k/eng/mouse.c index e580cd5c59d..f6f9e60c923 100644 --- a/reactos/subsys/win32k/eng/mouse.c +++ b/reactos/subsys/win32k/eng/mouse.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: mouse.c,v 1.75 2004/07/03 17:40:25 navaraf Exp $ +/* $Id: mouse.c,v 1.76 2004/07/14 20:48:57 navaraf Exp $ * * PROJECT: ReactOS kernel * PURPOSE: Mouse @@ -591,18 +591,13 @@ EngSetPointerShape( HPALETTE BWPalette, DestPalette; ULONG BWColors[] = {0, 0xFFFFFF}; PDC Dc; - PPALGDI PalObj; - LONG DestMode; BWPalette = EngCreatePalette(PAL_INDEXED, sizeof(BWColors) / sizeof(ULONG), BWColors, 0, 0, 0); Dc = DC_LockDc(IntGetScreenDC()); DestPalette = Dc->w.hPalette; - PalObj = PALETTE_LockPalette(DestPalette); - DestMode = PalObj->Mode; - PALETTE_UnlockPalette(DestPalette); DC_UnlockDc(IntGetScreenDC()); - ppdev->PointerXlateObject = IntEngCreateXlate(DestMode, PAL_INDEXED, + ppdev->PointerXlateObject = IntEngCreateXlate(0, PAL_INDEXED, DestPalette, BWPalette); EngDeletePalette(BWPalette); } diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index 8ff75a93b31..e69938e03b3 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.40 2004/07/04 17:09:45 navaraf Exp $ +/* $Id: xlate.c,v 1.41 2004/07/14 20:48:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -162,6 +162,11 @@ IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, else if (PaletteDest != NULL) DestPalGDI = PALETTE_LockPalette(PaletteDest); + if (SourcePalType == 0) + SourcePalType = SourcePalGDI->Mode; + if (DestPalType == 0) + DestPalType = DestPalGDI->Mode; + XlateObj->iSrcType = SourcePalType; XlateObj->iDstType = DestPalType; XlateObj->flXlate = 0; @@ -269,15 +274,21 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( USHORT SourcePalType, HPALETTE PaletteDest, HPALETTE PaletteSource, ULONG BackgroundColor) { - HPALETTE NewXlate; + ULONG NewXlate; XLATEOBJ *XlateObj; XLATEGDI *XlateGDI; PALGDI *SourcePalGDI; - NewXlate = (HPALETTE)CreateGDIHandle(sizeof(XLATEGDI), sizeof(XLATEOBJ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); + NewXlate = CreateGDIHandle(sizeof(XLATEGDI), sizeof(XLATEOBJ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); if (!ValidEngHandle(NewXlate)) return NULL; + SourcePalGDI = PALETTE_LockPalette(PaletteSource); + ASSERT(SourcePalGDI); + + if (SourcePalType == 0) + SourcePalType = SourcePalGDI->Mode; + XlateObj->iSrcType = SourcePalType; XlateObj->iDstType = PAL_INDEXED; @@ -303,18 +314,69 @@ XLATEOBJ * STDCALL IntEngCreateMonoXlate( break; case PAL_BITFIELDS: { - SourcePalGDI = PALETTE_LockPalette(PaletteSource); BitMasksFromPal(SourcePalType, SourcePalGDI, &XlateGDI->RedMask, &XlateGDI->BlueMask, &XlateGDI->GreenMask); XlateGDI->RedShift = CalculateShift(0xFF) - CalculateShift(XlateGDI->RedMask); XlateGDI->GreenShift = CalculateShift(0xFF00) - CalculateShift(XlateGDI->GreenMask); XlateGDI->BlueShift = CalculateShift(0xFF0000) - CalculateShift(XlateGDI->BlueMask); XlateGDI->BackgroundColor = ShiftAndMask(XlateGDI, BackgroundColor); - PALETTE_UnlockPalette(PaletteSource); } break; } + PALETTE_UnlockPalette(PaletteSource); + + return XlateObj; +} + +XLATEOBJ * STDCALL +IntEngCreateSrcMonoXlate(HPALETTE PaletteDest, + ULONG ForegroundColor, + ULONG BackgroundColor) +{ + ULONG NewXlate; + XLATEOBJ *XlateObj; + XLATEGDI *XlateGDI; + PALGDI *DestPalGDI; + + DestPalGDI = PALETTE_LockPalette(PaletteDest); + if (DestPalGDI == NULL) + return NULL; + + NewXlate = CreateGDIHandle(sizeof(XLATEGDI), sizeof(XLATEOBJ), (PVOID*)&XlateGDI, (PVOID*)&XlateObj); + if (!ValidEngHandle(NewXlate)) + return NULL; + + XlateGDI->translationTable = EngAllocMem(0, sizeof(ULONG) * 2, 0); + if (XlateGDI->translationTable == NULL) + { + FreeGDIHandle(NewXlate); + return NULL; + } + + XlateObj->pulXlate = XlateGDI->translationTable; + + XlateObj->iSrcType = PAL_INDEXED; + XlateObj->iDstType = DestPalGDI->Mode; + + /* Store handles of palettes in internal Xlate GDI object (or NULLs) */ + XlateGDI->SourcePal = NULL; + XlateGDI->DestPal = PaletteDest; + + XlateObj->flXlate = XO_TABLE; + + BitMasksFromPal(DestPalGDI->Mode, DestPalGDI, &XlateGDI->RedMask, + &XlateGDI->BlueMask, &XlateGDI->GreenMask); + + XlateGDI->RedShift = CalculateShift(RGB(255, 0, 0)) - CalculateShift(XlateGDI->RedMask); + XlateGDI->GreenShift = CalculateShift(RGB(0, 255, 0)) - CalculateShift(XlateGDI->GreenMask); + XlateGDI->BlueShift = CalculateShift(RGB(0, 0, 255)) - CalculateShift(XlateGDI->BlueMask); + + XlateGDI->translationTable[0] = ShiftAndMask(XlateGDI, BackgroundColor); + XlateGDI->translationTable[1] = ShiftAndMask(XlateGDI, ForegroundColor); + + PALETTE_UnlockPalette(PaletteDest); + return XlateObj; } diff --git a/reactos/subsys/win32k/include/inteng.h b/reactos/subsys/win32k/include/inteng.h index 2f55e696e71..b6d2744f865 100644 --- a/reactos/subsys/win32k/include/inteng.h +++ b/reactos/subsys/win32k/include/inteng.h @@ -65,6 +65,11 @@ IntEngCreateMonoXlate(USHORT SourcePalType, HPALETTE PaletteDest, HPALETTE PaletteSource, ULONG BackgroundColor); + +XLATEOBJ * STDCALL +IntEngCreateSrcMonoXlate(HPALETTE PaletteDest, + ULONG ForegroundColor, + ULONG BackgroundColor); BOOL STDCALL IntEngPolyline(BITMAPOBJ *DestSurf, diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 74ae67f91da..5f7c966058f 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -3,6 +3,12 @@ /* Brush functions */ +XLATEOBJ* FASTCALL +IntGdiCreateBrushXlate(PDC Dc, GDIBRUSHOBJ *BrushObj, BOOLEAN *Failed); + +VOID FASTCALL +IntGdiInitBrushInstance(GDIBRUSHINST *BrushInst, PGDIBRUSHOBJ BrushObj, XLATEOBJ *XlateObj); + HBRUSH FASTCALL IntGdiCreateBrushIndirect(PLOGBRUSH lb); diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index f9f7bd91631..8dd43ff5d0f 100644 --- a/reactos/subsys/win32k/ntuser/winpos.c +++ b/reactos/subsys/win32k/ntuser/winpos.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: winpos.c,v 1.118 2004/06/20 22:27:19 gvg Exp $ +/* $Id: winpos.c,v 1.119 2004/07/14 20:48:57 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -98,6 +98,22 @@ NtUserGetClientOrigin(HWND hWnd, LPPOINT Point) return Ret; } +/******************************************************************* + * WinPosCanActivateWindow + * + * Check if we can activate the specified window. + */ +static BOOL WinPosCanActivateWindow(HWND hWnd) +{ + LONG Style; + + if (!hWnd) return FALSE; + Style = NtUserGetWindowLong(hWnd, GWL_STYLE, FALSE); + if (!(Style & WS_VISIBLE)) return FALSE; + if ((Style & (WS_POPUP | WS_CHILD)) == WS_CHILD) return FALSE; + return !(Style & WS_DISABLED); +} + /******************************************************************* * WinPosActivateOtherWindow * @@ -106,63 +122,37 @@ NtUserGetClientOrigin(HWND hWnd, LPPOINT Point) VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window) { - PWINDOW_OBJECT Wnd, Old; - int TryTopmost; - - if (!Window || IntIsDesktopWindow(Window)) - { - IntSetFocusMessageQueue(NULL); - return; - } - Wnd = Window; - for(;;) - { - HWND *List, *phWnd; - - Old = Wnd; - Wnd = IntGetParentObject(Wnd); - if(Old != Window) - { - IntReleaseWindowObject(Old); - } - if(!Wnd) - { - IntSetFocusMessageQueue(NULL); - return; - } - - if((List = IntWinListChildren(Wnd))) - { - for(TryTopmost = 0; TryTopmost <= 1; TryTopmost++) + HWND hwndTo = NULL, fg; + PWINDOW_OBJECT wndTo; + + if ((Window->Style & WS_POPUP) && (hwndTo = Window->Owner)) + { + hwndTo = NtUserGetAncestor(hwndTo, GA_ROOT); + if (WinPosCanActivateWindow(hwndTo)) + goto done; + } + + for (hwndTo = NtUserGetWindow(Window->Self, GW_HWNDNEXT); + hwndTo != NULL; + hwndTo = NtUserGetWindow(hwndTo, GW_HWNDNEXT)) + { + if (WinPosCanActivateWindow(hwndTo)) break; + } + +done: + fg = NtUserGetForegroundWindow(); + if (!fg || (Window->Self == fg)) + { + wndTo = IntGetWindowObject(hwndTo); + if (wndTo != NULL && IntSetForegroundWindow(wndTo)) { - for(phWnd = List; *phWnd; phWnd++) - { - PWINDOW_OBJECT Child; - - if((*phWnd) == Window->Self) - { - continue; - } - - if((Child = IntGetWindowObject(*phWnd))) - { - if(((! TryTopmost && (0 == (Child->ExStyle & WS_EX_TOPMOST))) - || (TryTopmost && (0 != (Child->ExStyle & WS_EX_TOPMOST)))) - && IntSetForegroundWindow(Child)) - { - ExFreePool(List); - IntReleaseWindowObject(Wnd); - IntReleaseWindowObject(Child); - return; - } - IntReleaseWindowObject(Child); - } - } + IntReleaseWindowObject(wndTo); + return; } - ExFreePool(List); - } - } - IntReleaseWindowObject(Wnd); + IntReleaseWindowObject(wndTo); + } + if (!NtUserSetActiveWindow(hwndTo)) + NtUserSetActiveWindow(0); } VOID STATIC FASTCALL diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 12f7d091d28..02d2f8afa19 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmaps.c,v 1.78 2004/07/07 16:36:08 navaraf Exp $ */ +/* $Id: bitmaps.c,v 1.79 2004/07/14 20:48:57 navaraf Exp $ */ #include #define IN_RECT(r,x,y) \ @@ -45,14 +45,12 @@ NtGdiBitBlt( RECTL DestRect; POINTL SourcePoint, BrushOrigin; BOOL Status; - PPALGDI PalDestGDI, PalSourceGDI; XLATEOBJ *XlateObj = NULL; HPALETTE SourcePalette = 0, DestPalette = 0; - ULONG SourceMode, DestMode; PGDIBRUSHOBJ BrushObj; - BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); - BOOL UsesPattern = TRUE;//((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); - HPALETTE Mono = NULL; + GDIBRUSHINST BrushInst; + BOOL UsesSource = ROP_USES_SOURCE(ROP); + BOOL UsesPattern = ROP_USES_PATTERN(ROP); DCDest = DC_LockDc(hDCDest); if (NULL == DCDest) @@ -133,6 +131,7 @@ NtGdiBitBlt( return FALSE; } BrushOrigin = BrushObj->ptOrigin; + IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush); } else { @@ -148,98 +147,49 @@ NtGdiBitBlt( if (DCSrc->w.hPalette != 0) SourcePalette = DCSrc->w.hPalette; - PalSourceGDI = PALETTE_LockPalette(SourcePalette); - if (NULL == PalSourceGDI) + /* KB41464 details how to convert between mono and color */ + if (DCDest->w.bitsPerPixel == DCSrc->w.bitsPerPixel == 1) { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - SourceMode = PalSourceGDI->Mode; - PALETTE_UnlockPalette(SourcePalette); - - if (DestPalette == SourcePalette) - { - DestMode = SourceMode; + XlateObj = NULL; } else { - PalDestGDI = PALETTE_LockPalette(DestPalette); - if (NULL == PalDestGDI) + if (DCDest->w.bitsPerPixel == 1) + { + XlateObj = IntEngCreateMonoXlate(0, DestPalette, SourcePalette, DCSrc->w.backgroundColor); + } + else if (DCSrc->w.bitsPerPixel == 1) + { + XlateObj = IntEngCreateSrcMonoXlate(DestPalette, DCSrc->w.backgroundColor, DCSrc->w.textColor); + } + else + { + XlateObj = IntEngCreateXlate(0, 0, DestPalette, SourcePalette); + } + if (NULL == XlateObj) { if (UsesSource && hDCSrc != hDCDest) { DC_UnlockDc(hDCSrc); } DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); return FALSE; } - DestMode = PalDestGDI->Mode; - PALETTE_UnlockPalette(DestPalette); - } - - /* KB41464 details how to convert between mono and color */ - if (DCDest->w.bitsPerPixel == 1) - { - XlateObj = (XLATEOBJ*)IntEngCreateMonoXlate(SourceMode, DestPalette, - SourcePalette, DCSrc->w.backgroundColor); - } - else if (DCSrc->w.bitsPerPixel == 1) - { - ULONG Colors[2]; - - Colors[0] = DCSrc->w.textColor; - Colors[1] = DCSrc->w.backgroundColor; - Mono = PALETTE_AllocPaletteIndexedRGB(2, (RGBQUAD*)Colors); - if (NULL != Mono) - { - XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, PAL_INDEXED, DestPalette, Mono); - } - else - { - XlateObj = NULL; - } - } - else - { - XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); - } - if (NULL == XlateObj) - { - if (NULL != Mono) - { - EngDeletePalette(Mono); - } - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return FALSE; } } /* Perform the bitblt operation */ Status = IntEngBitBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, XlateObj, - &DestRect, &SourcePoint, NULL, &BrushObj->BrushObject, &BrushOrigin, ROP); + &DestRect, &SourcePoint, NULL, BrushObj ? &BrushInst.BrushObject : NULL, &BrushOrigin, ROP); - if (UsesSource) + if (UsesSource && XlateObj != NULL) EngDeleteXlate(XlateObj); BITMAPOBJ_UnlockBitmap(DCDest->w.hBitmap); if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) { BITMAPOBJ_UnlockBitmap(DCSrc->w.hBitmap); } - if (NULL != Mono) - { - EngDeletePalette(Mono); - } if (UsesPattern) { BRUSHOBJ_UnlockBrush(DCDest->w.hBrush); @@ -547,6 +497,7 @@ NtGdiExtFloodFill( UINT FillType) { UNIMPLEMENTED; + return FALSE; } BOOL STDCALL @@ -588,8 +539,6 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) BITMAPOBJ *BitmapObject; SURFOBJ *SurfaceObject; HPALETTE Pal = 0; - PPALGDI PalGDI; - USHORT PalMode; XLATEOBJ *XlateObj; dc = DC_LockDc (hDC); @@ -608,25 +557,18 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) { if ( dc->w.hPalette != 0 ) Pal = dc->w.hPalette; - PalGDI = PALETTE_LockPalette(Pal); - if ( PalGDI ) + /* FIXME: Verify if it shouldn't be PAL_BGR! */ + XlateObj = (XLATEOBJ*)IntEngCreateXlate ( PAL_RGB, 0, NULL, Pal ); + if ( XlateObj ) { - PalMode = PalGDI->Mode; - PALETTE_UnlockPalette(Pal); - - /* FIXME: Verify if it shouldn't be PAL_BGR! */ - XlateObj = (XLATEOBJ*)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal ); - if ( XlateObj ) + // check if this DC has a DIB behind it... + if ( SurfaceObject->pvScan0 ) // STYPE_BITMAP == SurfaceObject->iType { - // check if this DC has a DIB behind it... - if ( SurfaceObject->pvScan0 ) // STYPE_BITMAP == SurfaceObject->iType - { - ASSERT ( SurfaceObject->lDelta ); - Result = XLATEOBJ_iXlate(XlateObj, - DibFunctionsForBitmapFormat[SurfaceObject->iBitmapFormat].DIB_GetPixel ( SurfaceObject, XPos, YPos ) ); - } - EngDeleteXlate(XlateObj); + ASSERT ( SurfaceObject->lDelta ); + Result = XLATEOBJ_iXlate(XlateObj, + DibFunctionsForBitmapFormat[SurfaceObject->iBitmapFormat].DIB_GetPixel ( SurfaceObject, XPos, YPos ) ); } + EngDeleteXlate(XlateObj); } } BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); @@ -897,6 +839,7 @@ NtGdiPlgBlt( INT yMask) { UNIMPLEMENTED; + return FALSE; } LONG STDCALL @@ -1049,10 +992,8 @@ NtGdiStretchBlt( RECTL DestRect; RECTL SourceRect; BOOL Status; - PPALGDI PalDestGDI, PalSourceGDI; XLATEOBJ *XlateObj = NULL; HPALETTE SourcePalette = 0, DestPalette = 0; - ULONG SourceMode, DestMode; PGDIBRUSHOBJ BrushObj; BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000); BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000); @@ -1154,43 +1095,8 @@ NtGdiStretchBlt( if (DCSrc->w.hPalette != 0) SourcePalette = DCSrc->w.hPalette; - PalSourceGDI = PALETTE_LockPalette(SourcePalette); - if (NULL == PalSourceGDI) - { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - SourceMode = PalSourceGDI->Mode; - PALETTE_UnlockPalette(SourcePalette); - - if (DestPalette == SourcePalette) - { - DestMode = SourceMode; - } - else - { - PalDestGDI = PALETTE_LockPalette(DestPalette); - if (NULL == PalDestGDI) - { - if (UsesSource && hDCSrc != hDCDest) - { - DC_UnlockDc(hDCSrc); - } - DC_UnlockDc(hDCDest); - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - DestMode = PalDestGDI->Mode; - PALETTE_UnlockPalette(DestPalette); - } - /* FIXME: Use the same logic for create XLATEOBJ as in NtGdiBitBlt. */ - XlateObj = (XLATEOBJ*)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(0, 0, DestPalette, SourcePalette); if (NULL == XlateObj) { if (UsesSource && hDCSrc != hDCDest) diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 4ab20927155..77ee6f142c8 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: brush.c,v 1.39 2004/07/03 17:40:27 navaraf Exp $ + * $Id: brush.c,v 1.40 2004/07/14 20:48:57 navaraf Exp $ */ #include @@ -45,6 +45,56 @@ Brush_InternalDelete( PGDIBRUSHOBJ pBrush ) return TRUE; } +XLATEOBJ* FASTCALL +IntGdiCreateBrushXlate(PDC Dc, GDIBRUSHOBJ *BrushObj, BOOLEAN *Failed) +{ + XLATEOBJ *Result = NULL; + + if (BrushObj->flAttrs & GDIBRUSH_IS_NULL) + { + Result = NULL; + *Failed = FALSE; + } + else if (BrushObj->flAttrs & GDIBRUSH_IS_SOLID) + { + Result = IntEngCreateXlate(0, PAL_RGB, Dc->w.hPalette, NULL); + *Failed = FALSE; + } + else + { + BITMAPOBJ *Pattern = BITMAPOBJ_LockBitmap(BrushObj->hbmPattern); + if (Pattern == NULL) + return NULL; + + /* Special case: 1bpp pattern */ + if (Pattern->SurfObj.iBitmapFormat == BMF_1BPP) + { + if (Dc->w.bitsPerPixel != 1) + Result = IntEngCreateSrcMonoXlate(Dc->w.hPalette, Dc->w.textColor, Dc->w.backgroundColor); + } + + BITMAPOBJ_UnlockBitmap(BrushObj->hbmPattern); + *Failed = FALSE; + } + + return Result; +} + +VOID FASTCALL +IntGdiInitBrushInstance(GDIBRUSHINST *BrushInst, PGDIBRUSHOBJ BrushObj, XLATEOBJ *XlateObj) +{ + if (BrushObj->flAttrs & GDIBRUSH_IS_NULL) + BrushInst->BrushObject.iSolidColor = 0; + else if (BrushObj->flAttrs & GDIBRUSH_IS_SOLID) + BrushInst->BrushObject.iSolidColor = XLATEOBJ_iXlate(XlateObj, BrushObj->BrushAttr.lbColor); + else + BrushInst->BrushObject.iSolidColor = 0xFFFFFFFF; + BrushInst->BrushObject.pvRbrush = BrushObj->ulRealization; + BrushInst->BrushObject.flColorType = 0; + BrushInst->GdiBrushObject = BrushObj; + BrushInst->XlateObject = XlateObj; +} + HBRUSH FASTCALL IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) { @@ -54,21 +104,23 @@ IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) switch (LogBrush->lbStyle) { - case BS_HATCHED: - if(!(hPattern = NtGdiCreateBitmap(8, 8, 1, 1, HatchBrushes[LogBrush->lbHatch]))) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return NULL; - } - break; + case BS_HATCHED: + hPattern = NtGdiCreateBitmap(8, 8, 1, 1, HatchBrushes[LogBrush->lbHatch]); + if (hPattern == NULL) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } + break; - case BS_PATTERN: - if(!(hPattern = BITMAPOBJ_CopyBitmap((HBITMAP)LogBrush->lbHatch))) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - return NULL; - } - break; + case BS_PATTERN: + hPattern = BITMAPOBJ_CopyBitmap((HBITMAP)LogBrush->lbHatch); + if (hPattern == NULL) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } + break; } hBrush = BRUSHOBJ_AllocBrush(); @@ -89,7 +141,6 @@ IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) case BS_SOLID: BrushObject->flAttrs |= GDIBRUSH_IS_SOLID; BrushObject->BrushAttr.lbColor = LogBrush->lbColor & 0xFFFFFF; - BrushObject->BrushObject.iSolidColor = BrushObject->BrushAttr.lbColor; /* FIXME: Fill in the rest of fields!!! */ break; @@ -97,13 +148,11 @@ IntGdiCreateBrushIndirect(PLOGBRUSH LogBrush) BrushObject->flAttrs |= GDIBRUSH_IS_HATCH; BrushObject->hbmPattern = hPattern; BrushObject->BrushAttr.lbColor = LogBrush->lbColor & 0xFFFFFF; - BrushObject->BrushObject.iSolidColor = 0xFFFFFFFF; break; case BS_PATTERN: BrushObject->flAttrs |= GDIBRUSH_IS_BITMAP; BrushObject->hbmPattern = hPattern; - BrushObject->BrushObject.iSolidColor = 0xFFFFFFFF; /* FIXME: Fill in the rest of fields!!! */ break; @@ -128,6 +177,7 @@ IntPatBlt( { RECTL DestRect; BITMAPOBJ *BitmapObj; + GDIBRUSHINST BrushInst; POINTL BrushOrigin; BOOL ret = TRUE; @@ -166,6 +216,8 @@ IntPatBlt( BrushOrigin.x = BrushObj->ptOrigin.x + dc->w.DCOrgX; BrushOrigin.y = BrushObj->ptOrigin.y + dc->w.DCOrgY; + IntGdiInitBrushInstance(&BrushInst, BrushObj, dc->XlateBrush); + ret = IntEngBitBlt( BitmapObj, NULL, @@ -175,7 +227,7 @@ IntPatBlt( &DestRect, NULL, NULL, - &BrushObj->BrushObject, + &BrushInst.BrushObject, &BrushOrigin, ROP); } diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index c2b3bb6dcc8..81b29f9d8c2 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cliprgn.c,v 1.41 2004/07/07 16:34:33 navaraf Exp $ */ +/* $Id: cliprgn.c,v 1.42 2004/07/14 20:48:58 navaraf Exp $ */ #include int FASTCALL @@ -220,6 +220,7 @@ int STDCALL NtGdiGetMetaRgn(HDC hDC, HRGN hrgn) { UNIMPLEMENTED; + return 0; } int STDCALL NtGdiExcludeClipRect(HDC hDC, @@ -328,6 +329,7 @@ int STDCALL NtGdiOffsetClipRgn(HDC hDC, int YOffset) { UNIMPLEMENTED; + return 0; } BOOL STDCALL NtGdiPtVisible(HDC hDC, @@ -389,6 +391,7 @@ BOOL STDCALL NtGdiSelectClipPath(HDC hDC, int Mode) { UNIMPLEMENTED; + return FALSE; } INT STDCALL @@ -400,6 +403,7 @@ NtGdiSelectClipRgn(HDC hDC, HRGN hRgn) int STDCALL NtGdiSetMetaRgn(HDC hDC) { UNIMPLEMENTED; + return 0; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index bd4010937e1..f9070b0bbbb 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: color.c,v 1.49 2004/07/04 17:09:45 navaraf Exp $ */ +/* $Id: color.c,v 1.50 2004/07/14 20:48:58 navaraf Exp $ */ #include // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping @@ -135,7 +135,8 @@ HPALETTE STDCALL NtGdiCreatePalette(CONST PLOGPALETTE palette) BOOL STDCALL NtGdiGetColorAdjustment(HDC hDC, LPCOLORADJUSTMENT ca) { - UNIMPLEMENTED; + UNIMPLEMENTED; + return FALSE; } unsigned short GetNumberOfBits(unsigned int dwMask) @@ -422,6 +423,7 @@ BOOL STDCALL NtGdiResizePalette(HPALETTE hpal, return TRUE; */ UNIMPLEMENTED; + return FALSE; } /*! @@ -478,7 +480,8 @@ HPALETTE STDCALL NtGdiSelectPalette(HDC hDC, BOOL STDCALL NtGdiSetColorAdjustment(HDC hDC, CONST LPCOLORADJUSTMENT ca) { - UNIMPLEMENTED; + UNIMPLEMENTED; + return FALSE; } UINT STDCALL NtGdiSetPaletteEntries(HPALETTE hpal, @@ -515,12 +518,14 @@ UINT STDCALL NtGdiSetSystemPaletteUse(HDC hDC, UINT Usage) { UNIMPLEMENTED; + return 0; } BOOL STDCALL NtGdiUnrealizeObject(HGDIOBJ hgdiobj) { UNIMPLEMENTED; + return FALSE; } BOOL STDCALL diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c index 8bc3d35b67a..d3893d6e3dc 100644 --- a/reactos/subsys/win32k/objects/coord.c +++ b/reactos/subsys/win32k/objects/coord.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: coord.c,v 1.25 2004/06/18 15:18:54 navaraf Exp $ +/* $Id: coord.c,v 1.26 2004/07/14 20:48:58 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -481,7 +481,8 @@ NtGdiScaleViewportExtEx(HDC hDC, int Ydenom, LPSIZE Size) { - UNIMPLEMENTED; + UNIMPLEMENTED; + return FALSE; } BOOL @@ -493,7 +494,8 @@ NtGdiScaleWindowExtEx(HDC hDC, int Ydenom, LPSIZE Size) { - UNIMPLEMENTED; + UNIMPLEMENTED; + return FALSE; } int diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 9667640e560..f016a3bad11 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.143 2004/07/03 17:40:27 navaraf Exp $ +/* $Id: dc.c,v 1.144 2004/07/14 20:48:58 navaraf Exp $ * * DC.C - Device context functions * @@ -120,6 +120,7 @@ BOOL STDCALL NtGdiCancelDC(HDC hDC) { UNIMPLEMENTED; + return FALSE; } HDC STDCALL @@ -869,6 +870,10 @@ NtGdiDeleteDC(HDC DCHandle) { NtGdiDeleteObject (DCToDelete->w.hFirstBitmap); } + if (DCToDelete->XlateBrush != NULL) + EngDeleteXlate(DCToDelete->XlateBrush); + if (DCToDelete->XlatePen != NULL) + EngDeleteXlate(DCToDelete->XlatePen); } if (DCToDelete->w.hClipRgn) { @@ -902,6 +907,7 @@ NtGdiDrawEscape(HDC hDC, LPCSTR lpszInData) { UNIMPLEMENTED; + return 0; } INT STDCALL @@ -911,6 +917,7 @@ NtGdiEnumObjects(HDC hDC, LPARAM lParam) { UNIMPLEMENTED; + return 0; } DC_GET_VAL( COLORREF, NtGdiGetBkColor, w.backgroundColor ) @@ -1613,6 +1620,7 @@ HDC STDCALL NtGdiResetDC(HDC hDC, CONST DEVMODEW *InitData) { UNIMPLEMENTED; + return 0; } BOOL STDCALL @@ -1741,12 +1749,10 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) PGDIBRUSHOBJ pen; PGDIBRUSHOBJ brush; XLATEOBJ *XlateObj; - PPALGDI PalGDI; DWORD objectType; - COLORREF MonoColorMap[2]; ULONG NumColors = 0; HRGN hVisRgn; - USHORT Mode; + BOOLEAN Failed; if(!hDC || !hGDIObj) return NULL; @@ -1762,101 +1768,49 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) switch (objectType) { case GDI_OBJECT_TYPE_PEN: - objOrg = NULL; - /* Convert the color of the pen to the format of the DC */ - PalGDI = PALETTE_LockPalette(dc->w.hPalette); - if (NULL != PalGDI) - { - Mode = PalGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); - if (NULL != XlateObj) - { - pen = PENOBJ_LockPen((HPEN) hGDIObj); - if (NULL != pen) - { - if (pen->flAttrs & GDIBRUSH_IS_SOLID) - { - pen->BrushObject.iSolidColor = - XLATEOBJ_iXlate(XlateObj, pen->BrushAttr.lbColor); - } - else - { - pen->BrushObject.iSolidColor = 0xFFFFFFFF; - } - pen->crBack = XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor); - pen->crFore = XLATEOBJ_iXlate(XlateObj, dc->w.textColor); - PENOBJ_UnlockPen((HPEN) hGDIObj); - objOrg = (HGDIOBJ)dc->w.hPen; - dc->w.hPen = hGDIObj; - } - else - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - } - EngDeleteXlate(XlateObj); - } - else - { - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - } - } - else - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - } + pen = PENOBJ_LockPen((HPEN) hGDIObj); + if (pen == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + break; + } + + XlateObj = IntGdiCreateBrushXlate(dc, pen, &Failed); + PENOBJ_UnlockPen((HPEN) hGDIObj); + if (Failed) + { + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + break; + } + + objOrg = (HGDIOBJ)dc->w.hPen; + dc->w.hPen = hGDIObj; + if (dc->XlatePen != NULL) + EngDeleteXlate(dc->XlatePen); + dc->XlatePen = XlateObj; break; case GDI_OBJECT_TYPE_BRUSH: - objOrg = NULL; - /* Convert the color of the brush to the format of the DC */ - PalGDI = PALETTE_LockPalette(dc->w.hPalette); - if (NULL != PalGDI) - { - Mode = PalGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); - if (NULL != XlateObj) - { - brush = BRUSHOBJ_LockBrush((HBRUSH) hGDIObj); - if (NULL != brush) - { - if (brush->flAttrs & GDIBRUSH_IS_SOLID) - { - brush->BrushObject.iSolidColor = - XLATEOBJ_iXlate(XlateObj, brush->BrushAttr.lbColor); - } - else - { - brush->BrushObject.iSolidColor = 0xFFFFFFFF; - } - brush->crBack = XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor); - brush->crFore = XLATEOBJ_iXlate(XlateObj, ((brush->flAttrs & GDIBRUSH_IS_HATCH) ? - brush->BrushAttr.lbColor : dc->w.textColor)); - /* according to the documentation of SetBrushOrgEx(), the origin is assigned to the - next brush selected into the DC, so we should set it here */ - brush->ptOrigin.x = dc->w.brushOrgX; - brush->ptOrigin.y = dc->w.brushOrgY; - - BRUSHOBJ_UnlockBrush((HBRUSH) hGDIObj); - objOrg = (HGDIOBJ)dc->w.hBrush; - dc->w.hBrush = (HBRUSH) hGDIObj; - } - else - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - } - EngDeleteXlate(XlateObj); - } - else - { - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - } - } - else - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - } + brush = BRUSHOBJ_LockBrush((HPEN) hGDIObj); + if (brush == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + break; + } + + XlateObj = IntGdiCreateBrushXlate(dc, brush, &Failed); + BRUSHOBJ_UnlockBrush((HPEN) hGDIObj); + if (Failed) + { + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + break; + } + + objOrg = (HGDIOBJ)dc->w.hBrush; + dc->w.hBrush = hGDIObj; + if (dc->XlateBrush != NULL) + EngDeleteXlate(dc->XlateBrush); + dc->XlateBrush = XlateObj; break; case GDI_OBJECT_TYPE_FONT: @@ -1907,18 +1861,13 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) else { dc->w.bitsPerPixel = BitsPerFormat(pb->SurfObj.iBitmapFormat); - if (1 == dc->w.bitsPerPixel) - { - MonoColorMap[0] = RGB(0, 0, 0); - MonoColorMap[1] = RGB(255, 255, 255); - dc->w.hPalette = PALETTE_AllocPaletteIndexedRGB(2, (RGBQUAD*)MonoColorMap); - } - else - { - dc->w.hPalette = dc->DevInfo->hpalDefault; - } + dc->w.hPalette = dc->DevInfo->hpalDefault; } + /* Reselect brush and pen to regenerate the XLATEOBJs. */ + NtGdiSelectObject ( hDC, dc->w.hBrush ); + NtGdiSelectObject ( hDC, dc->w.hPen ); + DC_UnlockDc ( hDC ); hVisRgn = NtGdiCreateRectRgn ( 0, 0, pb->SurfObj.sizlBitmap.cx, pb->SurfObj.sizlBitmap.cy ); NtGdiSelectVisRgn ( hDC, hVisRgn ); @@ -2034,6 +1983,8 @@ DC_AllocDC(PUNICODE_STRING Driver) NewDC->wndExtY = 1.0f; NewDC->vportExtX = 1.0f; NewDC->vportExtY = 1.0f; + NewDC->w.textColor = 0; + NewDC->w.backgroundColor = 0xffffff; NewDC->w.hFont = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(NewDC->w.hFont); @@ -2183,89 +2134,20 @@ IntIsPrimarySurface(SURFOBJ *SurfObj) COLORREF FASTCALL IntGetDCColor(HDC hDC, ULONG Object) { - COLORREF Result; - DC *dc; - PPALGDI PalGDI; - PGDIBRUSHOBJ pen; - PGDIBRUSHOBJ brush; - XLATEOBJ *XlateObj; - HPALETTE Pal = 0; - USHORT Mode; - ULONG iColor; - - if(!(dc = DC_LockDc(hDC))) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return CLR_INVALID; - } - - switch(Object) - { - case OBJ_PEN: - { - if(!(pen = PENOBJ_LockPen(dc->w.hPen))) - { - DC_UnlockDc(hDC); - return CLR_INVALID; - } - if(!(pen->flAttrs & GDIBRUSH_IS_SOLID)) - { - /* FIXME - just bail here? */ - PENOBJ_UnlockPen(dc->w.hPen); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - iColor = pen->BrushObject.iSolidColor; - PENOBJ_UnlockPen(dc->w.hPen); - break; - } - case OBJ_BRUSH: - { - if(!(brush = BRUSHOBJ_LockBrush(dc->w.hBrush))) - { - DC_UnlockDc(hDC); - return CLR_INVALID; - } - if(!(brush->flAttrs & GDIBRUSH_IS_SOLID)) - { - /* FIXME - just bail here? */ - BRUSHOBJ_UnlockBrush(dc->w.hBrush); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - iColor = brush->BrushObject.iSolidColor; - BRUSHOBJ_UnlockBrush(dc->w.hBrush); - break; - } - default: - { - DC_UnlockDc(hDC); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return CLR_INVALID; - } - } - - /* translate the color into RGB */ - - if(dc->w.hPalette) - Pal = dc->w.hPalette; - - Result = CLR_INVALID; - - if((PalGDI = PALETTE_LockPalette(dc->w.hPalette))) - { - Mode = PalGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, Pal); - if(XlateObj) - { - Result = XLATEOBJ_iXlate(XlateObj, iColor); - EngDeleteXlate(XlateObj); - } - } - - DC_UnlockDc(hDC); - return Result; + /* + * The previous implementation was completly incorrect. It modified the + * brush that was currently selected into the device context, but in fact + * the DC pen/brush color should be stored directly in the device context + * (at address 0x2C of the user mode DC object memory on Windows 2K/XP). + * The actual color is then used when DC_BRUSH/DC_PEN object is selected + * into the device context and BRUSHOBJ for drawing is composed (belongs + * to IntGdiInitBrushInstance in the current ReactOS implementation). Also + * the implementation should be moved to user mode GDI32.dll when UM + * mapped GDI objects will be implemented. + */ + + DPRINT("WIN32K:IntGetDCColor is unimplemented\n"); + return 0xFFFFFF; /* The default DC color. */ } /* @@ -2275,133 +2157,10 @@ IntGetDCColor(HDC hDC, ULONG Object) COLORREF FASTCALL IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color) { - COLORREF Result; - DC *dc; - PPALGDI PalGDI; - PGDIBRUSHOBJ pen; - PGDIBRUSHOBJ brush; - XLATEOBJ *XlateObj; - HPALETTE Pal = 0; - USHORT Mode; - ULONG iColor; - - if(Color == CLR_INVALID) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return CLR_INVALID; - } - - if(!(dc = DC_LockDc(hDC))) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return CLR_INVALID; - } - - switch(Object) - { - case OBJ_PEN: - { - if(!(pen = PENOBJ_LockPen(dc->w.hPen))) - { - DC_UnlockDc(hDC); - return CLR_INVALID; - } - if(!(pen->flAttrs & GDIBRUSH_IS_SOLID)) - { - /* FIXME - just bail here? */ - PENOBJ_UnlockPen(dc->w.hPen); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - - /* save old color index, translate it to RGB later */ - iColor = pen->BrushObject.iSolidColor; - - if(!(PalGDI = PALETTE_LockPalette(dc->w.hPalette))) - { - PENOBJ_UnlockPen(dc->w.hPen); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - Mode = PalGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - if(!(XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL))) - { - PENOBJ_UnlockPen(dc->w.hPen); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - pen->BrushObject.iSolidColor = XLATEOBJ_iXlate(XlateObj, (ULONG)Color); - EngDeleteXlate(XlateObj); - PENOBJ_UnlockPen(dc->w.hPen); - break; - } - case OBJ_BRUSH: - { - if(!(brush = BRUSHOBJ_LockBrush(dc->w.hBrush))) - { - DC_UnlockDc(hDC); - return CLR_INVALID; - } - if(!(brush->flAttrs & GDIBRUSH_IS_SOLID)) - { - /* FIXME - just bail here? */ - BRUSHOBJ_UnlockBrush(dc->w.hBrush); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - - /* save old color index, translate it to RGB later */ - iColor = brush->BrushObject.iSolidColor; - - if(!(PalGDI = PALETTE_LockPalette(dc->w.hPalette))) - { - PENOBJ_UnlockPen(dc->w.hPen); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - Mode = PalGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - if(!(XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL))) - { - PENOBJ_UnlockPen(dc->w.hPen); - DC_UnlockDc(hDC); - return CLR_INVALID; - } - brush->BrushObject.iSolidColor = XLATEOBJ_iXlate(XlateObj, (ULONG)Color); - EngDeleteXlate(XlateObj); - BRUSHOBJ_UnlockBrush(dc->w.hBrush); - break; - } - default: - { - DC_UnlockDc(hDC); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return CLR_INVALID; - } - } - - /* translate the old color into RGB */ - - if(dc->w.hPalette) - Pal = dc->w.hPalette; - - Result = CLR_INVALID; - - if((PalGDI = PALETTE_LockPalette(dc->w.hPalette))) - { - Mode = PalGDI->Mode; - PALETTE_UnlockPalette(dc->w.hPalette); - XlateObj = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, Pal); - if(XlateObj) - { - Result = XLATEOBJ_iXlate(XlateObj, iColor); - EngDeleteXlate(XlateObj); - } - } - - DC_UnlockDc(hDC); - return Result; + /* See the comment in IntGetDCColor. */ + + DPRINT("WIN32K:IntSetDCColor is unimplemented\n"); + return CLR_INVALID; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index e5f530da0a5..3894c2b303e 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.c @@ -16,24 +16,24 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: fillshap.c,v 1.51 2004/07/03 13:55:36 navaraf Exp $ */ +/* $Id: fillshap.c,v 1.52 2004/07/14 20:48:58 navaraf Exp $ */ #include /* * a couple macros to fill a single pixel or a line */ -#define PUTPIXEL(x,y,brushObj) \ +#define PUTPIXEL(x,y,BrushInst) \ ret = ret && IntEngLineTo(BitmapObj, \ dc->CombinedClip, \ - &brushObj->BrushObject, \ + &BrushInst.BrushObject, \ x, y, (x)+1, y, \ &RectBounds, \ dc->w.ROPmode); -#define PUTLINE(x1,y1,x2,y2,brushObj) \ +#define PUTLINE(x1,y1,x2,y2,BrushInst) \ ret = ret && IntEngLineTo(BitmapObj, \ dc->CombinedClip, \ - &brushObj->BrushObject, \ + &BrushInst.BrushObject, \ x1, y1, x2, y2, \ &RectBounds, \ dc->w.ROPmode); @@ -45,6 +45,7 @@ IntGdiPolygon(PDC dc, { BITMAPOBJ *BitmapObj; PGDIBRUSHOBJ PenBrushObj, FillBrushObj; + GDIBRUSHINST PenBrushInst, FillBrushInst; BOOL ret = FALSE; // default to failure RECTL DestRect; int CurrentPoint; @@ -88,11 +89,15 @@ IntGdiPolygon(PDC dc, FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); ASSERT(FillBrushObj); if (!(FillBrushObj->flAttrs & GDIBRUSH_IS_NULL)) - ret = FillPolygon ( dc, BitmapObj, &FillBrushObj->BrushObject, dc->w.ROPmode, UnsafePoints, Count, DestRect ); + { + IntGdiInitBrushInstance(&FillBrushInst, FillBrushObj, dc->XlateBrush); + ret = FillPolygon ( dc, BitmapObj, &FillBrushInst.BrushObject, dc->w.ROPmode, UnsafePoints, Count, DestRect ); + } BRUSHOBJ_UnlockBrush(dc->w.hBrush); /* get BRUSHOBJ from current pen. */ PenBrushObj = PENOBJ_LockPen(dc->w.hPen); + IntGdiInitBrushInstance(&PenBrushInst, PenBrushObj, dc->XlatePen); // Draw the Polygon Edges with the current pen ( if not a NULL pen ) if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) @@ -114,7 +119,7 @@ IntGdiPolygon(PDC dc, //DPRINT("Polygon Making line from (%d,%d) to (%d,%d)\n", From.x, From.y, To.x, To.y ); ret = IntEngLineTo(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, + &PenBrushInst.BrushObject, From.x, From.y, To.x, @@ -173,6 +178,7 @@ NtGdiChord(HDC hDC, int YRadial2) { UNIMPLEMENTED; + return FALSE; } /* @@ -206,6 +212,7 @@ NtGdiEllipse( int RadiusX, RadiusY; int Temp; PGDIBRUSHOBJ FillBrush, PenBrush; + GDIBRUSHINST FillBrushInst, PenBrushInst; BITMAPOBJ *BitmapObj; RECTL RectBounds; PDC dc; @@ -252,6 +259,9 @@ NtGdiEllipse( BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); ASSERT(BitmapObj); + IntGdiInitBrushInstance(&FillBrushInst, FillBrush, dc->XlateBrush); + IntGdiInitBrushInstance(&PenBrushInst, PenBrush, dc->XlatePen); + nLeftRect += dc->w.DCOrgX; nRightRect += dc->w.DCOrgX - 1; nTopRect += dc->w.DCOrgY; @@ -319,10 +329,10 @@ NtGdiEllipse( if ((A > da) && (A < db)) { - PUTLINE(CenterX - D, CenterY + A, CenterX + D, CenterY + A, FillBrush); + PUTLINE(CenterX - D, CenterY + A, CenterX + D, CenterY + A, FillBrushInst); if (A) { - PUTLINE(CenterX - D, CenterY - A, CenterX + D, CenterY - A, FillBrush); + PUTLINE(CenterX - D, CenterY - A, CenterX + D, CenterY - A, FillBrushInst); } da = A; } @@ -333,8 +343,8 @@ NtGdiEllipse( if ((B < db) && (B > da)) { - PUTLINE(CenterX - C, CenterY + B, CenterX + C, CenterY + B, FillBrush); - PUTLINE(CenterX - C, CenterY - B, CenterX + C, CenterY - B, FillBrush); + PUTLINE(CenterX - C, CenterY + B, CenterX + C, CenterY + B, FillBrushInst); + PUTLINE(CenterX - C, CenterY - B, CenterX + C, CenterY - B, FillBrushInst); db = B; } @@ -344,27 +354,27 @@ NtGdiEllipse( if (Cond1) { - PUTPIXEL(CenterX + C, CenterY + B, PenBrush); + PUTPIXEL(CenterX + C, CenterY + B, PenBrushInst); if (C) - PUTPIXEL(CenterX - C, CenterY + B, PenBrush); + PUTPIXEL(CenterX - C, CenterY + B, PenBrushInst); if (B) { - PUTPIXEL(CenterX + C, CenterY - B, PenBrush); + PUTPIXEL(CenterX + C, CenterY - B, PenBrushInst); if (C) - PUTPIXEL(CenterX - C, CenterY - B, PenBrush); + PUTPIXEL(CenterX - C, CenterY - B, PenBrushInst); } } if (Cond2) { - PUTPIXEL(CenterX + D, CenterY + A, PenBrush); + PUTPIXEL(CenterX + D, CenterY + A, PenBrushInst); if (D) - PUTPIXEL(CenterX - D, CenterY + A, PenBrush); + PUTPIXEL(CenterX - D, CenterY + A, PenBrushInst); if (A) { - PUTPIXEL(CenterX + D, CenterY - A, PenBrush); + PUTPIXEL(CenterX + D, CenterY - A, PenBrushInst); if (D) - PUTPIXEL(CenterX - D, CenterY - A, PenBrush); + PUTPIXEL(CenterX - D, CenterY - A, PenBrushInst); } } } while (B > A); @@ -922,6 +932,7 @@ IntRectangle(PDC dc, { BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); PGDIBRUSHOBJ PenBrushObj, FillBrushObj; + GDIBRUSHINST PenBrushInst, FillBrushInst; BOOL ret = FALSE; // default to failure RECTL DestRect; @@ -945,6 +956,7 @@ IntRectangle(PDC dc, DestRect.bottom = BottomRect; FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); + IntGdiInitBrushInstance(&FillBrushInst, FillBrushObj, dc->XlateBrush); if ( FillBrushObj ) { @@ -958,7 +970,7 @@ IntRectangle(PDC dc, &DestRect, NULL, NULL, - &FillBrushObj->BrushObject, + &FillBrushInst.BrushObject, NULL, PATCOPY); } @@ -975,6 +987,8 @@ IntRectangle(PDC dc, return FALSE; } + IntGdiInitBrushInstance(&PenBrushInst, PenBrushObj, dc->XlatePen); + // Draw the rectangle with the current pen ret = TRUE; // change default to success @@ -983,28 +997,28 @@ IntRectangle(PDC dc, { ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, + &PenBrushInst.BrushObject, LeftRect, TopRect, RightRect, TopRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, + &PenBrushInst.BrushObject, RightRect, TopRect, RightRect, BottomRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, + &PenBrushInst.BrushObject, RightRect, BottomRect, LeftRect, BottomRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX ret = ret && IntEngLineTo(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, + &PenBrushInst.BrushObject, LeftRect, BottomRect, LeftRect, TopRect, &DestRect, // Bounding rectangle dc->w.ROPmode); // MIX */ @@ -1059,6 +1073,7 @@ IntRoundRect( { BITMAPOBJ *BitmapObj; PGDIBRUSHOBJ PenBrushObj, FillBrushObj; + GDIBRUSHINST FillBrushInst, PenBrushInst; RECTL RectBounds; int i, col, row, width, height, x1, x1start, x2, x2start, y1, y2; int xradius, yradius; @@ -1108,6 +1123,9 @@ IntRoundRect( PenBrushObj = NULL; } + IntGdiInitBrushInstance(&FillBrushInst, FillBrushObj, dc->XlateBrush); + IntGdiInitBrushInstance(&PenBrushInst, PenBrushObj, dc->XlatePen); + right--; bottom--; @@ -1148,20 +1166,20 @@ IntRoundRect( if ( d >= 0 ) { if ( FillBrushObj ) - PUTLINE ( x1, y1, x2, y1, FillBrushObj ); + PUTLINE ( x1, y1, x2, y1, FillBrushInst ); if ( first ) { if ( PenBrushObj ) { if ( x1start > x1 ) { - PUTLINE ( x1, y1, x1start, y1, PenBrushObj ); - PUTLINE ( x2start+1, y2, x2+1, y2, PenBrushObj ); + PUTLINE ( x1, y1, x1start, y1, PenBrushInst ); + PUTLINE ( x2start+1, y2, x2+1, y2, PenBrushInst ); } else { - PUTPIXEL ( x1, y1, PenBrushObj ); - PUTPIXEL ( x2, y2, PenBrushObj ); + PUTPIXEL ( x1, y1, PenBrushInst ); + PUTPIXEL ( x2, y2, PenBrushInst ); } } first = FALSE; @@ -1169,18 +1187,18 @@ IntRoundRect( else { if ( FillBrushObj ) - PUTLINE ( x1, y2, x2, y2, FillBrushObj ); + PUTLINE ( x1, y2, x2, y2, FillBrushInst ); if ( PenBrushObj ) { if ( x1start >= x1 ) { - PUTLINE ( x1, y1, x1start+1, y1, PenBrushObj ); - PUTLINE ( x2start, y2, x2+1, y2, PenBrushObj ); + PUTLINE ( x1, y1, x1start+1, y1, PenBrushInst ); + PUTLINE ( x2start, y2, x2+1, y2, PenBrushInst ); } else { - PUTPIXEL ( x1, y1, PenBrushObj ); - PUTPIXEL ( x2, y2, PenBrushObj ); + PUTPIXEL ( x1, y1, PenBrushInst ); + PUTPIXEL ( x2, y2, PenBrushInst ); } } } @@ -1188,13 +1206,13 @@ IntRoundRect( { if ( x1start > x1 ) { - PUTLINE ( x1, y2, x1start+1, y2, PenBrushObj ); - PUTLINE ( x2start, y1, x2+1, y1, PenBrushObj ); + PUTLINE ( x1, y2, x1start+1, y2, PenBrushInst ); + PUTLINE ( x2start, y1, x2+1, y1, PenBrushInst ); } else { - PUTPIXEL ( x1, y2, PenBrushObj ); - PUTPIXEL ( x2, y1, PenBrushObj ); + PUTPIXEL ( x1, y2, PenBrushInst ); + PUTPIXEL ( x2, y1, PenBrushInst ); } } x1start = x1-1; @@ -1224,15 +1242,15 @@ IntRoundRect( { if ( FillBrushObj ) { - PUTLINE ( x1, y1, x2, y1, FillBrushObj ); - PUTLINE ( x1, y2, x2, y2, FillBrushObj ); + PUTLINE ( x1, y1, x2, y1, FillBrushInst ); + PUTLINE ( x1, y2, x2, y2, FillBrushInst ); } if ( PenBrushObj ) { - PUTPIXEL ( x2, y1, PenBrushObj ); - PUTPIXEL ( x1, y2, PenBrushObj ); - PUTPIXEL ( x2, y2, PenBrushObj ); - PUTPIXEL ( x1, y1, PenBrushObj ); + PUTPIXEL ( x2, y1, PenBrushInst ); + PUTPIXEL ( x1, y2, PenBrushInst ); + PUTPIXEL ( x2, y2, PenBrushInst ); + PUTPIXEL ( x1, y1, PenBrushInst ); } if ( d <= 0 ) @@ -1247,22 +1265,22 @@ IntRoundRect( if ( FillBrushObj ) { - PUTLINE ( left, y1, right, y1, FillBrushObj ); - PUTLINE ( left, y2, right, y2, FillBrushObj ); + PUTLINE ( left, y1, right, y1, FillBrushInst ); + PUTLINE ( left, y2, right, y2, FillBrushInst ); } if ( PenBrushObj ) { if ( x1 > (left+1) ) { - PUTLINE ( left, y1, x1, y1, PenBrushObj ); - PUTLINE ( x2+1, y1, right, y1, PenBrushObj ); - PUTLINE ( left+1, y2, x1, y2, PenBrushObj ); - PUTLINE ( x2+1, y2, right+1, y2, PenBrushObj ); + PUTLINE ( left, y1, x1, y1, PenBrushInst ); + PUTLINE ( x2+1, y1, right, y1, PenBrushInst ); + PUTLINE ( left+1, y2, x1, y2, PenBrushInst ); + PUTLINE ( x2+1, y2, right+1, y2, PenBrushInst ); } else { - PUTPIXEL ( left, y1, PenBrushObj ); - PUTPIXEL ( right, y2, PenBrushObj ); + PUTPIXEL ( left, y1, PenBrushInst ); + PUTPIXEL ( right, y2, PenBrushInst ); } } @@ -1274,15 +1292,15 @@ IntRoundRect( if ( FillBrushObj ) { for ( i = y1+1; i < y2; i++ ) - PUTLINE ( left, i, right, i, FillBrushObj ); + PUTLINE ( left, i, right, i, FillBrushInst ); } if ( PenBrushObj ) { - PUTLINE ( x1, top, x2, top, PenBrushObj ); - PUTLINE ( right, y1, right, y2, PenBrushObj ); - PUTLINE ( x2, bottom, x1, bottom, PenBrushObj ); - PUTLINE ( left, y2, left, y1, PenBrushObj ); + PUTLINE ( x1, top, x2, top, PenBrushInst ); + PUTLINE ( right, y1, right, y2, PenBrushInst ); + PUTLINE ( x2, bottom, x1, bottom, PenBrushInst ); + PUTLINE ( left, y2, left, y1, PenBrushInst ); } BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); diff --git a/reactos/subsys/win32k/objects/icm.c b/reactos/subsys/win32k/objects/icm.c index 3eb9470ac24..ae016b8a491 100644 --- a/reactos/subsys/win32k/objects/icm.c +++ b/reactos/subsys/win32k/objects/icm.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: icm.c,v 1.10 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: icm.c,v 1.11 2004/07/14 20:48:58 navaraf Exp $ */ #include BOOL @@ -27,6 +27,7 @@ NtGdiCheckColorsInGamut(HDC hDC, UINT Count) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -36,6 +37,7 @@ NtGdiColorMatchToTarget(HDC hDC, DWORD Action) { UNIMPLEMENTED; + return FALSE; } HCOLORSPACE @@ -43,6 +45,7 @@ STDCALL NtGdiCreateColorSpace(LPLOGCOLORSPACEW LogColorSpace) { UNIMPLEMENTED; + return 0; } BOOL @@ -50,6 +53,7 @@ STDCALL NtGdiDeleteColorSpace(HCOLORSPACE hColorSpace) { UNIMPLEMENTED; + return FALSE; } INT @@ -81,6 +85,7 @@ NtGdiGetDeviceGammaRamp(HDC hDC, LPVOID Ramp) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -90,6 +95,7 @@ NtGdiGetICMProfile(HDC hDC, LPWSTR Filename) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -99,6 +105,7 @@ NtGdiGetLogColorSpace(HCOLORSPACE hColorSpace, DWORD Size) { UNIMPLEMENTED; + return FALSE; } HCOLORSPACE @@ -107,6 +114,7 @@ NtGdiSetColorSpace(HDC hDC, HCOLORSPACE hColorSpace) { UNIMPLEMENTED; + return 0; } BOOL @@ -115,6 +123,7 @@ NtGdiSetDeviceGammaRamp(HDC hDC, LPVOID Ramp) { UNIMPLEMENTED; + return FALSE; } INT @@ -145,6 +154,7 @@ NtGdiSetICMProfile(HDC hDC, LPWSTR Filename) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -155,6 +165,7 @@ NtGdiUpdateICMRegKey(DWORD Reserved, UINT Command) { UNIMPLEMENTED; + return FALSE; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index ade99359842..e80509be181 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: line.c,v 1.36 2004/07/03 22:36:01 navaraf Exp $ */ +/* $Id: line.c,v 1.37 2004/07/14 20:48:58 navaraf Exp $ */ #include // Some code from the WINE project source (www.winehq.com) @@ -54,6 +54,7 @@ IntGdiLineTo(DC *dc, BITMAPOBJ *BitmapObj; BOOL Ret = TRUE; PGDIBRUSHOBJ PenBrushObj; + GDIBRUSHINST PenBrushInst; RECTL Bounds; POINT Points[2]; @@ -101,9 +102,10 @@ IntGdiLineTo(DC *dc, if (!(PenBrushObj->flAttrs & GDIBRUSH_IS_NULL)) { + IntGdiInitBrushInstance(&PenBrushInst, PenBrushObj, dc->XlatePen); Ret = IntEngLineTo(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, + &PenBrushInst.BrushObject, Points[0].x, Points[0].y, Points[1].x, Points[1].y, &Bounds, @@ -190,6 +192,7 @@ IntGdiPolyline(DC *dc, { BITMAPOBJ *BitmapObj; GDIBRUSHOBJ *PenBrushObj; + GDIBRUSHINST PenBrushInst; LPPOINT Points; BOOL Ret = TRUE; LONG i; @@ -219,8 +222,9 @@ IntGdiPolyline(DC *dc, Points[i].y += dc->w.DCOrgY; } + IntGdiInitBrushInstance(&PenBrushInst, PenBrushObj, dc->XlatePen); Ret = IntEngPolyline(BitmapObj, dc->CombinedClip, - &PenBrushObj->BrushObject, Points, Count, + &PenBrushInst.BrushObject, Points, Count, dc->w.ROPmode); BITMAPOBJ_UnlockBitmap(dc->w.hBitmap); @@ -337,6 +341,7 @@ NtGdiAngleArc(HDC hDC, FLOAT SweepAngle) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -611,6 +616,7 @@ NtGdiPolyDraw(HDC hDC, int Count) { UNIMPLEMENTED; + return FALSE; } BOOL diff --git a/reactos/subsys/win32k/objects/metafile.c b/reactos/subsys/win32k/objects/metafile.c index 97a48ee395d..bb382a158dc 100644 --- a/reactos/subsys/win32k/objects/metafile.c +++ b/reactos/subsys/win32k/objects/metafile.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: metafile.c,v 1.10 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: metafile.c,v 1.11 2004/07/14 20:48:58 navaraf Exp $ */ #include HENHMETAFILE @@ -24,6 +24,7 @@ STDCALL NtGdiCloseEnhMetaFile(HDC hDC) { UNIMPLEMENTED; + return 0; } HMETAFILE @@ -31,6 +32,7 @@ STDCALL NtGdiCloseMetaFile(HDC hDC) { UNIMPLEMENTED; + return 0; } HENHMETAFILE @@ -39,6 +41,7 @@ NtGdiCopyEnhMetaFile(HENHMETAFILE Src, LPCWSTR File) { UNIMPLEMENTED; + return 0; } HMETAFILE @@ -47,6 +50,7 @@ NtGdiCopyMetaFile(HMETAFILE Src, LPCWSTR File) { UNIMPLEMENTED; + return 0; } HDC @@ -57,6 +61,7 @@ NtGdiCreateEnhMetaFile(HDC hDCRef, LPCWSTR Description) { UNIMPLEMENTED; + return 0; } HDC @@ -64,6 +69,7 @@ STDCALL NtGdiCreateMetaFile(LPCWSTR File) { UNIMPLEMENTED; + return 0; } BOOL @@ -71,6 +77,7 @@ STDCALL NtGdiDeleteEnhMetaFile(HENHMETAFILE emf) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -78,6 +85,7 @@ STDCALL NtGdiDeleteMetaFile(HMETAFILE mf) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -89,6 +97,7 @@ NtGdiEnumEnhMetaFile(HDC hDC, CONST LPRECT Rect) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -99,6 +108,7 @@ NtGdiEnumMetaFile(HDC hDC, LPARAM lParam) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -108,6 +118,7 @@ NtGdiGdiComment(HDC hDC, CONST LPBYTE Data) { UNIMPLEMENTED; + return FALSE; } HENHMETAFILE @@ -115,6 +126,7 @@ STDCALL NtGdiGetEnhMetaFile(LPCWSTR MetaFile) { UNIMPLEMENTED; + return 0; } UINT @@ -124,6 +136,7 @@ NtGdiGetEnhMetaFileBits(HENHMETAFILE hemf, LPBYTE Buffer) { UNIMPLEMENTED; + return 0; } UINT @@ -133,6 +146,7 @@ NtGdiGetEnhMetaFileDescription(HENHMETAFILE hemf, LPWSTR Description) { UNIMPLEMENTED; + return 0; } UINT @@ -142,6 +156,7 @@ NtGdiGetEnhMetaFileHeader(HENHMETAFILE hemf, LPENHMETAHEADER emh) { UNIMPLEMENTED; + return 0; } UINT @@ -151,6 +166,7 @@ NtGdiGetEnhMetaFilePaletteEntries(HENHMETAFILE hemf, LPPALETTEENTRY pe) { UNIMPLEMENTED; + return 0; } HMETAFILE @@ -158,6 +174,7 @@ STDCALL NtGdiGetMetaFile(LPCWSTR MetaFile) { UNIMPLEMENTED; + return 0; } UINT @@ -167,6 +184,7 @@ NtGdiGetMetaFileBitsEx(HMETAFILE hmf, LPVOID Data) { UNIMPLEMENTED; + return 0; } UINT @@ -178,6 +196,7 @@ NtGdiGetWinMetaFileBits(HENHMETAFILE hemf, HDC Ref) { UNIMPLEMENTED; + return 0; } BOOL @@ -187,6 +206,7 @@ NtGdiPlayEnhMetaFile(HDC hDC, CONST PRECT Rect) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -197,6 +217,7 @@ NtGdiPlayEnhMetaFileRecord(HDC hDC, UINT Handles) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -205,6 +226,7 @@ NtGdiPlayMetaFile(HDC hDC, HMETAFILE hmf) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -215,6 +237,7 @@ NtGdiPlayMetaFileRecord(HDC hDC, UINT Handles) { UNIMPLEMENTED; + return FALSE; } HENHMETAFILE @@ -223,6 +246,7 @@ NtGdiSetEnhMetaFileBits(UINT BufSize, CONST PBYTE Data) { UNIMPLEMENTED; + return 0; } HMETAFILE @@ -231,6 +255,7 @@ NtGdiSetMetaFileBitsEx(UINT Size, CONST PBYTE Data) { UNIMPLEMENTED; + return 0; } HENHMETAFILE @@ -242,6 +267,7 @@ NtGdiSetWinMetaFileBits(UINT BufSize, PVOID mfp) { UNIMPLEMENTED; + return 0; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/paint.c b/reactos/subsys/win32k/objects/paint.c index 8cb6d9b9842..7d9b0b6be48 100644 --- a/reactos/subsys/win32k/objects/paint.c +++ b/reactos/subsys/win32k/objects/paint.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: paint.c,v 1.11 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: paint.c,v 1.12 2004/07/14 20:48:58 navaraf Exp $ */ #include BOOL @@ -24,6 +24,7 @@ STDCALL NtGdiGdiFlush(VOID) { UNIMPLEMENTED; + return FALSE; } DWORD @@ -31,6 +32,7 @@ STDCALL NtGdiGdiGetBatchLimit(VOID) { UNIMPLEMENTED; + return 0; } DWORD @@ -38,6 +40,7 @@ STDCALL NtGdiGdiSetBatchLimit(DWORD Limit) { UNIMPLEMENTED; + return 0; } UINT diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 005df53c83b..bd63a413023 100644 --- a/reactos/subsys/win32k/objects/path.c +++ b/reactos/subsys/win32k/objects/path.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: path.c,v 1.23 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: path.c,v 1.24 2004/07/14 20:48:58 navaraf Exp $ */ #include #include @@ -43,6 +43,7 @@ STDCALL NtGdiAbortPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -50,6 +51,7 @@ STDCALL NtGdiBeginPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -81,6 +83,7 @@ STDCALL NtGdiEndPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -88,6 +91,7 @@ STDCALL NtGdiFillPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -95,6 +99,7 @@ STDCALL NtGdiFlattenPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } @@ -104,6 +109,7 @@ NtGdiGetMiterLimit(HDC hDC, PFLOAT Limit) { UNIMPLEMENTED; + return FALSE; } INT @@ -114,6 +120,7 @@ NtGdiGetPath(HDC hDC, INT nSize) { UNIMPLEMENTED; + return 0; } HRGN @@ -121,6 +128,7 @@ STDCALL NtGdiPathToRegion(HDC hDC) { UNIMPLEMENTED; + return 0; } BOOL @@ -130,6 +138,7 @@ NtGdiSetMiterLimit(HDC hDC, PFLOAT OldLimit) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -137,6 +146,7 @@ STDCALL NtGdiStrokeAndFillPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -144,6 +154,7 @@ STDCALL NtGdiStrokePath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -151,6 +162,7 @@ STDCALL NtGdiWidenPath(HDC hDC) { UNIMPLEMENTED; + return FALSE; } /*********************************************************************** diff --git a/reactos/subsys/win32k/objects/pen.c b/reactos/subsys/win32k/objects/pen.c index f1ee19efa56..d267a43365c 100644 --- a/reactos/subsys/win32k/objects/pen.c +++ b/reactos/subsys/win32k/objects/pen.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: pen.c,v 1.15 2004/05/10 17:07:20 weiden Exp $ + * $Id: pen.c,v 1.16 2004/07/14 20:48:58 navaraf Exp $ */ #include @@ -45,7 +45,6 @@ IntGdiCreatePenIndirect(PLOGPEN LogPen) PenObject->ptPenWidth = LogPen->lopnWidth; PenObject->ulPenStyle = LogPen->lopnStyle; PenObject->BrushAttr.lbColor = LogPen->lopnColor; - PenObject->BrushObject.iSolidColor = LogPen->lopnColor; PenObject->flAttrs = GDIBRUSH_IS_OLDSTYLEPEN; switch (LogPen->lopnStyle) { @@ -114,6 +113,7 @@ NtGdiExtCreatePen( CONST PDWORD Style) { UNIMPLEMENTED; + return 0; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index 6f13519655a..5d7cddb0d41 100644 --- a/reactos/subsys/win32k/objects/print.c +++ b/reactos/subsys/win32k/objects/print.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: print.c,v 1.19 2004/07/03 13:55:37 navaraf Exp $ */ +/* $Id: print.c,v 1.20 2004/07/14 20:48:58 navaraf Exp $ */ #include INT @@ -24,6 +24,7 @@ STDCALL NtGdiAbortDoc(HDC hDC) { UNIMPLEMENTED; + return 0; } INT @@ -31,6 +32,7 @@ STDCALL NtGdiEndDoc(HDC hDC) { UNIMPLEMENTED; + return 0; } INT @@ -38,6 +40,7 @@ STDCALL NtGdiEndPage(HDC hDC) { UNIMPLEMENTED; + return 0; } INT @@ -49,6 +52,7 @@ NtGdiEscape(HDC hDC, LPVOID OutData) { UNIMPLEMENTED; + return 0; } INT @@ -184,6 +188,7 @@ NtGdiSetAbortProc(HDC hDC, ABORTPROC AbortProc) { UNIMPLEMENTED; + return 0; } INT @@ -192,6 +197,7 @@ NtGdiStartDoc(HDC hDC, CONST LPDOCINFOW di) { UNIMPLEMENTED; + return 0; } INT @@ -199,5 +205,6 @@ STDCALL NtGdiStartPage(HDC hDC) { UNIMPLEMENTED; + return 0; } /* EOF */ diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 21658a98a9f..bdaad1e32b4 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -/* $Id: region.c,v 1.61 2004/07/03 17:40:27 navaraf Exp $ */ +/* $Id: region.c,v 1.62 2004/07/14 20:48:58 navaraf Exp $ */ #include #include @@ -2396,6 +2396,7 @@ NtGdiPaintRgn(HDC hDC, CLIPOBJ* ClipRegion; BOOL bRet = FALSE; PGDIBRUSHOBJ pBrush; + GDIBRUSHINST BrushInst; POINTL BrushOrigin; BITMAPOBJ *BitmapObj; @@ -2432,13 +2433,15 @@ NtGdiPaintRgn(HDC hDC, ASSERT( ClipRegion ); pBrush = BRUSHOBJ_LockBrush(dc->w.hBrush); ASSERT(pBrush); + IntGdiInitBrushInstance(&BrushInst, pBrush, dc->XlateBrush); + BrushOrigin.x = dc->w.brushOrgX; BrushOrigin.y = dc->w.brushOrgY; BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); bRet = IntEngPaint(BitmapObj, ClipRegion, - &pBrush->BrushObject, + &BrushInst.BrushObject, &BrushOrigin, 0xFFFF);//FIXME:don't know what to put here diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 41637e9e6e2..355b726bd17 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: text.c,v 1.104 2004/07/11 02:10:48 navaraf Exp $ */ +/* $Id: text.c,v 1.105 2004/07/14 20:48:58 navaraf Exp $ */ #include #include @@ -648,6 +648,7 @@ NtGdiCreateScalableFontResource(DWORD Hidden, LPCWSTR CurrentPath) { UNIMPLEMENTED; + return FALSE; } /************************************************************************* @@ -1494,6 +1495,7 @@ NtGdiEnumFonts(HDC hDC, LPARAM lParam) { UNIMPLEMENTED; + return 0; } BOOL STDCALL @@ -1525,8 +1527,10 @@ NtGdiExtTextOut( POINTL SourcePoint, BrushOrigin; HBRUSH hBrushFg = NULL; PGDIBRUSHOBJ BrushFg = NULL; + GDIBRUSHINST BrushFgInst; HBRUSH hBrushBg = NULL; PGDIBRUSHOBJ BrushBg = NULL; + GDIBRUSHINST BrushBgInst; HBITMAP HSourceGlyph; SURFOBJ *SourceGlyphSurf; SIZEL bitSize; @@ -1587,12 +1591,14 @@ NtGdiExtTextOut( XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); hBrushFg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); BrushFg = BRUSHOBJ_LockBrush(hBrushFg); + IntGdiInitBrushInstance(&BrushFgInst, BrushFg, NULL); if ((fuOptions & ETO_OPAQUE) || dc->w.backgroundMode == OPAQUE) { hBrushBg = NtGdiCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.backgroundColor)); if (hBrushBg) { BrushBg = BRUSHOBJ_LockBrush(hBrushBg); + IntGdiInitBrushInstance(&BrushBgInst, BrushBg, NULL); } else { @@ -1625,7 +1631,7 @@ NtGdiExtTextOut( &DestRect, &SourcePoint, &SourcePoint, - &BrushBg->BrushObject, + &BrushBgInst.BrushObject, &BrushOrigin, PATCOPY); fuOptions &= ~ETO_OPAQUE; @@ -1839,7 +1845,7 @@ NtGdiExtTextOut( &DestRect, &SourcePoint, &SourcePoint, - &BrushBg->BrushObject, + &BrushBgInst.BrushObject, &BrushOrigin, PATCOPY); BackgroundLeft = DestRect.right; @@ -1878,7 +1884,7 @@ NtGdiExtTextOut( &DestRect, &SourcePoint, (PPOINTL)&MaskRect, - &BrushFg->BrushObject, + &BrushFgInst.BrushObject, &BrushOrigin); EngUnlockSurface(SourceGlyphSurf); @@ -1944,6 +1950,7 @@ NtGdiGetAspectRatioFilterEx(HDC hDC, LPSIZE AspectRatio) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -1965,6 +1972,7 @@ NtGdiGetCharABCWidthsFloat(HDC hDC, LPABCFLOAT abcF) { UNIMPLEMENTED; + return FALSE; } DWORD @@ -1977,6 +1985,7 @@ NtGdiGetCharacterPlacement(HDC hDC, DWORD Flags) { UNIMPLEMENTED; + return 0; } BOOL @@ -2090,6 +2099,7 @@ NtGdiGetCharWidthFloat(HDC hDC, PFLOAT Buffer) { UNIMPLEMENTED; + return FALSE; } DWORD @@ -2097,6 +2107,7 @@ STDCALL NtGdiGetFontLanguageInfo(HDC hDC) { UNIMPLEMENTED; + return 0; } DWORD @@ -2110,8 +2121,7 @@ NtGdiGetGlyphOutline(HDC hDC, CONST LPMAT2 mat2) { UNIMPLEMENTED; - - + return 0; } DWORD @@ -2121,6 +2131,7 @@ NtGdiGetKerningPairs(HDC hDC, LPKERNINGPAIR krnpair) { UNIMPLEMENTED; + return 0; } UINT @@ -2130,6 +2141,7 @@ NtGdiGetOutlineTextMetrics(HDC hDC, LPOUTLINETEXTMETRICW otm) { UNIMPLEMENTED; + return 0; } BOOL @@ -2138,6 +2150,7 @@ NtGdiGetRasterizerCaps(LPRASTERIZER_STATUS rs, UINT Size) { UNIMPLEMENTED; + return FALSE; } UINT @@ -2145,6 +2158,7 @@ STDCALL NtGdiGetTextCharset(HDC hDC) { UNIMPLEMENTED; + return 0; } UINT @@ -2154,6 +2168,7 @@ NtGdiGetTextCharsetInfo(HDC hDC, DWORD Flags) { UNIMPLEMENTED; + return 0; } static BOOL @@ -2625,6 +2640,7 @@ NtGdiPolyTextOut(HDC hDC, int Count) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -2632,6 +2648,7 @@ STDCALL NtGdiRemoveFontResource(LPCWSTR FileName) { UNIMPLEMENTED; + return FALSE; } DWORD @@ -2640,6 +2657,7 @@ NtGdiSetMapperFlags(HDC hDC, DWORD Flag) { UNIMPLEMENTED; + return 0; } UINT @@ -2692,6 +2710,7 @@ NtGdiSetTextJustification(HDC hDC, int BreakCount) { UNIMPLEMENTED; + return FALSE; } BOOL STDCALL diff --git a/reactos/subsys/win32k/objects/wingl.c b/reactos/subsys/win32k/objects/wingl.c index f58f7369b2d..2fc41d49e83 100644 --- a/reactos/subsys/win32k/objects/wingl.c +++ b/reactos/subsys/win32k/objects/wingl.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: wingl.c,v 1.8 2004/05/10 17:07:20 weiden Exp $ */ +/* $Id: wingl.c,v 1.9 2004/07/14 20:48:58 navaraf Exp $ */ #include INT @@ -25,6 +25,7 @@ NtGdiChoosePixelFormat(HDC hDC, CONST PPIXELFORMATDESCRIPTOR pfd) { UNIMPLEMENTED; + return 0; } @@ -36,6 +37,7 @@ NtGdiDescribePixelFormat(HDC hDC, LPPIXELFORMATDESCRIPTOR pfd) { UNIMPLEMENTED; + return 0; } UINT @@ -45,6 +47,7 @@ NtGdiGetEnhMetaFilePixelFormat(HENHMETAFILE hEMF, CONST PPIXELFORMATDESCRIPTOR pfd) { UNIMPLEMENTED; + return 0; } INT @@ -52,6 +55,7 @@ STDCALL NtGdiGetPixelFormat(HDC hDC) { UNIMPLEMENTED; + return 0; } BOOL @@ -61,6 +65,7 @@ NtGdiSetPixelFormat(HDC hDC, CONST PPIXELFORMATDESCRIPTOR pfd) { UNIMPLEMENTED; + return FALSE; } BOOL @@ -68,6 +73,7 @@ STDCALL NtGdiSwapBuffers(HDC hDC) { UNIMPLEMENTED; + return FALSE; } /* EOF */ From 219e1664cfe01a58e8457394308d7adff8fa9085 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 14 Jul 2004 20:52:13 +0000 Subject: [PATCH 294/356] - Add FIXME comment to LoadIconImage. svn path=/trunk/; revision=10117 --- reactos/lib/user32/windows/bitmap.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reactos/lib/user32/windows/bitmap.c b/reactos/lib/user32/windows/bitmap.c index a75e2a66b33..166dbfa546c 100644 --- a/reactos/lib/user32/windows/bitmap.c +++ b/reactos/lib/user32/windows/bitmap.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmap.c,v 1.30 2004/06/23 05:04:30 ion Exp $ +/* $Id: bitmap.c,v 1.31 2004/07/14 20:52:13 navaraf Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -337,6 +337,14 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL } else { + /* + * FIXME: This code is incorrect and is likely to crash in many cases. + * In the file the cursor/icon directory records are stored like + * CURSORICONFILEDIR, but we treat them like CURSORICONDIR. In Wine + * this is solved by creating a fake cursor/icon directory in memory + * and passing that to CURSORICON_FindBestIcon. + */ + if (fuLoad & LR_SHARED) { DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n"); From 3baccc96f1a0736c5368a21818b28dd576b8ea9d Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 14 Jul 2004 21:45:05 +0000 Subject: [PATCH 295/356] - Accidently commited this file with my last patch. Reverting. svn path=/trunk/; revision=10118 --- reactos/subsys/win32k/ntuser/winpos.c | 102 ++++++++++++++------------ 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/winpos.c b/reactos/subsys/win32k/ntuser/winpos.c index 8dd43ff5d0f..6cbdc44a0e9 100644 --- a/reactos/subsys/win32k/ntuser/winpos.c +++ b/reactos/subsys/win32k/ntuser/winpos.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: winpos.c,v 1.119 2004/07/14 20:48:57 navaraf Exp $ +/* $Id: winpos.c,v 1.120 2004/07/14 21:45:05 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -98,22 +98,6 @@ NtUserGetClientOrigin(HWND hWnd, LPPOINT Point) return Ret; } -/******************************************************************* - * WinPosCanActivateWindow - * - * Check if we can activate the specified window. - */ -static BOOL WinPosCanActivateWindow(HWND hWnd) -{ - LONG Style; - - if (!hWnd) return FALSE; - Style = NtUserGetWindowLong(hWnd, GWL_STYLE, FALSE); - if (!(Style & WS_VISIBLE)) return FALSE; - if ((Style & (WS_POPUP | WS_CHILD)) == WS_CHILD) return FALSE; - return !(Style & WS_DISABLED); -} - /******************************************************************* * WinPosActivateOtherWindow * @@ -122,37 +106,63 @@ static BOOL WinPosCanActivateWindow(HWND hWnd) VOID FASTCALL WinPosActivateOtherWindow(PWINDOW_OBJECT Window) { - HWND hwndTo = NULL, fg; - PWINDOW_OBJECT wndTo; - - if ((Window->Style & WS_POPUP) && (hwndTo = Window->Owner)) - { - hwndTo = NtUserGetAncestor(hwndTo, GA_ROOT); - if (WinPosCanActivateWindow(hwndTo)) - goto done; - } - - for (hwndTo = NtUserGetWindow(Window->Self, GW_HWNDNEXT); - hwndTo != NULL; - hwndTo = NtUserGetWindow(hwndTo, GW_HWNDNEXT)) - { - if (WinPosCanActivateWindow(hwndTo)) break; - } - -done: - fg = NtUserGetForegroundWindow(); - if (!fg || (Window->Self == fg)) - { - wndTo = IntGetWindowObject(hwndTo); - if (wndTo != NULL && IntSetForegroundWindow(wndTo)) + PWINDOW_OBJECT Wnd, Old; + int TryTopmost; + + if (!Window || IntIsDesktopWindow(Window)) + { + IntSetFocusMessageQueue(NULL); + return; + } + Wnd = Window; + for(;;) + { + HWND *List, *phWnd; + + Old = Wnd; + Wnd = IntGetParentObject(Wnd); + if(Old != Window) + { + IntReleaseWindowObject(Old); + } + if(!Wnd) + { + IntSetFocusMessageQueue(NULL); + return; + } + + if((List = IntWinListChildren(Wnd))) + { + for(TryTopmost = 0; TryTopmost <= 1; TryTopmost++) { - IntReleaseWindowObject(wndTo); - return; + for(phWnd = List; *phWnd; phWnd++) + { + PWINDOW_OBJECT Child; + + if((*phWnd) == Window->Self) + { + continue; + } + + if((Child = IntGetWindowObject(*phWnd))) + { + if(((! TryTopmost && (0 == (Child->ExStyle & WS_EX_TOPMOST))) + || (TryTopmost && (0 != (Child->ExStyle & WS_EX_TOPMOST)))) + && IntSetForegroundWindow(Child)) + { + ExFreePool(List); + IntReleaseWindowObject(Wnd); + IntReleaseWindowObject(Child); + return; + } + IntReleaseWindowObject(Child); + } + } } - IntReleaseWindowObject(wndTo); - } - if (!NtUserSetActiveWindow(hwndTo)) - NtUserSetActiveWindow(0); + ExFreePool(List); + } + } + IntReleaseWindowObject(Wnd); } VOID STATIC FASTCALL From 383e5a9c1af880dfa155ade3098666d37fc19500 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 14 Jul 2004 21:52:23 +0000 Subject: [PATCH 296/356] Warn rather than bail on HWND_MESSAGE windows request. This gets the Scintilla Editor from theopencd to work. svn path=/trunk/; revision=10119 --- reactos/subsys/win32k/ntuser/window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 2c68169504a..14d7c63ce5c 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: window.c,v 1.243 2004/07/09 20:57:38 gvg Exp $ +/* $Id: window.c,v 1.244 2004/07/14 21:52:23 sedwards Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1430,7 +1430,7 @@ IntCreateWindowEx(DWORD dwExStyle, * native ole32.OleInitialize uses HWND_MESSAGE to create the * message window (style: WS_POPUP|WS_DISABLED) */ - UNIMPLEMENTED; + DPRINT1("FIXME - Parent is HWND_MESSAGE\n"); } else if (hWndParent) { From c26b523ad9418b369e333272e704ce89619c46fb Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Wed, 14 Jul 2004 22:20:07 +0000 Subject: [PATCH 297/356] added Spanish translation by Carlos Garcia Gomez. svn path=/trunk/; revision=10120 --- .../subsys/system/explorer/explorer_intres.rc | 466 ++++++++++++++++++ 1 file changed, 466 insertions(+) diff --git a/reactos/subsys/system/explorer/explorer_intres.rc b/reactos/subsys/system/explorer/explorer_intres.rc index 488e700781c..92870286710 100644 --- a/reactos/subsys/system/explorer/explorer_intres.rc +++ b/reactos/subsys/system/explorer/explorer_intres.rc @@ -1423,7 +1423,473 @@ END #endif // Portuguese (Portugal) resources ///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// Spanish (Spain) resources +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_SPANISH, SUBLANG_SPANISH +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "&Salir", ID_FILE_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Herramientas", ID_VIEW_TOOL_BAR + MENUITEM "Barra &Extra", ID_VIEW_EXTRA_BAR + MENUITEM "Barra de &Unidades", +ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR + MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_REFRESH + MENUITEM "P&antalla Completa\tCtrl+Shift+S", +ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI + END + POPUP "&Ventana" + BEGIN + MENUITEM "Nueva &Ventana", ID_WINDOW_NEW + MENUITEM "Cascada\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Mosaico &Horizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaico &Vertical\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Agrupar Automaticamente", ID_WINDOW_AUTOSORT + MENUITEM "Agrupar &Simbolos", ID_WINDOW_ARRANGE + END + POPUP "A&yuda" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "S&alir", ID_FILE_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Barra de Herramientas", +ID_VIEW_TOOL_BAR + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR, +GRAYED + MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_REFRESH + MENUITEM "P&antalla Completa\tCtrl+Shift+S", +ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Ayuda" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_WINEFILE MENU FIXED IMPURE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "&Abrir\tEnter", 101 + MENUITEM "&Mover...\tF7", 106 + MENUITEM "&Copiar...\tF8", 107 + MENUITEM "&en el Portapapeles...\tF9", 118 + MENUITEM "&Eliminar\tDel", 108 + MENUITEM "Re&nombrar...", 109 + MENUITEM "Prop&iedades...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "C&omprimir...", 119 + MENUITEM "Desc&omprimir...", 120 + MENUITEM SEPARATOR + MENUITEM "&Ejecutar...", ID_EXECUTE + MENUITEM "&Imprimir...", 102 + MENUITEM "Asociar...", 103 + MENUITEM SEPARATOR + MENUITEM "Cr&ear Directorio...", ID_EXECUTE + MENUITEM "Busca&r...", 104 + MENUITEM "&Seleccionar Archivos...", 116 + MENUITEM SEPARATOR + MENUITEM "S&alir\tAlt+X", ID_FILE_EXIT + END + POPUP "&Disco" + BEGIN + MENUITEM "&Copiar Disco...", 201 + MENUITEM "&Etiqueta del Disco...", 202 + MENUITEM SEPARATOR + MENUITEM "&Formateart Disco...", 203 + MENUITEM SEPARATOR + MENUITEM "Conectar a &Unidad de Red", 252 + MENUITEM "&Desconectar Unidad de Red", 253 + MENUITEM SEPARATOR + MENUITEM "Guardar como...", 254 + MENUITEM "&Eliminar Guardado...", 255 + MENUITEM SEPARATOR + MENUITEM "&Seleccionar Unidad...", 251 + END + POPUP "&Directorios" + BEGIN + MENUITEM "&Siguiente Nivel\t+", 301 + MENUITEM "Expandir &Arbol\t*", 302 + MENUITEM "Expandir &Todo\tStrg+*", 303 + MENUITEM "Contraer &Arbol\t-", 304 + MENUITEM SEPARATOR + MENUITEM "&Marcar Hijos", 505 + END + POPUP "&Ver" + BEGIN + MENUITEM "A&rbol y Directorio", 413 + MENUITEM "Solo Arb&ol", 411 + MENUITEM "S&olo Directorio", 412 + MENUITEM SEPARATOR + MENUITEM "Sp&lit", 414 + MENUITEM SEPARATOR + MENUITEM "&Nombre", ID_VIEW_NAME + MENUITEM "&Todos Los Detalles del Archivo", +ID_VIEW_ALL_ATTRIBUTES + , CHECKED + MENUITEM "Detalles &Parciales...", +ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "&Ordenar por Nombre", 404 + MENUITEM "Ordenar &por Tipo", 405 + MENUITEM "Ord&enar por Tamaño", 406 + MENUITEM "Or&denar por Fecha", 407 + MENUITEM SEPARATOR + MENUITEM "Ordenar por &...", 409 + END + POPUP "&Opciones" + BEGIN + MENUITEM "&Confirmacion...", 65535 + MENUITEM "&Fuente...", 65535 + MENUITEM "Personalizar la &Barra de Herramientas...", +65535 + MENUITEM SEPARATOR + MENUITEM "Barra de Herramien&tas", +ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "Barra de Uni&dades", +ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR + MENUITEM "Barra de E&stado", ID_VIEW_STATUSBAR, +CHECKED + MENUITEM "Pantalla Com&pleta\tCtrl+Shift+S", +ID_VIEW_FULLSCREEN + END + POPUP "&Seguridad" + BEGIN + MENUITEM "&Aceso...", 605 + MENUITEM "&Entrada...", 606 + MENUITEM "&Propietario...", 607 + END + POPUP "&Ventana" + BEGIN + MENUITEM "Nueva &Ventana", ID_WINDOW_NEW + MENUITEM "Cascada\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "Mosaico &Horizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaico &Vertical\tCtrl+F4", ID_WINDOW_TILE_VERT + MENUITEM "Agrupar Automaticamente", ID_WINDOW_AUTOSORT + MENUITEM "Agrupar &Simbolos", ID_WINDOW_ARRANGE + MENUITEM "&Actualizar\tF5", ID_REFRESH + END + POPUP "&?" + BEGIN + MENUITEM "&Temas de Ayuda\tF1", ID_HELP + MENUITEM "Ayuda y &Buscar...\tF1", ID_HELP + MENUITEM "&Usando la Ayuda\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "Info sobre &ArchivoWine...", ID_ABOUT_WINEFILE + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Configuracion...", +ID_DESKTOPBAR_SETTINGS + MENUITEM "&Administrador de Tareas...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Abrir Control de Volumen", ID_TRAY_VOLUME + MENUITEM "Ajustar Propiedades de Audio", +ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Mostrar iconos ocultos", +ID_SHOW_HIDDEN_ICONS + MENUITEM "&Configurar Notificaciones...", ID_CONFIG_NOTIFYAREA + MENUITEM "Ajustar Fecha/&Hora...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | +WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | +WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&Aceptar",1,158,6,47,14 + PUSHBUTTON "&Cancelar",2,158,23,47,14 + PUSHBUTTON "&Ayuda",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | +WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Buscar Programa en el menu Inicio" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtro:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL +"List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Marcar Entradas",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades de Pantalla" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Por favor seleccione su algoritmo de alineamiento preferido:", + IDC_STATIC,7,7,166,8 + CONTROL "izquierda/arriba abajo",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "izquierda/arriba derecha",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "derecha/arriba izquierda",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "derecha/arriba abajo",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "derecha/abajo arriba",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "izquierda/abajo derecha",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "derecha/abajo izquierda",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "derecha/abajo",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "borde inferior",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "borde H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Mostrar &Version",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades de la Barra de Tareas" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Mostrar &Reloj",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Ocultar iconos de notificacion inactivos", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notificaciones...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades del Menu Inicio" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 207, 150 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | +WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configure Notification Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,193,31 + LTEXT "&Texto de Info de herramientas:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,55,42,145,14,ES_AUTOHSCROLL + LTEXT "Titulo de la V&entana:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,55,60,145,14,ES_AUTOHSCROLL + LTEXT "Parche del &Modulo:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,55,78,145,14,ES_AUTOHSCROLL + GROUPBOX "Modo de &Display",IDC_LABEL4,7,95,157,28 + CONTROL "&Mostrar",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,107,33,10 + CONTROL "&Ocultar",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 107,29,10 + CONTROL "A&utoocultar",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,107,43,10 + ICON "",IDC_PICTURE,173,100,20,20 + CONTROL "Mostrar Ocultos",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,131,56,10 + DEFPUSHBUTTON "&Aceptar",IDOK,91,129,50,14,WS_GROUP + PUSHBUTTON "&Cancelar",IDCANCEL,150,129,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_SEARCH_PROGRAM, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 193 + TOPMARGIN, 7 + BOTTOMMARGIN, 58 + END + + IDD_DESKBAR_DESKTOP, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 205 + TOPMARGIN, 7 + BOTTOMMARGIN, 187 + END + + IDD_DESKBAR_TASKBAR, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 187 + END + + IDD_DESKBAR_STARTMENU, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 203 + TOPMARGIN, 7 + BOTTOMMARGIN, 187 + END + + IDD_NOTIFYAREA, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 143 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Iniciar" + IDS_LOGOFF "Salir..." + IDS_SHUTDOWN "Apagar..." + IDS_LAUNCH "Ejecutar..." + IDS_START_HELP "Ayuda" + IDS_SEARCH_FILES "Buscar..." + IDS_DOCUMENTS "Documentos" + IDS_FAVORITES "Favoritos" + IDS_PROGRAMS "Programas" + IDS_SETTINGS "Configuracion" + IDS_EXPLORE "Explorar" + IDS_EMPTY "(Vacio)" + IDS_RECENT "Documentos Recientes" + IDS_ADMIN "Administracion" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Res" + IDS_CONNECTIONS "Conexiones de Red" + IDS_DRIVES "Unidades" + IDS_SEARCH_COMPUTER "Buscar PC..." + IDS_SETTINGS_MENU "Menus de Configuracion" + IDS_CONTROL_PANEL "Panel de Control" + IDS_PRINTERS "Impresoras" + IDS_BROWSE "Explorer Archivos" + IDS_SEARCH_PRG "Buscar Programas..." + IDS_ALL_USERS "Todos los Usuarios\\" + IDS_SEARCH "Buscar" + IDS_ABOUT_EXPLORER "&Acerca de Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Ha seleccionado mas de un programa.\n¿Está seguro de que desea ejecutarlos todos ?" + IDS_DESKTOPBAR_SETTINGS "Configuracion del Escritorio" + IDS_DESKTOP "Escritorio" + IDS_TASKBAR "Barra de Tareas" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Menu Inicio" + IDS_MINIMIZE_ALL "mimimizar todas las ventanas" + IDS_DESKTOP_NUM "Escritorio %d" + IDS_VOLUME "Volumen" + IDS_ITEMS_CUR "Objetos Actuales" + IDS_ITEMS_CONFIGURED "configuracion" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "oculto" + IDS_NOTIFY_SHOW "mostrar" + IDS_NOTIFY_HIDE "ocultar" + IDS_NOTIFY_AUTOHIDE "autoocultar" +END + +#endif // Spansih (Spain) resources +///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// From 9ce1fe0ddb9ad6fea3ea82d3be3b8af4c2e647ee Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Thu, 15 Jul 2004 02:03:07 +0000 Subject: [PATCH 298/356] Small changes to debug output in catalog, handle, upcall. ns.c -- getservbyport contributed by Cameron Palmer. svn path=/trunk/; revision=10121 --- reactos/lib/ws2_32/include/ws2_32.h | 9 ++ reactos/lib/ws2_32/misc/catalog.c | 4 +- reactos/lib/ws2_32/misc/dllmain.c | 1 + reactos/lib/ws2_32/misc/handle.c | 8 +- reactos/lib/ws2_32/misc/ns.c | 161 +++++++++++++++++++++++++++- reactos/lib/ws2_32/misc/upcall.c | 2 +- 6 files changed, 176 insertions(+), 9 deletions(-) diff --git a/reactos/lib/ws2_32/include/ws2_32.h b/reactos/lib/ws2_32/include/ws2_32.h index 3abe94b777f..820171d9ed6 100644 --- a/reactos/lib/ws2_32/include/ws2_32.h +++ b/reactos/lib/ws2_32/include/ws2_32.h @@ -37,11 +37,20 @@ typedef struct _WINSOCK_GETSERVBYNAME_CACHE { CHAR Data[1]; } WINSOCK_GETSERVBYNAME_CACHE, *PWINSOCK_GETSERVBYNAME_CACHE; +typedef struct _WINSOCK_GETSERVBYPORT_CACHE { + UINT Size; + SERVENT ServerEntry; + PCHAR Aliases[WS2_INTERNAL_MAX_ALIAS]; + CHAR Data[1]; +} WINSOCK_GETSERVBYPORT_CACHE, *PWINSOCK_GETSERVBYPORT_CACHE; + typedef struct _WINSOCK_THREAD_BLOCK { INT LastErrorValue; /* Error value from last function that failed */ CHAR Intoa[16]; /* Buffer for inet_ntoa() */ PWINSOCK_GETSERVBYNAME_CACHE Getservbyname; /* Buffer used by getservbyname */ + PWINSOCK_GETSERVBYPORT_CACHE + Getservbyport; /* Buffer used by getservbyname */ } WINSOCK_THREAD_BLOCK, *PWINSOCK_THREAD_BLOCK; diff --git a/reactos/lib/ws2_32/misc/catalog.c b/reactos/lib/ws2_32/misc/catalog.c index e94e8d29290..6ad9caf230e 100644 --- a/reactos/lib/ws2_32/misc/catalog.c +++ b/reactos/lib/ws2_32/misc/catalog.c @@ -188,7 +188,7 @@ INT LoadProvider( { INT Status; - WS_DbgPrint(MAX_TRACE, ("Loading provider at (0x%X) Name (%wZ).\n", + WS_DbgPrint(MID_TRACE, ("Loading provider at (0x%X) Name (%wZ).\n", Provider, &Provider->LibraryName)); if (NULL == Provider->hModule) @@ -221,7 +221,7 @@ INT LoadProvider( } else Status = NO_ERROR; - WS_DbgPrint(MAX_TRACE, ("Status (%d).\n", Status)); + WS_DbgPrint(MID_TRACE, ("Status (%d).\n", Status)); return Status; } diff --git a/reactos/lib/ws2_32/misc/dllmain.c b/reactos/lib/ws2_32/misc/dllmain.c index 0b79ab9d019..46a907f5a75 100644 --- a/reactos/lib/ws2_32/misc/dllmain.c +++ b/reactos/lib/ws2_32/misc/dllmain.c @@ -668,6 +668,7 @@ DllMain(HANDLE hInstDll, p->LastErrorValue = NO_ERROR; p->Getservbyname = NULL; + p->Getservbyport = NULL; NtCurrentTeb()->WinSockData = p; break; diff --git a/reactos/lib/ws2_32/misc/handle.c b/reactos/lib/ws2_32/misc/handle.c index 7e6dcc52819..4590574083b 100644 --- a/reactos/lib/ws2_32/misc/handle.c +++ b/reactos/lib/ws2_32/misc/handle.c @@ -161,6 +161,8 @@ CreateProviderHandleTable( NewBlock = (PPROVIDER_HANDLE_BLOCK)HeapAlloc( GlobalHeap, 0, sizeof(PROVIDER_HANDLE_BLOCK)); + WS_DbgPrint(MID_TRACE,("using table entry %x\n", NewBlock)); + if (!NewBlock) return (HANDLE)0; @@ -209,12 +211,14 @@ ReferenceProviderByHandle( { PPROVIDER_HANDLE ProviderHandle; - WS_DbgPrint(MAX_TRACE, ("Handle (0x%X) Provider (0x%X).\n", Handle, Provider)); + WS_DbgPrint(MID_TRACE, ("Handle (0x%X) Provider (0x%X).\n", Handle, Provider)); EnterCriticalSection(&ProviderHandleTableLock); ProviderHandle = GetProviderByHandle(ProviderHandleTable, Handle); + WS_DbgPrint(MID_TRACE, ("ProviderHanddle is %x\n", ProviderHandle)); + LeaveCriticalSection(&ProviderHandleTableLock); if (ProviderHandle) { @@ -256,6 +260,8 @@ InitProviderHandleTable(VOID) if (!ProviderHandleTable) return FALSE; + WS_DbgPrint(MID_TRACE,("Called\n")); + ZeroMemory(ProviderHandleTable, sizeof(PROVIDER_HANDLE_BLOCK)); InitializeListHead(&ProviderHandleTable->Entry); diff --git a/reactos/lib/ws2_32/misc/ns.c b/reactos/lib/ws2_32/misc/ns.c index 3121a3cda20..177039ccb4b 100644 --- a/reactos/lib/ws2_32/misc/ns.c +++ b/reactos/lib/ws2_32/misc/ns.c @@ -7,7 +7,6 @@ * REVISIONS: * CSH 01/09-2000 Created */ -#define __NO_CTYPE_INLINES #include #include @@ -482,6 +481,7 @@ static BOOL DecodeServEntFromString( IN PCHAR ServiceString, LPSERVENT EXPORT getservbyname( + IN CONST CHAR FAR* name, IN CONST CHAR FAR* proto) { @@ -568,8 +568,8 @@ getservbyname( WS2_INTERNAL_MAX_ALIAS ) && !strcmp( ServiceName, name ) && (proto ? !strcmp( ProtocolStr, proto ) : TRUE) ) { - WS_DbgPrint(MAX_TRACE,("Found the service entry.\n")); + WS_DbgPrint(MAX_TRACE,("Found the service entry.\n")); Found = TRUE; SizeNeeded = sizeof(WINSOCK_GETSERVBYNAME_CACHE) + (NextLine - ThisLine); @@ -640,7 +640,7 @@ getservbyname( /* - * @unimplemented + * @implemented */ LPSERVENT EXPORT @@ -648,9 +648,160 @@ getservbyport( IN INT port, IN CONST CHAR FAR* proto) { - UNIMPLEMENTED + BOOL Found = FALSE; + HANDLE ServicesFile; + CHAR ServiceDBData[BUFSIZ] = { 0 }; + PCHAR SystemDirectory = ServiceDBData; /* Reuse this stack space */ + PCHAR ServicesFileLocation = "\\drivers\\etc\\services"; + PCHAR ThisLine = 0, NextLine = 0, ServiceName = 0, PortNumberStr = 0, + ProtocolStr = 0, Comment = 0; + PCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = { 0 }; + UINT i,SizeNeeded = 0, + SystemDirSize = sizeof(ServiceDBData) - 1; + DWORD ReadSize = 0, ValidData = 0; + PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData; + + if( !p ) { + WSASetLastError( WSANOTINITIALISED ); + return NULL; + } + + if ( !port ) { + WSASetLastError( WSANO_RECOVERY ); + return NULL; + } + + if( !GetSystemDirectoryA( SystemDirectory, SystemDirSize ) ) { + WSASetLastError( WSANO_RECOVERY ); + WS_DbgPrint(MIN_TRACE, ("Could not get windows system directory.\n")); + return NULL; /* Can't get system directory */ + } + + strncat( SystemDirectory, ServicesFileLocation, SystemDirSize ); + + ServicesFile = CreateFileA( SystemDirectory, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | + FILE_FLAG_SEQUENTIAL_SCAN, + NULL ); + + if( ServicesFile == INVALID_HANDLE_VALUE ) { + WSASetLastError( WSANO_RECOVERY ); + return NULL; + } + + /* Scan the services file ... + * + * We will read up to BUFSIZ bytes per pass, until the buffer does not + * contain a full line, then we will try to read more. + * + * We fall from the loop if the buffer does not have a line terminator. + */ + + /* Initial Read */ + while( !Found && + ReadFile( ServicesFile, ServiceDBData + ValidData, + sizeof( ServiceDBData ) - ValidData, + &ReadSize, NULL ) ) { + ValidData += ReadSize; + ReadSize = 0; + NextLine = ThisLine = ServiceDBData; + + /* Find the beginning of the next line */ + while( NextLine < ServiceDBData + ValidData && + *NextLine != '\r' && *NextLine != '\n' ) NextLine++; + + /* Zero and skip, so we can treat what we have as a string */ + if( NextLine >= ServiceDBData + ValidData ) + break; + + *NextLine = 0; NextLine++; + + Comment = strchr( ThisLine, '#' ); + if( Comment ) *Comment = 0; /* Terminate at comment start */ + + if( DecodeServEntFromString( ThisLine, + &ServiceName, + &PortNumberStr, + &ProtocolStr, + Aliases, + WS2_INTERNAL_MAX_ALIAS ) && + (htons(atoi( PortNumberStr )) == port ) && + (proto ? !strcmp( ProtocolStr, proto ) : TRUE) ) { + + WS_DbgPrint(MAX_TRACE,("Found the port entry.\n")); + + Found = TRUE; + SizeNeeded = sizeof(WINSOCK_GETSERVBYPORT_CACHE) + + (NextLine - ThisLine); + break; + } + + /* Get rid of everything we read so far */ + while( NextLine <= ServiceDBData + ValidData && + isspace( *NextLine ) ) NextLine++; + + WS_DbgPrint(MAX_TRACE,("About to move %d chars\n", + ServiceDBData + ValidData - NextLine)); + + memmove( ServiceDBData, NextLine, + ServiceDBData + ValidData - NextLine ); + ValidData -= NextLine - ServiceDBData; + WS_DbgPrint(MAX_TRACE,("Valid bytes: %d\n", ValidData)); + } + + /* This we'll do no matter what */ + CloseHandle( ServicesFile ); + + if( !Found ) { + WS_DbgPrint(MAX_TRACE,("Not found\n")); + WSASetLastError( WSANO_DATA ); + return NULL; + } + + if( !p->Getservbyport || p->Getservbyport->Size < SizeNeeded ) { + /* Free previous getservbyport buffer, allocate bigger */ + if( p->Getservbyport ) + HeapFree(GlobalHeap, 0, p->Getservbyport); + p->Getservbyport = HeapAlloc(GlobalHeap, 0, SizeNeeded); + if( !p->Getservbyport ) { + WS_DbgPrint(MIN_TRACE,("Couldn't allocate %d bytes\n", + SizeNeeded)); + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + p->Getservbyport->Size = SizeNeeded; + } + /* Copy the data */ + memmove( p->Getservbyport->Data, + ThisLine, + NextLine - ThisLine ); + + ADJ_PTR(PortNumberStr,ThisLine,p->Getservbyport->Data); + ADJ_PTR(ProtocolStr,ThisLine,p->Getservbyport->Data); + WS_DbgPrint(MAX_TRACE, + ("Port Number: %s, Protocol: %s\n", PortNumberStr, ProtocolStr)); + + for( i = 0; Aliases[i]; i++ ) { + ADJ_PTR(Aliases[i],ThisLine,p->Getservbyport->Data); + WS_DbgPrint(MAX_TRACE,("Aliases %d: %s\n", i, Aliases[i])); + } + + memcpy(p->Getservbyport,Aliases,sizeof(Aliases)); + + /* Create the struct proper */ + p->Getservbyport->ServerEntry.s_name = ServiceName; + p->Getservbyport->ServerEntry.s_aliases = p->Getservbyport->Aliases; + p->Getservbyport->ServerEntry.s_port = port; + p->Getservbyport->ServerEntry.s_proto = ProtocolStr; + + WS_DbgPrint(MID_TRACE,("s_name: %s\n", ServiceName)); + + return &p->Getservbyport->ServerEntry; - return (LPSERVENT)NULL; } diff --git a/reactos/lib/ws2_32/misc/upcall.c b/reactos/lib/ws2_32/misc/upcall.c index 4264206930a..cfcf804dac3 100644 --- a/reactos/lib/ws2_32/misc/upcall.c +++ b/reactos/lib/ws2_32/misc/upcall.c @@ -131,7 +131,7 @@ WPUModifyIFSHandle( PCATALOG_ENTRY Provider; SOCKET Socket; - WS_DbgPrint(MAX_TRACE, ("dwCatalogEntryId (%d) ProposedHandle (0x%X).\n", + WS_DbgPrint(MID_TRACE, ("dwCatalogEntryId (%d) ProposedHandle (0x%X).\n", dwCatalogEntryId, ProposedHandle)); Provider = LocateProviderById(dwCatalogEntryId); From e6f5d067e0719429a9dcc83d985b7246a6c2047f Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Thu, 15 Jul 2004 03:21:47 +0000 Subject: [PATCH 299/356] oskittcp: fixed handling of uio in send. afd: fixed send. tcpip: fixed double-complete of send irp. svn path=/trunk/; revision=10122 --- reactos/drivers/lib/oskittcp/oskittcp/interface.c | 2 ++ reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c | 4 ++++ reactos/drivers/net/tcpip/tcpip/irp.c | 2 ++ reactos/drivers/net/tcpip/tcpip/main.c | 7 ++++++- reactos/drivers/net/tcpip/transport/tcp/tcp.c | 2 +- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/lib/oskittcp/oskittcp/interface.c b/reactos/drivers/lib/oskittcp/oskittcp/interface.c index b4fc0baea62..f37494d9faf 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/interface.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/interface.c @@ -207,9 +207,11 @@ int OskitTCPSend( void *socket, OSK_PCHAR Data, OSK_UINT Len, struct uio uio = { 0 }; int error = 0; OskitDumpBuffer( Data, Len ); + uio.uio_resid = Len; mb.m_data = Data; mb.m_len = Len; error = sosend( socket, NULL, &uio, (struct mbuf *)&mb, NULL, 0 ); + printf("uio.uio_resid = %d\n", uio.uio_resid); *OutLen = uio.uio_resid; return error; } diff --git a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c index b90b95bdf5f..1320b84268b 100644 --- a/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c +++ b/reactos/drivers/lib/oskittcp/oskittcp/uipc_socket.c @@ -440,8 +440,12 @@ nopages: MH_ALIGN(m, len); } space -= len; +#ifndef __REACTOS__ error = uiomove(mtod(m, caddr_t), (int)len, uio); resid = uio->uio_resid; +#else + resid = 0; +#endif m->m_len = len; *mp = m; top->m_pkthdr.len += len; diff --git a/reactos/drivers/net/tcpip/tcpip/irp.c b/reactos/drivers/net/tcpip/tcpip/irp.c index a19e10fabc2..101d89ad38c 100644 --- a/reactos/drivers/net/tcpip/tcpip/irp.c +++ b/reactos/drivers/net/tcpip/tcpip/irp.c @@ -16,6 +16,8 @@ #include NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) { + TI_DbgPrint(MID_TRACE,("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent)); + IoSetCancelRoutine( Irp, NULL ); if( Status == STATUS_PENDING ) diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index e7d4ee3f5de..6a29849489b 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -488,6 +488,7 @@ TiDispatchInternal( */ { NTSTATUS Status; + BOOL Complete = TRUE; PIO_STACK_LOCATION IrpSp; IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -509,6 +510,7 @@ TiDispatchInternal( case TDI_SEND: Status = DispTdiSend(Irp); + Complete = FALSE; /* Completed in DispTdiSend */ break; case TDI_SEND_DATAGRAM: @@ -562,7 +564,10 @@ TiDispatchInternal( TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status)); - return IRPFinish( Irp, Status ); + if( Complete ) + IRPFinish( Irp, Status ); + + return Status; } diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index 71745bfef3e..664685d1c23 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -290,7 +290,7 @@ NTSTATUS TCPSendData Connection->SocketContext)); Status = OskitTCPSend( Connection->SocketContext, - BufferData, PacketSize, (OSK_UINT *)DataUsed, 0 ); + BufferData, PacketSize, DataUsed, 0 ); KeReleaseSpinLock(&Connection->Lock, OldIrql); From b1fb96b44c98ba12c80d13079a0d1c20f7507e7a Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 15 Jul 2004 04:04:08 +0000 Subject: [PATCH 300/356] Clear Partition0 DriveNotReady, for Removable Media. svn path=/trunk/; revision=10124 --- reactos/drivers/storage/disk/disk.c | 31 ++++++++++------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 5a529d7b58d..b128c699402 100644 --- a/reactos/drivers/storage/disk/disk.c +++ b/reactos/drivers/storage/disk/disk.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: disk.c,v 1.45 2004/07/13 02:43:06 jimtabor Exp $ +/* $Id: disk.c,v 1.46 2004/07/15 04:04:08 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -850,8 +850,8 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, IN PIRP Irp) { PDRIVE_LAYOUT_INFORMATION PartitionList = NULL; - PDEVICE_EXTENSION DiskDeviceExtension; - PDISK_DATA DiskData; + PDEVICE_EXTENSION DiskDeviceExtension, DDE; + PDISK_DATA DiskData, DD; PPARTITION_INFORMATION PartitionEntry; ULONG PartitionNumber; NTSTATUS Status; @@ -861,6 +861,12 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension; DiskData = (PDISK_DATA)(DiskDeviceExtension + 1); + DDE = (PDEVICE_EXTENSION) DiskDeviceExtension->PhysicalDevice->DeviceExtension; + DD = (PDISK_DATA)(DDE +1); + + /* Clear flag for Partition0, just incase it was set. */ + DD->DriveNotReady = FALSE; + Status = ScsiClassReadDriveCapacity(DiskDeviceObject); if (!NT_SUCCESS(Status)) { @@ -870,25 +876,8 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject, return Status; } -/* - A previous partition table may exist for this Device Object. - We will need to delete this data and force a rebuild. - */ - if(DiskDeviceExtension->StartingOffset.QuadPart) - { - DPRINT("Partition already installed!\n"); - DiskData->PartitionType = 0; - DiskData->PartitionNumber = 0; - DiskData->PartitionOrdinal = 0; - DiskData->HiddenSectors = 0; - DiskData->BootIndicator = 0; - DiskData->DriveNotReady = FALSE; - DiskDeviceExtension->StartingOffset.QuadPart = 0; - DiskDeviceExtension->PartitionLength.QuadPart = 0; - } - /* Read partition table */ - Status = IoReadPartitionTable(DiskDeviceObject, + Status = IoReadPartitionTable(DiskDeviceExtension->PhysicalDevice, DiskDeviceExtension->DiskGeometry->BytesPerSector, TRUE, &PartitionList); From 64b9c0f3cc7d3773b517e792e627930371ecdded Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 15 Jul 2004 08:15:49 +0000 Subject: [PATCH 301/356] Implement RtlAddAuditAccessAceEx(). svn path=/trunk/; revision=10125 --- reactos/include/ntdll/rtl.h | 11 +++++- reactos/lib/ntdll/def/ntdll.def | 3 +- reactos/lib/ntdll/def/ntdll.edf | 3 +- reactos/lib/rtl/acl.c | 69 +++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/reactos/include/ntdll/rtl.h b/reactos/include/ntdll/rtl.h index 7d9895e9a63..7a516483450 100644 --- a/reactos/include/ntdll/rtl.h +++ b/reactos/include/ntdll/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.45 2004/07/08 22:05:48 gvg Exp $ +/* $Id: rtl.h,v 1.46 2004/07/15 08:15:49 ekohl Exp $ * */ @@ -131,6 +131,15 @@ RtlAddAccessDeniedAceEx (IN OUT PACL Acl, IN ACCESS_MASK AccessMask, IN PSID Sid); +NTSTATUS STDCALL +RtlAddAuditAccessAceEx(IN OUT PACL Acl, + IN ULONG Revision, + IN ULONG Flags, + IN ACCESS_MASK AccessMask, + IN PSID Sid, + IN BOOLEAN Success, + IN BOOLEAN Failure); + VOID STDCALL RtlDeleteCriticalSection (PCRITICAL_SECTION CriticalSection); diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index eabbc65de8a..1b64289a368 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.124 2004/07/08 00:40:30 weiden Exp $ +; $Id: ntdll.def,v 1.125 2004/07/15 08:15:20 ekohl Exp $ ; ; ReactOS Operating System ; @@ -294,6 +294,7 @@ RtlAddAce@20 RtlAddAtomToAtomTable@12 ;RtlAddAttributeActionToRXact RtlAddAuditAccessAce@24 +RtlAddAuditAccessAceEx@28 ;RtlAddCompoundAce RtlAddRange@36 RtlAdjustPrivilege@16 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index ebfbc5a1778..356d63b8006 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.114 2004/07/08 00:40:30 weiden Exp $ +; $Id: ntdll.edf,v 1.115 2004/07/15 08:15:21 ekohl Exp $ ; ; ReactOS Operating System ; @@ -294,6 +294,7 @@ RtlAddAce=RtlAddAce@20 RtlAddAtomToAtomTable=RtlAddAtomToAtomTable@12 ;RtlAddAttributeActionToRXact RtlAddAuditAccessAce=RtlAddAuditAccessAce@24 +RtlAddAuditAccessAceEx=RtlAddAuditAccessAceEx@28 ;RtlAddCompoundAce RtlAddRange=RtlAddRange@36 RtlAdjustPrivilege=RtlAdjustPrivilege@16 diff --git a/reactos/lib/rtl/acl.c b/reactos/lib/rtl/acl.c index 1e27a2ed000..c401def39b7 100644 --- a/reactos/lib/rtl/acl.c +++ b/reactos/lib/rtl/acl.c @@ -395,6 +395,75 @@ RtlAddAuditAccessAce(PACL Acl, } +/* + * @implemented + */ +NTSTATUS STDCALL +RtlAddAuditAccessAceEx(PACL Acl, + ULONG Revision, + ULONG Flags, + ACCESS_MASK AccessMask, + PSID Sid, + BOOLEAN Success, + BOOLEAN Failure) +{ + PACE Ace; + + if (Success != FALSE) + { + Flags |= SUCCESSFUL_ACCESS_ACE_FLAG; + } + + if (Failure != FALSE) + { + Flags |= FAILED_ACCESS_ACE_FLAG; + } + + if (!RtlValidSid(Sid)) + { + return STATUS_INVALID_SID; + } + + if (Acl->AclRevision > MAX_ACL_REVISION || + Revision > MAX_ACL_REVISION) + { + return STATUS_REVISION_MISMATCH; + } + + if (Revision < Acl->AclRevision) + { + Revision = Acl->AclRevision; + } + + if (!RtlFirstFreeAce(Acl, &Ace)) + { + return STATUS_INVALID_ACL; + } + + if (Ace == NULL) + { + return STATUS_ALLOTTED_SPACE_EXCEEDED; + } + + if (((PVOID)Ace + RtlLengthSid(Sid) + sizeof(ACE)) >= ((PVOID)Acl + Acl->AclSize)) + { + return STATUS_ALLOTTED_SPACE_EXCEEDED; + } + + Ace->Header.AceFlags = Flags; + Ace->Header.AceType = SYSTEM_AUDIT_ACE_TYPE; + Ace->Header.AceSize = RtlLengthSid(Sid) + sizeof(ACE); + Ace->AccessMask = AccessMask; + RtlCopySid(RtlLengthSid(Sid), + (PSID)(Ace + 1), + Sid); + Acl->AceCount++; + Acl->AclRevision = Revision; + + return STATUS_SUCCESS; +} + + static VOID RtlpDeleteData(PVOID Ace, ULONG AceSize, From 3281baa0bf174e07fe46c25c3ba9e1e80e88e01a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 15 Jul 2004 18:13:22 +0000 Subject: [PATCH 302/356] - Minor correction to DIB_32BPP_BitBlt that I broke with my last patch. svn path=/trunk/; revision=10126 --- reactos/subsys/win32k/dib/dib32bpp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 7b9d490698b..95f74dfa9cd 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dib32bpp.c,v 1.30 2004/07/14 20:48:56 navaraf Exp $ */ +/* $Id: dib32bpp.c,v 1.31 2004/07/15 18:13:22 navaraf Exp $ */ #include VOID @@ -344,7 +344,7 @@ DIB_32BPP_BitBlt(PBLTINFO BltInfo) } DestBits = (PULONG)( (ULONG_PTR)DestBits - - ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 2) - + ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 2) + BltInfo->DestSurface->lDelta); } From 4fd7ec5f638dc18974f95d1fd3cba425b7d780ac Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Thu, 15 Jul 2004 20:43:18 +0000 Subject: [PATCH 303/356] replace BUFFER_LEN by dynamic allocations svn path=/trunk/; revision=10132 --- .../system/explorer/utility/xmlstorage.cpp | 4 +- .../system/explorer/utility/xmlstorage.h | 63 +++++++++++++------ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp index da863514833..cd18cb7a3a8 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp +++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp @@ -238,7 +238,7 @@ std::string XMLReaderBase::get_error_string() const std::string EncodeXMLString(LPCTSTR s) { - TCHAR buffer[BUFFER_LEN]; + LPTSTR buffer = (LPTSTR)alloca(5*sizeof(TCHAR)*_tcslen(s)); // worst case. "&" LPTSTR o = buffer; for(LPCTSTR p=s; *p; ++p) @@ -264,7 +264,7 @@ std::string EncodeXMLString(LPCTSTR s) String DecodeXMLString(LPCTSTR s) { - TCHAR buffer[BUFFER_LEN]; + LPTSTR buffer = (LPTSTR)alloca(sizeof(TCHAR)*_tcslen(s)); LPTSTR o = buffer; for(LPCTSTR p=s; *p; ++p) diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h index 686e6b30515..57f96b13a41 100644 --- a/reactos/subsys/system/explorer/utility/xmlstorage.h +++ b/reactos/subsys/system/explorer/utility/xmlstorage.h @@ -50,6 +50,7 @@ #define _UNICODE #endif #include +#include #include #include @@ -95,15 +96,15 @@ struct String String(LPCSTR s, int l) {assign(s, l);} String(const std::string& other) {assign(other.c_str());} String& operator=(LPCSTR s) {assign(s); return *this;} - void assign(LPCSTR s) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1);} else erase();} - void assign(LPCSTR s, int l) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, BUFFER_LEN));} else erase();} + void assign(LPCSTR s) {if (s) {int bl=strlen(s); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, bl, b, bl));} else erase();} + void assign(LPCSTR s, int l) {if (s) {int bl=l; LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, bl));} else erase();} #else String(LPCWSTR s) {assign(s);} String(LPCWSTR s, int l) {assign(s, l);} String(const std::wstring& other) {assign(other.c_str());} String& operator=(LPCWSTR s) {assign(s); return *this;} - void assign(LPCWSTR s) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, -1, b, BUFFER_LEN, 0, 0)-1);} else erase();} - void assign(LPCWSTR s, int l) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();} + void assign(LPCWSTR s) {if (s) {int bl=wcslen(s); LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, bl, b, bl, 0, 0));} else erase();} + void assign(LPCWSTR s, int l) {int bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, bl, 0, 0));} else erase();} #endif String& operator=(LPCTSTR s) {if (s) super::assign(s); else erase(); return *this;} @@ -114,9 +115,9 @@ struct String operator LPCTSTR() const {return c_str();} #ifdef UNICODE - operator std::string() const {char b[BUFFER_LEN]; return std::string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0)-1);} + operator std::string() const {int bl=length(); LPSTR b=(LPSTR)alloca(bl); return std::string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), bl, b, bl, 0, 0));} #else - operator std::wstring() const {WCHAR b[BUFFER_LEN]; return std::wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);} + operator std::wstring() const {int bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), bl, b, bl));} #endif String& printf(LPCTSTR fmt, ...) @@ -167,15 +168,17 @@ struct String inline void assign_utf8(String& s, const char* str) { - TCHAR buffer[BUFFER_LEN]; + int lutf8 = strlen(str); #ifdef UNICODE - int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, buffer, BUFFER_LEN) - 1; + LPTSTR buffer = (LPTSTR)alloca(lutf8); + int l = MultiByteToWideChar(CP_UTF8, 0, str, lutf8, buffer, lutf8); #else - WCHAR wbuffer[BUFFER_LEN]; + LPWSTR wbuffer = (LPWSTR)alloca(sizeof(WCHAR)*lutf8); + int l = MultiByteToWideChar(CP_UTF8, 0, str, lutf8, wbuffer, lutf8); - int l = MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuffer, BUFFER_LEN) - 1; - l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); + int bl=2*l; LPSTR buffer = (LPSTR)alloca(bl); + l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, bl, 0, 0); #endif s.assign(buffer, l); @@ -183,15 +186,15 @@ inline void assign_utf8(String& s, const char* str) inline std::string get_utf8(LPCTSTR s, int l) { - char buffer[BUFFER_LEN]; - #ifdef UNICODE - l = WideCharToMultiByte(CP_UTF8, 0, s, l, buffer, BUFFER_LEN, 0, 0); + LPSTR buffer = (LPSTR)alloca(l); + l = WideCharToMultiByte(CP_UTF8, 0, s, l, buffer, l, 0, 0); #else - WCHAR wbuffer[BUFFER_LEN]; + LPWSTR wbuffer = (LPWSTR)alloca(sizeof(WCHAR)*l); + l = MultiByteToWideChar(CP_ACP, 0, s, l, wbuffer, l); - l = MultiByteToWideChar(CP_ACP, 0, s, l, wbuffer, BUFFER_LEN); - l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, l, buffer, BUFFER_LEN, 0, 0); + int bl=2*l; LPSTR buffer = (LPSTR)alloca(bl); + l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, l, buffer, bl, 0, 0); #endif return std::string(buffer, l); @@ -1282,6 +1285,11 @@ struct XMLString return _value; } + const String& c_str() const + { + return _value; + } + protected: String _value; @@ -1320,6 +1328,25 @@ protected: }; +template + inline void read_option(T& var, const_XMLPos& cfg, LPCTSTR key) + { + const String& val = cfg.get(key); + + if (!val.empty()) + var = val; + } + +template<> + inline void read_option(int& var, const_XMLPos& cfg, LPCTSTR key) + { + const String& val = cfg.get(key); + + if (!val.empty()) + var = _ttoi(val); + } + + #ifdef _MSC_VER #pragma warning(disable: 4355) #endif @@ -1392,7 +1419,7 @@ struct XMLReader : public XMLReaderBase if (!_in.good()) return -1; - _in.read(buffer, BUFFER_LEN); + _in.read(buffer, len); return _in.gcount(); } From e7d21fa39eb38532a6810edc80c0905dbbd51609 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Thu, 15 Jul 2004 21:04:02 +0000 Subject: [PATCH 304/356] ignore unexpected exceptions while extracting icons svn path=/trunk/; revision=10133 --- reactos/subsys/system/explorer/shell/shellfs.cpp | 12 ++++++++++-- reactos/subsys/system/explorer/taskbar/startmenu.cpp | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index 9fb227483b3..ca849de618e 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -306,7 +306,11 @@ void ShellDirectory::read_directory(int scan_flags) if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) entry->_icon_id = ICID_FOLDER; else if (scan_flags & SCAN_EXTRACT_ICONS) - entry->extract_icon(); + try { + entry->extract_icon(); + } catch(COMException&) { + // ignore unexpected exceptions while extracting icons + } last = entry; } while(FindNextFile(hFind, &w32fd)); @@ -408,7 +412,11 @@ void ShellDirectory::read_directory(int scan_flags) if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || !(attribs & SFGAO_FILESYSTEM)) { if (scan_flags & SCAN_EXTRACT_ICONS) - entry->extract_icon(); + try { + entry->extract_icon(); + } catch(COMException&) { + // ignore unexpected exceptions while extracting icons + } } else if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) entry->_icon_id = ICID_FOLDER; else diff --git a/reactos/subsys/system/explorer/taskbar/startmenu.cpp b/reactos/subsys/system/explorer/taskbar/startmenu.cpp index f4a9da2de3a..7ffef196dae 100644 --- a/reactos/subsys/system/explorer/taskbar/startmenu.cpp +++ b/reactos/subsys/system/explorer/taskbar/startmenu.cpp @@ -153,7 +153,7 @@ HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndP } -LRESULT StartMenu::Init(LPCREATESTRUCT pcs) +LRESULT StartMenu::Init(LPCREATESTRUCT pcs) { try { AddEntries(); From 3ab4ec1f54dea271d3a16c8b27f00add8624d890 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 15 Jul 2004 21:14:51 +0000 Subject: [PATCH 305/356] - Handle indexed palettes in IntEngCreateSrcMonoXlate. svn path=/trunk/; revision=10135 --- reactos/subsys/win32k/eng/xlate.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/win32k/eng/xlate.c b/reactos/subsys/win32k/eng/xlate.c index e69938e03b3..5824aded274 100644 --- a/reactos/subsys/win32k/eng/xlate.c +++ b/reactos/subsys/win32k/eng/xlate.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: xlate.c,v 1.41 2004/07/14 20:48:57 navaraf Exp $ +/* $Id: xlate.c,v 1.42 2004/07/15 21:14:51 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -375,6 +375,20 @@ IntEngCreateSrcMonoXlate(HPALETTE PaletteDest, XlateGDI->translationTable[0] = ShiftAndMask(XlateGDI, BackgroundColor); XlateGDI->translationTable[1] = ShiftAndMask(XlateGDI, ForegroundColor); + if (XlateObj->iDstType == PAL_INDEXED) + { + XlateGDI->translationTable[0] = + ClosestColorMatch(XlateGDI, + (LPPALETTEENTRY)&XlateGDI->translationTable[0], + DestPalGDI->IndexedColors, + DestPalGDI->NumColors); + XlateGDI->translationTable[1] = + ClosestColorMatch(XlateGDI, + (LPPALETTEENTRY)&XlateGDI->translationTable[1], + DestPalGDI->IndexedColors, + DestPalGDI->NumColors); + } + PALETTE_UnlockPalette(PaletteDest); return XlateObj; From 28e3667b69c0cc787ae0c6489a7efc7c669cb5ce Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Fri, 16 Jul 2004 13:45:02 +0000 Subject: [PATCH 306/356] Fixed prototypes to work in MSVC. svn path=/trunk/; revision=10139 --- reactos/include/ddk/fsfuncs.h | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/reactos/include/ddk/fsfuncs.h b/reactos/include/ddk/fsfuncs.h index 9a3fd3fbcfe..9dcd252badc 100644 --- a/reactos/include/ddk/fsfuncs.h +++ b/reactos/include/ddk/fsfuncs.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_DDK_FSFUNCS_H #define __INCLUDE_DDK_FSFUNCS_H -/* $Id: fsfuncs.h,v 1.25 2004/06/27 11:23:57 navaraf Exp $ */ +/* $Id: fsfuncs.h,v 1.26 2004/07/16 13:45:02 ion Exp $ */ #define FlagOn(x,f) ((x) & (f)) #include @@ -58,8 +58,8 @@ FsRtlFreeFileLock( IN PFILE_LOCK FileLock ); -STDCALL VOID +STDCALL FsRtlAcquireFileExclusive ( IN PFILE_OBJECT FileObject ); @@ -348,15 +348,15 @@ FsRtlInitializeTunnelCache ( IN PTUNNEL Cache ); -STDCALL NTSTATUS +STDCALL FsRtlInsertPerFileObjectContext ( IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext, IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr ); -STDCALL NTSTATUS +STDCALL FsRtlInsertPerStreamContext ( IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, IN PFSRTL_PER_STREAM_CONTEXT Ptr @@ -425,8 +425,8 @@ BOOLEAN STDCALL FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb, OUT PLONGLONG Vbn, OUT PLONGLONG Lbn); -STDCALL BOOLEAN +STDCALL FsRtlLookupLastLargeMcbEntryAndIndex ( IN PLARGE_MCB OpaqueMcb, OUT PLONGLONG LargeVbn, @@ -444,16 +444,17 @@ FsRtlLookupMcbEntry (IN PMCB Mcb, OUT PLBN Lbn, OUT PULONG SectorCount OPTIONAL, OUT PULONG Index); -STDCALL + PFSRTL_PER_STREAM_CONTEXT +STDCALL FsRtlLookupPerStreamContextInternal ( IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, IN PVOID OwnerId OPTIONAL, IN PVOID InstanceId OPTIONAL ); -STDCALL PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ +STDCALL FsRtlLookupPerFileObjectContext ( IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, IN PVOID OwnerId OPTIONAL, @@ -534,8 +535,9 @@ BOOLEAN (*PCHECK_FOR_TRAVERSE_ACCESS) ( IN PVOID TargetContext, IN PSECURITY_SUBJECT_CONTEXT SubjectContext ); -STDCALL + VOID +STDCALL FsRtlNotifyFilterChangeDirectory ( IN PNOTIFY_SYNC NotifySync, IN PLIST_ENTRY NotifyList, @@ -550,8 +552,8 @@ FsRtlNotifyFilterChangeDirectory ( IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL ); -STDCALL VOID +STDCALL FsRtlNotifyFilterReportChange ( IN PNOTIFY_SYNC NotifySync, IN PLIST_ENTRY NotifyList, @@ -695,8 +697,8 @@ FsRtlProcessFileLock ( IN PVOID Context OPTIONAL ); -STDCALL NTSTATUS +STDCALL FsRtlRegisterFileSystemFilterCallbacks ( IN PVOID Unknown1, IN PVOID Unknown2 @@ -707,8 +709,8 @@ FsRtlRegisterUncProvider(IN OUT PHANDLE Handle, IN PUNICODE_STRING RedirectorDeviceName, IN BOOLEAN MailslotsSupported); -STDCALL VOID +STDCALL FsRtlReleaseFile ( IN PFILE_OBJECT FileObject ); @@ -723,24 +725,24 @@ FsRtlRemoveMcbEntry (IN PMCB Mcb, IN VBN Vbn, IN ULONG SectorCount); -STDCALL PFSRTL_PER_STREAM_CONTEXT +STDCALL FsRtlRemovePerStreamContext ( IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, IN PVOID Unknown1 OPTIONAL, IN PVOID Unknown2 OPTIONAL ); -STDCALL PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ +STDCALL FsRtlRemovePerFileObjectContext ( IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext, IN PVOID OwnerId OPTIONAL, IN PVOID InstanceId OPTIONAL ); -STDCALL VOID +STDCALL FsRtlResetLargeMcb ( IN PLARGE_MCB Mcb, IN BOOLEAN SelfSynchronized @@ -759,8 +761,8 @@ FsRtlSyncVolumes ( DWORD Unknown2 ); -STDCALL VOID +STDCALL FsRtlTeardownPerStreamContexts ( IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader ); From 243d59c9e64051edd02b205647ccae612ad063cd Mon Sep 17 00:00:00 2001 From: Gregor Anich Date: Fri, 16 Jul 2004 16:16:16 +0000 Subject: [PATCH 307/356] Fix some bugs, works on Windows and ReactOS with Mesa and NVIDIA driver. x86 asm version of gl dispatch functions work now too (in gl.c) svn path=/trunk/; revision=10141 --- reactos/lib/opengl32/gl.c | 24 ++- reactos/lib/opengl32/icdtable.h | 4 +- reactos/lib/opengl32/opengl32.c | 290 ++++++++++++++------------ reactos/lib/opengl32/opengl32.h | 92 +++++---- reactos/lib/opengl32/wgl.c | 355 +++++++++++++++++++++----------- 5 files changed, 474 insertions(+), 291 deletions(-) diff --git a/reactos/lib/opengl32/gl.c b/reactos/lib/opengl32/gl.c index 8c29cc4a150..a568a6395c2 100644 --- a/reactos/lib/opengl32/gl.c +++ b/reactos/lib/opengl32/gl.c @@ -20,7 +20,7 @@ * On other machines we use C to forward the calls (slow...) */ -#define WIN32_LEAN_AND_MEAN +#define WIN32_LEANER_AND_MEANER #include #include "teb.h" @@ -58,13 +58,25 @@ int STDCALL glEmptyFunc56( long l1, long l2, long l3, long l4, long l5, long l11, long l12, long l13, long l14 ) { return 0; } -#if 1//!defined(_M_IX86) +#if defined(_M_IX86) +# define FOO(x) #x +# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ +__asm__(".globl _"#func"@"#stack "\n\t" \ + "_"#func"@"#stack":" "\n\t" \ + " movl %fs:0x18, %eax" "\n\t" \ + " movl 0xbe8(%eax), %eax" "\n\t" \ + " jmp *"FOO((icdidx*4))"(%eax)" "\n\t"); + +GLFUNCS_MACRO +# undef FOO +# undef X +#else /* defined(_M_IX86) */ # define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ ret STDCALL func typeargs \ { \ - PROC *table; \ + PROC *table; \ PROC fn; \ - if (tebidx >= 0) \ + if (tebidx >= 10000) \ { \ table = (PROC *)NtCurrentTeb()->glDispatchTable; \ fn = table[tebidx]; \ @@ -79,7 +91,7 @@ ret STDCALL func typeargs \ GLFUNCS_MACRO -#undef X -#endif//non-x86 architectures +# undef X +#endif /* !defined(_M_IX86) */ /* EOF */ diff --git a/reactos/lib/opengl32/icdtable.h b/reactos/lib/opengl32/icdtable.h index 79506ab9c3e..9c36ae83b55 100644 --- a/reactos/lib/opengl32/icdtable.h +++ b/reactos/lib/opengl32/icdtable.h @@ -14,8 +14,8 @@ enum icdoffsets_e typedef struct tagICDTable { - DWORD num_funcs; /* Normally 336 (0x150) */ - PROC dispatch_table[812]; + DWORD num_funcs; /*!< Normally 336 (0x150) -- the number of functions in OpenGL 1.1 */ + PROC dispatch_table[812]; /*!< Table containing \a num_funcs pointers to OpenGL functions */ } ICDTable, *PICDTable; #endif /* OPENGL32_PRIVATE_ICDTABLE_H */ diff --git a/reactos/lib/opengl32/opengl32.c b/reactos/lib/opengl32/opengl32.c index 4ce8e046d44..1087efc3909 100644 --- a/reactos/lib/opengl32/opengl32.c +++ b/reactos/lib/opengl32/opengl32.c @@ -1,4 +1,4 @@ -/* $Id: opengl32.c,v 1.16 2004/03/01 19:36:20 navaraf Exp $ +/* $Id: opengl32.c,v 1.17 2004/07/16 16:16:16 blight Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,21 +17,65 @@ #include #include "opengl32.h" + /* function prototypes */ -/*static BOOL OPENGL32_LoadDrivers();*/ static void OPENGL32_AppendICD( GLDRIVERDATA *icd ); static void OPENGL32_RemoveICD( GLDRIVERDATA *icd ); static GLDRIVERDATA *OPENGL32_LoadDriver( LPCWSTR regKey ); static DWORD OPENGL32_InitializeDriver( GLDRIVERDATA *icd ); static BOOL OPENGL32_UnloadDriver( GLDRIVERDATA *icd ); +static DWORD OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd ); + /* global vars */ DWORD OPENGL32_tls; GLPROCESSDATA OPENGL32_processdata; -static -void +static BOOL +OPENGL32_ThreadAttach() +{ + GLTHREADDATA* lpData = NULL; + PROC *dispatchTable = NULL; + TEB *teb = NULL; + + dispatchTable = (PROC*)HeapAlloc( GetProcessHeap(), + HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, + sizeof (((ICDTable *)(0))->dispatch_table) ); + if (dispatchTable == NULL) + { + DBGPRINT( "Error: Couldn't allocate GL dispatch table" ); + return FALSE; + } + + lpData = (GLTHREADDATA*)HeapAlloc( GetProcessHeap(), + HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, + sizeof (GLTHREADDATA) ); + if (lpData == NULL) + { + DBGPRINT( "Error: Couldn't allocate GLTHREADDATA" ); + HeapFree( GetProcessHeap(), 0, dispatchTable ); + return FALSE; + } + + teb = NtCurrentTeb(); + + /* initialize dispatch table with empty functions */ + #define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ + dispatchTable[icdidx] = (PROC)glEmptyFunc##stack; \ + if (tebidx >= 0) \ + teb->glDispatchTable[tebidx] = (PVOID)glEmptyFunc##stack; + GLFUNCS_MACRO + #undef X + + teb->glTable = dispatchTable; + TlsSetValue( OPENGL32_tls, lpData ); + + return TRUE; +} + + +static void OPENGL32_ThreadDetach() { /* FIXME - do we need to release some HDC or something? */ @@ -56,8 +100,47 @@ OPENGL32_ThreadDetach() } -static -void +static BOOL +OPENGL32_ProcessAttach() +{ + SECURITY_ATTRIBUTES attrib = { sizeof (SECURITY_ATTRIBUTES), /* nLength */ + NULL, /* lpSecurityDescriptor */ + TRUE /* bInheritHandle */ }; + + OPENGL32_tls = TlsAlloc(); + if (0xFFFFFFFF == OPENGL32_tls) + return FALSE; + + memset( &OPENGL32_processdata, 0, sizeof (OPENGL32_processdata) ); + + /* create driver, glrc & dcdata list mutex */ + OPENGL32_processdata.driver_mutex = CreateMutex( &attrib, FALSE, NULL ); + if (OPENGL32_processdata.driver_mutex == NULL) + { + DBGPRINT( "Error: Couldn't create driver_list mutex (%d)", + GetLastError() ); + return FALSE; + } + OPENGL32_processdata.glrc_mutex = CreateMutex( &attrib, FALSE, NULL ); + if (OPENGL32_processdata.glrc_mutex == NULL) + { + DBGPRINT( "Error: Couldn't create glrc_list mutex (%d)", + GetLastError() ); + return FALSE; + } + OPENGL32_processdata.dcdata_mutex = CreateMutex( &attrib, FALSE, NULL ); + if (OPENGL32_processdata.dcdata_mutex == NULL) + { + DBGPRINT( "Error: Couldn't create dcdata_list mutex (%d)", + GetLastError() ); + return FALSE; + } + + return TRUE; +} + + +static void OPENGL32_ProcessDetach() { GLDRIVERDATA *icd, *icd2; @@ -106,17 +189,9 @@ OPENGL32_ProcessDetach() } -BOOL -WINAPI +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) { - GLTHREADDATA* lpData = NULL; - PROC *dispatchTable = NULL; - TEB *teb = NULL; - SECURITY_ATTRIBUTES attrib = { sizeof (SECURITY_ATTRIBUTES), /* nLength */ - NULL, /* lpSecurityDescriptor */ - TRUE /* bInheritHandle */ }; - DBGPRINT( "Info: Called!" ); switch ( Reason ) { @@ -125,71 +200,15 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) */ case DLL_PROCESS_ATTACH: DBGTRACE( "Process attach" ); - OPENGL32_tls = TlsAlloc(); - if ( 0xFFFFFFFF == OPENGL32_tls ) + if (!OPENGL32_ProcessAttach()) return FALSE; - - memset( &OPENGL32_processdata, 0, sizeof (OPENGL32_processdata) ); - - /* create driver, glrc & dcdata list mutex */ - OPENGL32_processdata.driver_mutex = CreateMutex( &attrib, FALSE, NULL ); - if (OPENGL32_processdata.driver_mutex == NULL) - { - DBGPRINT( "Error: Couldn't create driver_list mutex (%d)", - GetLastError() ); - return FALSE; - } - OPENGL32_processdata.glrc_mutex = CreateMutex( &attrib, FALSE, NULL ); - if (OPENGL32_processdata.glrc_mutex == NULL) - { - DBGPRINT( "Error: Couldn't create glrc_list mutex (%d)", - GetLastError() ); - return FALSE; - } - OPENGL32_processdata.dcdata_mutex = CreateMutex( &attrib, FALSE, NULL ); - if (OPENGL32_processdata.dcdata_mutex == NULL) - { - DBGPRINT( "Error: Couldn't create dcdata_list mutex (%d)", - GetLastError() ); - return FALSE; - } - /* No break: Initialize the index for first thread. */ /* The attached process creates a new thread. */ case DLL_THREAD_ATTACH: DBGTRACE( "Thread attach" ); - dispatchTable = (PROC*)HeapAlloc( GetProcessHeap(), - HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, - sizeof (((ICDTable *)(0))->dispatch_table) ); - if (dispatchTable == NULL) - { - DBGPRINT( "Error: Couldn't allocate GL dispatch table" ); + if (!OPENGL32_ThreadAttach()) return FALSE; - } - - lpData = (GLTHREADDATA*)HeapAlloc( GetProcessHeap(), - HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, - sizeof (GLTHREADDATA) ); - if (lpData == NULL) - { - DBGPRINT( "Error: Couldn't allocate GLTHREADDATA" ); - HeapFree( GetProcessHeap(), 0, dispatchTable ); - return FALSE; - } - - teb = NtCurrentTeb(); - - /* initialize dispatch table with empty functions */ - #define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ - dispatchTable[icdidx] = (PROC)glEmptyFunc##stack; \ - if (tebidx >= 0) \ - teb->glDispatchTable[tebidx] = (PVOID)glEmptyFunc##stack; - GLFUNCS_MACRO - #undef X - - teb->glTable = dispatchTable; - TlsSetValue( OPENGL32_tls, lpData ); break; /* The thread of the attached process terminates. */ @@ -206,16 +225,18 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) OPENGL32_ProcessDetach(); break; } + return TRUE; } -/* FUNCTION: Append ICD to linked list. - * ARGUMENTS: [IN] icd: GLDRIVERDATA to append to list - * NOTES: Only call this when you hold the driver_mutex +/*! \brief Append ICD to linked list. + * + * \param icd GLDRIVERDATA to append to list + * + * \note Only call this when you hold the driver_mutex. */ -static -void +static void OPENGL32_AppendICD( GLDRIVERDATA *icd ) { if (OPENGL32_processdata.driver_list == NULL) @@ -230,12 +251,13 @@ OPENGL32_AppendICD( GLDRIVERDATA *icd ) } -/* FUNCTION: Remove ICD from linked list. - * ARGUMENTS: [IN] icd: GLDRIVERDATA to remove from list - * NOTES: Only call this when you hold the driver_mutex +/*! \brief Remove ICD from linked list. + * + * \param icd GLDRIVERDATA to remove from list + * + * \note Only call this when you hold the driver_mutex. */ -static -void +static void OPENGL32_RemoveICD( GLDRIVERDATA *icd ) { if (icd == OPENGL32_processdata.driver_list) @@ -257,14 +279,16 @@ OPENGL32_RemoveICD( GLDRIVERDATA *icd ) } -/* FUNCTION: Load an ICD. - * ARGUMENTS: [IN] driver: Name of display driver. - * RETURNS: error code; ERROR_SUCCESS on success +/*! \brief Load an ICD. * - * TODO: call SetLastError() where appropriate + * \param driver Name of installable client driver. + * + * \return Pointer to an allocated GLDRIVERDATA struct. + * \retval NULL Failure. + * + * \todo Call SetLastError() where appropriate. */ -static -GLDRIVERDATA* +static GLDRIVERDATA * OPENGL32_LoadDriver( LPCWSTR driver ) { LONG ret; @@ -316,10 +340,12 @@ OPENGL32_LoadDriver( LPCWSTR driver ) } -/* FUNCTION: Initialize a driver (Load DLL, DrvXXX and glXXX procs) - * ARGUMENTS: [IN] icd: ICD to initialize with the dll, version, driverVersion - * and flags already filled. - * RETURNS: error code; ERROR_SUCCESS on success +/*! \brief Initialize a driver (Load DLL and DrvXxx procs) + * + * \param icd ICD to initialize with the dll, version, driverVersion + * and flags already filled. + * \return Error code. + * \retval ERROR_SUCCESS Success */ #define LOAD_DRV_PROC( icd, proc, required ) \ *(char**)&icd->proc = (char*)GetProcAddress( icd->handle, #proc ); \ @@ -329,8 +355,7 @@ OPENGL32_LoadDriver( LPCWSTR driver ) return GetLastError(); \ } -static -DWORD +static DWORD OPENGL32_InitializeDriver( GLDRIVERDATA *icd ) { /* check version */ @@ -394,11 +419,12 @@ OPENGL32_InitializeDriver( GLDRIVERDATA *icd ) } -/* FUNCTION: Unload loaded ICD. - * RETURNS: TRUE on success, FALSE otherwise. +/*! \brief Unload ICD. + * + * \retval TRUE Success. + * \retval FALSE Failure. */ -static -BOOL +static BOOL OPENGL32_UnloadDriver( GLDRIVERDATA *icd ) { BOOL allOk = TRUE; @@ -428,11 +454,13 @@ OPENGL32_UnloadDriver( GLDRIVERDATA *icd ) } -/* FUNCTION: Load ICD (shared ICD data) - * RETURNS: GLDRIVERDATA pointer on success, NULL otherwise. +/*! \brief Load ICD (shared ICD data) + * + * \return Pointer to an allocated GLDRIVERDATA on success. + * \retval NULL Failure. */ -GLDRIVERDATA* -OPENGL32_LoadICD ( LPCWSTR driver ) +GLDRIVERDATA * +OPENGL32_LoadICD( LPCWSTR driver ) { GLDRIVERDATA *icd; @@ -472,8 +500,10 @@ OPENGL32_LoadICD ( LPCWSTR driver ) } -/* FUNCTION: Unload ICD (shared ICD data) - * RETURNS: TRUE on success, FALSE otherwise. +/*! \brief Unload ICD (shared ICD data) + * + * \retval TRUE Success. + * \retval FALSE Failure. */ BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd ) @@ -489,8 +519,8 @@ OPENGL32_UnloadICD( GLDRIVERDATA *icd ) } icd->refcount--; - //if (icd->refcount == 0) - if (0) + if (icd->refcount == 0) +// if (0) ret = OPENGL32_UnloadDriver( icd ); /* FIXME: InitializeICD crashes when called a second time */ @@ -502,21 +532,24 @@ OPENGL32_UnloadICD( GLDRIVERDATA *icd ) } -/* FUNCTION: Enumerate OpenGLDrivers (from registry) - * ARGUMENTS: [IN] idx Index of the driver to get information about - * [OUT] name Pointer to an array of WCHARs (can be NULL) - * [I,O] cName Pointer to a DWORD. Input is len of name array; - * Output is length of the drivername. - * Can be NULL if name is NULL. - * RETURNS: Error code (ERROR_NO_MORE_ITEMS at end of list); On failure all - * OUT vars are left untouched. +/*! \brief Enumerate OpenGLDrivers (from registry) + * + * \param idx Index of the driver to get information about. + * \param name Pointer to an array of WCHARs (can be NULL) + * \param cName Pointer to a DWORD. Input is len of name array. + * Output is length of the drivername. + * Can be NULL if name is NULL. + * + * \return Error code + * \retval ERROR_NO_MORE_ITEMS End of driver list. + * \retval ERROR_SUCCESS Success. */ +#if 0 /* unused */ DWORD OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName ) { HKEY hKey; - LPCWSTR subKey = - L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\OpenGLDrivers\\"; + LPCWSTR subKey = OPENGL_DRIVERS_SUBKEY; LONG ret; DWORD size; WCHAR driver[256]; @@ -550,22 +583,25 @@ OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName ) RegCloseKey( hKey ); return ERROR_SUCCESS; } +#endif /* 0 -- unused */ -/* FUNCTION: Get registry values for a driver given a name - * ARGUMENTS: [IN] idx Index of the driver to get information about - * [OUT] icd Pointer to GLDRIVERDATA. On success the following - * fields are filled: driver_name, dll, version, - * driver_version and flags. - * RETURNS: Error code; On failure all OUT vars are left untouched. +/*! \brief Get registry values for a driver given a name. + * + * \param driver Name of the driver to get information about. + * \param icd Pointer to GLDRIVERDATA. + * + * \return Error code. + * \retval ERROR_SUCCESS Success. + * + * \note On success the following fields of \a icd are filled: \a driver_name, + * \a dll, \a version, \a driver_version and \a flags. */ -/*static*/ -DWORD +static DWORD OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd ) { HKEY hKey; - WCHAR subKey[1024] = - L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\OpenGLDrivers\\"; + WCHAR subKey[1024] = OPENGL_DRIVERS_SUBKEY; LONG ret; DWORD type, size; diff --git a/reactos/lib/opengl32/opengl32.h b/reactos/lib/opengl32/opengl32.h index 808aa88a8c7..c531b7d3c8a 100644 --- a/reactos/lib/opengl32/opengl32.h +++ b/reactos/lib/opengl32/opengl32.h @@ -1,4 +1,4 @@ -/* $Id: opengl32.h,v 1.15 2004/03/01 19:36:21 navaraf Exp $ +/* $Id: opengl32.h,v 1.16 2004/07/16 16:16:16 blight Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -14,7 +14,15 @@ #ifdef __cplusplus extern "C" { -#endif//__cplusplus +#endif /* __cplusplus */ + +#define NDEBUG + +#ifndef PFD_GENERIC_ACCELERATED +# define PFD_GENERIC_ACCELERATED 0x00001000 +#endif + +#define OPENGL_DRIVERS_SUBKEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\OpenGLDrivers\\" /* gl function list */ #include "glfuncs.h" @@ -25,7 +33,7 @@ extern "C" { /* debug flags */ #if !defined(NDEBUG) # define DEBUG_OPENGL32 -# define DEBUG_OPENGL32_BRKPTS /* enable breakpoints */ +/*# define DEBUG_OPENGL32_BRKPTS*/ /* enable breakpoints */ # define DEBUG_OPENGL32_ICD_EXPORTS /* dumps the list of (un)supported glXXX functions when an ICD is loaded. */ # define DEBUG_OPENGL32_TRACE /* prints much information about whats going on */ @@ -40,11 +48,13 @@ ULONG DbgPrint(PCH Format,...); # include # define DBGPRINT( fmt, args... ) \ DPRINT( "OpenGL32.DLL: %s: "fmt"\n", __FUNCTION__, ##args ) -# else -# define DBGPRINT( ... ) do {} while (0) # endif #endif +#ifndef DBGPRINT +# define DBGPRINT( ... ) do {} while (0) +#endif + #ifdef DEBUG_OPENGL32_BRKPTS # if defined(__GNUC__) # define DBGBREAK() __asm__( "int $3" ); @@ -53,10 +63,14 @@ ULONG DbgPrint(PCH Format,...); # else # error Unsupported compiler! # endif +#else +# define DBGBREAK() do {} while (0) #endif #ifdef DEBUG_OPENGL32_TRACE # define DBGTRACE( args... ) DBGPRINT( args ) +#else +# define DBGTRACE( ... ) do {} while (0) #endif /* function/data attributes */ @@ -66,7 +80,7 @@ ULONG DbgPrint(PCH Format,...); # define SHARED # ifndef STDCALL # define STDCALL __stdcall -# endif/*STDCALL*/ +# endif /* STDCALL */ #else /* GCC */ # define NAKED __attribute__((naked)) # define SHARED __attribute__((section("shared"), shared)) @@ -74,7 +88,7 @@ ULONG DbgPrint(PCH Format,...); #ifdef APIENTRY #undef APIENTRY -#endif//APIENTRY +#endif /* APIENTRY */ #define APIENTRY EXPORT __stdcall /* gl function list */ @@ -104,14 +118,14 @@ typedef DWORD APIENTRY (*SetContextCallBack)( const ICDTable * ); /* OpenGL ICD data */ typedef struct tagGLDRIVERDATA { - HMODULE handle; /* DLL handle */ - UINT refcount; /* number of references to this ICD */ - WCHAR driver_name[256]; /* name of display driver */ + HMODULE handle; /*!< DLL handle */ + UINT refcount; /*!< Number of references to this ICD */ + WCHAR driver_name[256]; /*!< Name of ICD driver */ - WCHAR dll[256]; /* Dll value from registry */ - DWORD version; /* Version value from registry */ - DWORD driver_version; /* DriverVersion value from registry */ - DWORD flags; /* Flags value from registry */ + WCHAR dll[256]; /*!< Dll filename from registry */ + DWORD version; /*!< Version value from registry */ + DWORD driver_version; /*!< DriverVersion value from registry */ + DWORD flags; /*!< Flags value from registry */ BOOL APIENTRY (*DrvCopyContext)( HGLRC, HGLRC, UINT ); HGLRC APIENTRY (*DrvCreateContext)( HDC ); @@ -121,11 +135,11 @@ typedef struct tagGLDRIVERDATA int APIENTRY (*DrvDescribePixelFormat)( IN HDC, IN int, IN UINT, OUT LPPIXELFORMATDESCRIPTOR ); int APIENTRY (*DrvGetLayerPaletteEntries)( HDC, int, int, int, COLORREF * ); PROC APIENTRY (*DrvGetProcAddress)( LPCSTR lpProcName ); - void APIENTRY (*DrvReleaseContext)(); + void APIENTRY (*DrvReleaseContext)( HGLRC hglrc ); /* maybe returns BOOL? */ BOOL APIENTRY (*DrvRealizeLayerPalette)( HDC, int, BOOL ); PICDTable APIENTRY (*DrvSetContext)( HDC hdc, HGLRC hglrc, SetContextCallBack callback ); int APIENTRY (*DrvSetLayerPaletteEntries)( HDC, int, int, int, CONST COLORREF * ); - BOOL APIENTRY (*DrvSetPixelFormat)( IN HDC, IN int, IN CONST PIXELFORMATDESCRIPTOR * ); + BOOL APIENTRY (*DrvSetPixelFormat)( IN HDC, IN int ); /*, IN CONST PIXELFORMATDESCRIPTOR * );*/ BOOL APIENTRY (*DrvShareLists)( HGLRC, HGLRC ); BOOL APIENTRY (*DrvSwapBuffers)( HDC ); BOOL APIENTRY (*DrvSwapLayerBuffers)( HDC, UINT ); @@ -137,12 +151,12 @@ typedef struct tagGLDRIVERDATA /* Our private OpenGL context (stored in TLS) */ typedef struct tagGLRC { - GLDRIVERDATA *icd; /* driver used for this context */ - HDC hdc; /* DC handle */ - BOOL is_current; /* wether this context is current for some DC */ - DWORD thread_id; /* thread holding this context */ + GLDRIVERDATA *icd; /*!< driver used for this context */ + HDC hdc; /*!< DC handle */ + BOOL is_current; /*!< Wether this context is current for some DC */ + DWORD thread_id; /*!< Thread holding this context */ - HGLRC hglrc; /* GLRC from DrvCreateContext */ + HGLRC hglrc; /*!< GLRC from DrvCreateContext (ICD internal) */ struct tagGLRC *next; /* linked list */ } GLRC; @@ -150,9 +164,9 @@ typedef struct tagGLRC /* OpenGL private device context data */ typedef struct tagGLDCDATA { - HDC hdc; /* device context handle for which this data is */ - GLDRIVERDATA *icd; /* driver used for this DC */ - int pixel_format; /* selected pixel format */ + HDC hdc; /*!< Device context handle for which this data is */ + GLDRIVERDATA *icd; /*!< Driver used for this DC */ + int pixel_format; /*!< Selected pixel format */ struct tagGLDCDATA *next; /* linked list */ } GLDCDATA; @@ -161,18 +175,18 @@ typedef struct tagGLDCDATA /* Process data */ typedef struct tagGLPROCESSDATA { - GLDRIVERDATA *driver_list; /* list of loaded drivers */ - HANDLE driver_mutex; /* mutex to protect driver list */ - GLRC *glrc_list; /* list of GL rendering contexts */ - HANDLE glrc_mutex; /* mutex to protect glrc list */ - GLDCDATA *dcdata_list; /* list of GL private DC data */ - HANDLE dcdata_mutex; /* mutex to protect glrc list */ + GLDRIVERDATA *driver_list; /*!< List of loaded drivers */ + HANDLE driver_mutex; /*!< Mutex to protect driver list */ + GLRC *glrc_list; /*!< List of GL rendering contexts */ + HANDLE glrc_mutex; /*!< Mutex to protect glrc list */ + GLDCDATA *dcdata_list; /*!< List of GL private DC data */ + HANDLE dcdata_mutex; /*!< Mutex to protect glrc list */ } GLPROCESSDATA; /* TLS data */ typedef struct tagGLTHREADDATA { - GLRC *glrc; /* current GL rendering context */ + GLRC *glrc; /*!< current GL rendering context */ } GLTHREADDATA; extern DWORD OPENGL32_tls; @@ -180,11 +194,9 @@ extern GLPROCESSDATA OPENGL32_processdata; #define OPENGL32_threaddata ((GLTHREADDATA *)TlsGetValue( OPENGL32_tls )) /* function prototypes */ -/*GLDRIVERDATA *OPENGL32_LoadICDForHDC( HDC hdc );*/ GLDRIVERDATA *OPENGL32_LoadICD( LPCWSTR driver ); BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd ); -DWORD OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName ); -DWORD OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd ); + /* empty gl functions from gl.c */ int STDCALL glEmptyFunc0(); @@ -209,14 +221,18 @@ int STDCALL glEmptyFunc52( long, long, long, long, long, long, long, long, int STDCALL glEmptyFunc56( long, long, long, long, long, long, long, long, long, long, long, long, long, long ); +#ifdef OPENGL32_GL_FUNC_PROTOTYPES + #define X(func,ret,typeargs,args,icdidx,tebidx,stack) EXPORT ret STDCALL func typeargs; GLFUNCS_MACRO #undef X -#ifdef __cplusplus -}; // extern "C" -#endif//__cplusplus +#endif /* OPENGL32_GL_FUNC_PROTOTYPES */ -#endif//OPENGL32_PRIVATE_H +#ifdef __cplusplus +}; /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* OPENGL32_PRIVATE_H */ /* EOF */ diff --git a/reactos/lib/opengl32/wgl.c b/reactos/lib/opengl32/wgl.c index 5c7d5d1ccc6..d506c3a64fd 100644 --- a/reactos/lib/opengl32/wgl.c +++ b/reactos/lib/opengl32/wgl.c @@ -10,29 +10,33 @@ #define WIN32_LEAN_AND_MEAN #include +#include +#include #include "teb.h" +#define OPENGL32_GL_FUNC_PROTOTYPES #include "opengl32.h" #ifdef __cplusplus extern "C" { -#endif//__cplusplus +#endif /* __cplusplus */ -#ifdef _MSC_VER -#define UNIMPLEMENTED DBGPRINT( "UNIMPLEMENTED" ) -#endif//_MSC_VER +#if !defined(UNIMPLEMENTED) +# define UNIMPLEMENTED DBGPRINT( "UNIMPLEMENTED" ) +#endif -#define EXT_GET_DRIVERINFO 0x1101 /* ExtEscape code to get driver info */ +#define EXT_GET_DRIVERINFO 0x1101 /*!< ExtEscape code to get driver info */ typedef struct tagEXTDRIVERINFO { - DWORD version; /* driver interface version */ - DWORD driver_version; /* driver version */ - WCHAR driver_name[256]; /* driver name */ + DWORD version; /*!< Driver interface version */ + DWORD driver_version; /*!< Driver version */ + WCHAR driver_name[256]; /*!< Driver name */ } EXTDRIVERINFO; -/* FUNCTION: Append OpenGL Rendering Context (GLRC) to list - * ARGUMENTS: [IN] glrc: GLRC to append to list +/*! \brief Append OpenGL Rendering Context (GLRC) to list + * + * \param glrc [IN] Pointer to GLRC to append to list */ static void @@ -62,8 +66,9 @@ ROSGL_AppendContext( GLRC *glrc ) } -/* FUNCTION: Remove OpenGL Rendering Context (GLRC) from list - * ARGUMENTS: [IN] glrc: GLRC to remove from list +/*! \brief Remove OpenGL Rendering Context (GLRC) from list + * + * \param glrc [IN] Pointer to GLRC to remove from list */ static void @@ -100,8 +105,10 @@ ROSGL_RemoveContext( GLRC *glrc ) } -/* FUNCTION: Create a new GL Context (GLRC) and append it to the list - * RETURNS: Pointer to new GLRC on success; NULL on failure +/*! \brief Create a new GL Context (GLRC) and append it to the list + * + * \return Pointer to new GLRC on success + * \retval NULL Returned on failure (i.e. Out of memory) */ static GLRC * @@ -120,9 +127,12 @@ ROSGL_NewContext() } -/* FUNCTION: Delete a GL Context (GLRC) and remove it from the list - * ARGUMENTS: [IN] glrc GLRC to delete - * RETURNS: TRUE if there were no error; FALSE otherwise +/*! \brief Delete a GL Context (GLRC) and remove it from the list + * + * \param glrc [IN] Pointer to GLRC to delete + * + * \retval TRUE Success + * \retval FALSE Failure */ static BOOL @@ -142,8 +152,12 @@ ROSGL_DeleteContext( GLRC *glrc ) } -/* FUNCTION: Check wether a GLRC is in the list - * ARGUMENTS: [IN] glrc: GLRC to remove from list +/*! \brief Check wether a GLRC is in the list + * + * \param glrc [IN] Pointer to GLRC to look for in the list + * + * \retval TRUE GLRC was found + * \retval FALSE GLRC was not found */ static BOOL @@ -175,10 +189,15 @@ ROSGL_ContainsContext( GLRC *glrc ) } -/* FUNCTION: Get GL private DC data. Adds an empty GLDCDATA to the list if - * there is no data for the given DC and returns it. - * ARGUMENTS: [IN] hdc Device Context for which to get the data - * RETURNS: Pointer to GLDCDATA on success; NULL on failure +/*! \brief Get GL private DC data. + * + * This function adds an empty GLDCDATA to the list if there is no data for the + * given DC yet. + * + * \param hdc [IN] Handle to a Device Context for which to get the data + * + * \return Pointer to GLDCDATA on success + * \retval NULL on failure */ static GLDCDATA * @@ -238,9 +257,15 @@ ROSGL_GetPrivateDCData( HDC hdc ) } -/* FUNCTION: Get ICD from HDC - * RETURNS: GLDRIVERDATA pointer on success, NULL otherwise. - * NOTES: Make sure the handle you pass in is one for a DC! +/*! \brief Get ICD from HDC. + * + * This function asks the display driver which OpenGL ICD to load for the given + * HDC, loads it and returns a pointer to a GLDRIVERDATA struct on success. + * + * \param hdc [IN] Handle for DC for which to load/get the ICD + * + * \return Pointer to GLDRIVERDATA + * \retval NULL Failure. */ static GLDRIVERDATA * @@ -253,43 +278,78 @@ ROSGL_ICDForHDC( HDC hdc ) return NULL; if (dcdata->icd == NULL) -#if 1 { - DWORD dwInput = 0; - LONG ret; + LPCWSTR driverName; EXTDRIVERINFO info; - /* get driver name */ - ret = ExtEscape( hdc, EXT_GET_DRIVERINFO, sizeof (dwInput), (LPCSTR)&dwInput, - sizeof (EXTDRIVERINFO), (LPSTR)&info ); - if (ret < 0) + driverName = _wgetenv( L"OPENGL32_DRIVER" ); + if (driverName == NULL) { - DBGPRINT( "Warning: ExtEscape to get the drivername failed!!! (%d)", GetLastError() ); - return 0; - } + DWORD dwInput = 0; + LONG ret; + /* get driver name */ + ret = ExtEscape( hdc, EXT_GET_DRIVERINFO, sizeof (dwInput), (LPCSTR)&dwInput, + sizeof (EXTDRIVERINFO), (LPSTR)&info ); + if (ret < 0) + { + HKEY hKey; + DWORD type, size; + + DBGPRINT( "Warning: ExtEscape to get the drivername failed!!! (%d)", GetLastError() ); + if (MessageBox( WindowFromDC( hdc ), L"Couldn't get installable client driver name!\nUsing default driver.", + L"OPENGL32.dll: Warning", MB_OKCANCEL | MB_ICONWARNING ) == IDCANCEL) + { + SetLastError( ret ); + return NULL; + } + + /* open registry key */ + ret = RegOpenKeyExW( HKEY_LOCAL_MACHINE, OPENGL_DRIVERS_SUBKEY, 0, KEY_READ, &hKey ); + if (ret != ERROR_SUCCESS) + { + DBGPRINT( "Error: Couldn't open registry key '%ws'", OPENGL_DRIVERS_SUBKEY ); + SetLastError( ret ); + return NULL; + } + + /* query value */ + size = sizeof (info.driver_name); + ret = RegQueryValueExW( hKey, L"DefaultDriver", 0, &type, (LPBYTE)info.driver_name, &size ); + RegCloseKey( hKey ); + if (ret != ERROR_SUCCESS || type != REG_SZ) + { + DBGPRINT( "Error: Couldn't query DefaultDriver value or not a string" ); + SetLastError( ret ); + return NULL; + } + } + } + else + { + wcsncpy( info.driver_name, driverName, sizeof (info.driver_name) / sizeof (info.driver_name[0]) ); + } /* load driver (or get a reference) */ dcdata->icd = OPENGL32_LoadICD( info.driver_name ); } -#else - dcdata->icd = OPENGL32_LoadICD( L"OGLICD" ); -#endif return dcdata->icd; } -/* FUNCTION: SetContextCallBack passed to DrvSetContext. Gets called whenever - * the current GL context (dispatch table) is to be changed. - * ARGUMENTS: [IN] table Function pointer table (first DWORD is number of - * functions) - * RETURNS: unkown (maybe void?) +/*! \brief SetContextCallBack passed to DrvSetContext. + * + * This function gets called by the OpenGL driver whenever the current GL + * context (dispatch table) is to be changed. + * + * \param table [IN] Function pointer table (first DWORD is number of functions) + * + * \return unkown (maybe void? ERROR_SUCCESS at the moment) */ DWORD CALLBACK ROSGL_SetContextCallBack( const ICDTable *table ) { -/* UINT i;*/ TEB *teb; PROC *tebTable, *tebDispatchTable; INT size; @@ -298,6 +358,8 @@ ROSGL_SetContextCallBack( const ICDTable *table ) tebTable = (PROC *)teb->glTable; tebDispatchTable = (PROC *)teb->glDispatchTable; + DBGTRACE( "Called!" ); + if (table != NULL) { DBGPRINT( "Function count: %d\n", table->num_funcs ); @@ -314,18 +376,6 @@ ROSGL_SetContextCallBack( const ICDTable *table ) memset( tebTable, 0, sizeof (table->dispatch_table) ); } - /* FIXME: pull in software fallbacks -- need mesa */ -#if 0 /* unused atm */ - for (i = 0; i < (sizeof (table->dispatch_table) / sizeof (PROC)); i++) - { - if (tebTable[i] == NULL) - { - /* FIXME: fallback */ - DBGPRINT( "Warning: GL proc #%d is NULL!", i ); - } - } -#endif - /* put in empty functions as long as we dont have a fallback */ #define X(func, ret, typeargs, args, icdidx, tebidx, stack) \ if (tebTable[icdidx] == NULL) \ @@ -344,13 +394,27 @@ ROSGL_SetContextCallBack( const ICDTable *table ) GLFUNCS_MACRO #undef X + DBGPRINT( "Done." ); +/* DBGBREAK();*/ + return ERROR_SUCCESS; } -/* FUNCTION: Attempts to find the best matching pixel format for HDC - * ARGUMENTS: [IN] pdf PFD describing what kind of format you want - * RETURNS: one-based positive format index on success, 0 on failure +/*! \brief Attempts to find the best matching pixel format for HDC + * + * This function is comparing each available format with the preferred one + * and returns the one which is closest to it. + * If PFD_DOUBLEBUFFER, PFD_STEREO or one of PFD_DRAW_TO_WINDOW, + * PFD_DRAW_TO_BITMAP, PFD_SUPPORT_GDI and PDF_SUPPORT_OPENGL is given then + * only formats which also support those will be enumerated (unless + * PFD_DOUBLEBUFFER_DONTCARE or PFD_STEREO_DONTCARE is also set) + * + * \param hdc [IN] Handle to DC for which to get a pixel format index + * \param pfd [IN] PFD describing what kind of format you want + * + * \return Pixel format index + * \retval 0 Failed to find a suitable format */ #define BUFFERDEPTH_SCORE(want, have) \ ((want == 0) ? (0) : ((want < have) ? (1) : ((want > have) ? (3) : (0)))) @@ -382,7 +446,6 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) } /* get number of formats */ -// __asm__( "int $3" ); icdNumFormats = icd->DrvDescribePixelFormat( hdc, 1, sizeof (PIXELFORMATDESCRIPTOR), &icdPfd ); if (icdNumFormats == 0) @@ -403,6 +466,11 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) break; } + if ((pfd->dwFlags & PFD_GENERIC_ACCELERATED) != 0) /* we do not support such kind of drivers */ + { + continue; + } + /* compare flags */ if ((pfd->dwFlags & compareFlags) != (icdPfd.dwFlags & compareFlags)) continue; @@ -444,11 +512,14 @@ rosglChoosePixelFormat( HDC hdc, CONST PIXELFORMATDESCRIPTOR *pfd ) } -/* FUNCTION: Copy data specified by mask from one GLRC to another. - * ARGUMENTS: [IN] src Source GLRC - * [OUT] dst Destination GLRC - * [IN] mask Bitfield like given to glPushAttrib() - * RETURN: TRUE on success, FALSE on failure +/*! \brief Copy data specified by mask from one GLRC to another. + * + * \param src [IN] Source GLRC + * \param src [OUT] Destination GLRC + * \param mask [IN] Bitfield like given to glPushAttrib() + * + * \retval TRUE Success + * \retval FALSE Failure */ BOOL APIENTRY @@ -481,11 +552,15 @@ rosglCopyContext( HGLRC hsrc, HGLRC hdst, UINT mask ) } -/* FUNCTION: Create a new GL Rendering Context for the given plane on - * the given DC. - * ARGUMENTS: [IN] hdc Handle for DC for which to create context - * [IN] layer Layer number to bind (draw?) to - * RETURNS: NULL on failure, new GLRC on success +/*! \brief Create a new GL Rendering Context. + * + * This function can create over- or underlay surfaces. + * + * \param hdc [IN] Handle for DC for which to create context + * \param layer [IN] Layer number to bind (draw?) to + * + * \return Handle for the created GLRC + * \retval NULL Failure */ HGLRC APIENTRY @@ -495,6 +570,8 @@ rosglCreateLayerContext( HDC hdc, int layer ) GLRC *glrc; HGLRC drvHglrc = NULL; + DBGTRACE( "Called!" ); + /* if (GetObjectType( hdc ) != OBJ_DC) { DBGPRINT( "Error: hdc is not a DC handle!" ); @@ -542,9 +619,12 @@ rosglCreateLayerContext( HDC hdc, int layer ) } -/* FUNCTION: Create a new GL Rendering Context for the given DC. - * ARGUMENTS: [IN] hdc Handle for DC for which to create context - * RETURNS: NULL on failure, new GLRC on success +/*! \brief Create a new GL Rendering Context. + * + * \param hdc [IN] Handle for DC for which to create context + * + * \return Handle for the created GLRC + * \retval NULL Failure */ HGLRC APIENTRY @@ -554,9 +634,12 @@ rosglCreateContext( HDC hdc ) } -/* FUNCTION: Delete an OpenGL context - * ARGUMENTS: [IN] hglrc Handle to GLRC to delete; must not be a threads RC! - * RETURNS: TRUE on success, FALSE otherwise +/*! \brief Delete an OpenGL context + * + * \param hglrc [IN] Handle to GLRC to delete; must not be a threads current RC! + * + * \retval TRUE Success + * \retval FALSE Failure (i.e. GLRC is current for a thread) */ BOOL APIENTRY @@ -603,13 +686,15 @@ rosglDescribeLayerPlane( HDC hdc, int iPixelFormat, int iLayerPlane, } -/* FUNCTION: Gets information about the pixelformat specified by iFormat and - * puts it into pfd. - * ARGUMENTS: [IN] hdc Handle to DC - * [IN] iFormat Pixelformat index - * [IN] nBytes sizeof (pfd) - at most nBytes are copied into pfd - * [OUT] pfd Pointer to a PIXELFORMATDESCRIPTOR - * RETURNS: Maximum pixelformat index/number of formats on success; 0 on failure +/*! \brief Gets information about a pixelformat. + * + * \param hdc [IN] Handle to DC + * \param iFormat [IN] Pixelformat index + * \param nBytes [IN] sizeof (pfd) - at most nBytes are copied into pfd + * \param pfd [OUT] Pointer to a PIXELFORMATDESCRIPTOR + * + * \return Maximum pixelformat index/number of formats + * \retval 0 Failure */ int APIENTRY @@ -626,13 +711,14 @@ rosglDescribePixelFormat( HDC hdc, int iFormat, UINT nBytes, DBGPRINT( "Error: DrvDescribePixelFormat(format=%d) failed (%d)", iFormat, GetLastError() ); } - /* FIXME: implement own functionality? */ return ret; } -/* FUNCTION: Return the current GLRC - * RETURNS: Current GLRC (NULL if none was set current) +/*! \brief Return the thread's current GLRC + * + * \return Handle for thread's current GLRC + * \retval NULL No current GLRC set */ HGLRC APIENTRY @@ -642,8 +728,10 @@ rosglGetCurrentContext() } -/* FUNCTION: Return the current DC - * RETURNS: NULL on failure, current DC otherwise +/*! \brief Return the thread's current DC + * + * \return Handle for thread's current DC + * \retval NULL No current DC/GLRC set */ HDC APIENTRY @@ -667,9 +755,12 @@ rosglGetLayerPaletteEntries( HDC hdc, int iLayerPlane, int iStart, } -/* FUNCTION: Returns the current pixelformat for the given hdc. - * ARGUMENTS: [IN] hdc Handle to DC of which to get the pixelformat - * RETURNS: Pixelformat index on success; 0 on failure +/*! \brief Returns the current pixelformat. + * + * \param hdc [IN] Handle to DC to get the pixelformat from + * + * \return Pixelformat index + * \retval 0 Failure */ int WINAPI @@ -690,9 +781,15 @@ rosglGetPixelFormat( HDC hdc ) } -/* FUNCTION: Get the address for an OpenGL extension function from the current ICD. - * ARGUMENTS: [IN] proc: Name of the function to look for - * RETURNS: The address of the proc or NULL on failure. +/*! \brief Get the address for an OpenGL extension function. + * + * The addresses this function returns are only valid within the same thread + * which it was called from. + * + * \param proc [IN] Name of the function to look for + * + * \return The address of the proc + * \retval NULL Failure */ PROC APIENTRY @@ -704,7 +801,7 @@ rosglGetProcAddress( LPCSTR proc ) return NULL; } - if (proc[0] == 'g' && proc[1] == 'l') /* glXXX */ + if (proc[0] == 'g' && proc[1] == 'l' && proc[2] != 'u') /* glXXX */ { PROC glXXX = NULL; GLDRIVERDATA *icd = OPENGL32_threaddata->glrc->icd; @@ -733,10 +830,13 @@ rosglGetProcAddress( LPCSTR proc ) } -/* FUNCTION: make the given GLRC the threads current GLRC for hdc - * ARGUMENTS: [IN] hdc Handle for a DC to be drawn on - * [IN] hglrc Handle for a GLRC to make current - * RETURNS: TRUE on success, FALSE otherwise +/*! \brief Make the given GLRC the threads current GLRC for hdc + * + * \param hdc [IN] Handle for a DC to be drawn on + * \param hglrc [IN] Handle for a GLRC to make current + * + * \retval TRUE Success + * \retval FALSE Failure */ BOOL APIENTRY @@ -745,6 +845,8 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) GLRC *glrc = (GLRC *)hglrc; ICDTable *icdTable = NULL; + DBGTRACE( "Called!" ); + /* flush current context */ if (OPENGL32_threaddata->glrc != NULL) { @@ -756,7 +858,9 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) { if (OPENGL32_threaddata->glrc != NULL) { - OPENGL32_threaddata->glrc->is_current = FALSE; + glrc = OPENGL32_threaddata->glrc; + glrc->icd->DrvReleaseContext( glrc->hglrc ); + glrc->is_current = FALSE; OPENGL32_threaddata->glrc = NULL; } } @@ -786,8 +890,10 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) /* call the ICD */ if (glrc->hglrc != NULL) { + DBGPRINT( "Info: Calling DrvSetContext!" ); + DBGBREAK(); icdTable = glrc->icd->DrvSetContext( hdc, glrc->hglrc, - ROSGL_SetContextCallBack ); + ROSGL_SetContextCallBack ); if (icdTable == NULL) { DBGPRINT( "Error: DrvSetContext failed (%d)\n", GetLastError() ); @@ -805,7 +911,7 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc ) OPENGL32_threaddata->glrc = glrc; } - if (ROSGL_SetContextCallBack( icdTable ) != ERROR_SUCCESS) + if (ROSGL_SetContextCallBack( icdTable ) != ERROR_SUCCESS && icdTable == NULL) { DBGPRINT( "Warning: ROSGL_SetContextCallBack failed!" ); } @@ -833,11 +939,14 @@ rosglSetLayerPaletteEntries( HDC hdc, int iLayerPlane, int iStart, } -/* FUNCTION: Set pixelformat of given DC - * ARGUMENTS: [IN] hdc Handle to DC for which to set the format - * [IN] iFormat Index of the pixelformat to set - * [IN] pfd Not sure what this is for - * RETURNS: TRUE on success, FALSE on failure +/*! \brief Set a DCs pixelformat + * + * \param hdc [IN] Handle to DC for which to set the format + * \param iFormat [IN] Index of the pixelformat to set + * \param pfd [IN] Not sure what this is for + * + * \retval TRUE Success + * \retval FALSE Failure */ BOOL WINAPI @@ -857,7 +966,7 @@ rosglSetPixelFormat( HDC hdc, int iFormat, CONST PIXELFORMATDESCRIPTOR *pfd ) } /* call ICD */ - if (!icd->DrvSetPixelFormat( hdc, iFormat, pfd )) + if (!icd->DrvSetPixelFormat( hdc, iFormat/*, pfd*/ )) { DBGPRINT( "Warning: DrvSetPixelFormat(format=%d) failed (%d)", iFormat, GetLastError() ); @@ -877,10 +986,15 @@ rosglSetPixelFormat( HDC hdc, int iFormat, CONST PIXELFORMATDESCRIPTOR *pfd ) } -/* FUNCTION: Enable display-list sharing between multiple GLRCs - * ARGUMENTS: [IN] hglrc1 GLRC number 1 - * [IN] hglrc2 GLRC number 2 - * RETURNS: TRUE on success, FALSE on failure +/*! \brief Enable display-list sharing between multiple GLRCs + * + * This will only work if both GLRCs are from the same driver. + * + * \param hglrc1 [IN] GLRC number 1 + * \param hglrc2 [IN] GLRC number 2 + * + * \retval TRUE Success + * \retval FALSE Failure */ BOOL APIENTRY @@ -913,17 +1027,22 @@ rosglShareLists( HGLRC hglrc1, HGLRC hglrc2 ) } -/* FUNCTION: Flushes GL and swaps front/back buffer if appropriate - * ARGUMENTS: [IN] hdc Handle to device context to swap buffers for - * RETURNS: TRUE on success, FALSE on failure +/*! \brief Flushes GL and swaps front/back buffer if appropriate + * + * \param hdc [IN] Handle to device context to swap buffers for + * + * \retval TRUE Success + * \retval FALSE Failure */ BOOL APIENTRY rosglSwapBuffers( HDC hdc ) { GLDRIVERDATA *icd = ROSGL_ICDForHDC( hdc ); + DBGTRACE( "Called!" ); if (icd != NULL) { + DBGPRINT( "Swapping buffers!" ); if (!icd->DrvSwapBuffers( hdc )) { DBGPRINT( "Error: DrvSwapBuffers failed (%d)", GetLastError() ); @@ -986,7 +1105,7 @@ rosglUseFontOutlinesW( HDC hdc, DWORD first, DWORD count, DWORD listBase, } #ifdef __cplusplus -}; // extern "C" -#endif//__cplusplus +}; /* extern "C" */ +#endif /* __cplusplus */ /* EOF */ From 9d8706171359a415fb77b03c6e11e0d5821eb06a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 16 Jul 2004 17:20:23 +0000 Subject: [PATCH 308/356] Implement security descriptor cache. svn path=/trunk/; revision=10142 --- reactos/ntoskrnl/Makefile | 23 +- reactos/ntoskrnl/include/internal/ob.h | 17 +- reactos/ntoskrnl/ob/namespc.c | 5 +- reactos/ntoskrnl/ob/object.c | 135 ++++++----- reactos/ntoskrnl/ob/sdcache.c | 312 +++++++++++++++++++++++++ reactos/ntoskrnl/ob/security.c | 29 ++- 6 files changed, 450 insertions(+), 71 deletions(-) create mode 100644 reactos/ntoskrnl/ob/sdcache.c diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index ddfb1eddd28..8a4523c0d6b 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.129 2004/07/02 21:02:54 royce Exp $ +# $Id: Makefile,v 1.130 2004/07/16 17:20:23 ekohl Exp $ # # ReactOS Operating System # @@ -130,7 +130,7 @@ OBJECTS_KE = \ ke/catch.o \ ke/critical.o \ ke/dpc.o \ - ke/device.o \ + ke/device.o \ ke/error.o \ ke/event.o \ ke/kqueue.o \ @@ -138,7 +138,7 @@ OBJECTS_KE = \ ke/main.o \ ke/mutex.o \ ke/process.o \ - ke/profile.o \ + ke/profile.o \ ke/queue.o \ ke/sem.o \ ke/spinlock.o \ @@ -223,9 +223,9 @@ OBJECTS_IO = \ io/timer.o \ io/vpb.o \ io/wdm.o \ + io/wmi.o \ io/xhaldisp.o \ - io/xhaldrv.o \ - io/wmi.o + io/xhaldrv.o # Object Manager (Ob) OBJECTS_OB = \ @@ -234,6 +234,7 @@ OBJECTS_OB = \ ob/namespc.o \ ob/ntobj.o \ ob/object.o \ + ob/sdcache.o \ ob/security.o \ ob/symlink.o @@ -265,12 +266,12 @@ OBJECTS_EX = \ ex/napi.o \ ex/power.o \ ex/resource.o \ - ex/rundown.o \ + ex/rundown.o \ ex/stree.o \ - ex/synch.o \ + ex/synch.o \ ex/sysinfo.o \ - ex/time.o \ - ex/util.o \ + ex/time.o \ + ex/util.o \ ex/win32k.o \ ex/work.o \ ex/zone.o @@ -359,9 +360,9 @@ OBJECTS_CC = \ # Kernel Debugger Support (Kd) OBJECTS_KD = \ kd/dlog.o \ - kd/gdbstub.o \ + kd/gdbstub.o \ kd/kdebug.o \ - kd/mda.o \ + kd/mda.o \ kd/service.o # Boot video (Inbv) diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index fc061e3bd92..e6184dcbafb 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -133,8 +133,21 @@ ObDuplicateObject(PEPROCESS SourceProcess, BOOLEAN InheritHandle, ULONG Options); -ULONG -ObpGetHandleCountbyHandleTable(PHANDLE_TABLE HandleTable); +ULONG +ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable); + + +/* Security descriptor cache functions */ + +NTSTATUS +ObpInitSdCache(VOID); + +NTSTATUS +ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD, + OUT PSECURITY_DESCRIPTOR *DestinationSD); + +NTSTATUS +ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor); #endif /* __INCLUDE_INTERNAL_OBJMGR_H */ diff --git a/reactos/ntoskrnl/ob/namespc.c b/reactos/ntoskrnl/ob/namespc.c index f374c95a6e8..0c18f2e2ec3 100644 --- a/reactos/ntoskrnl/ob/namespc.c +++ b/reactos/ntoskrnl/ob/namespc.c @@ -1,4 +1,4 @@ -/* $Id: namespc.c,v 1.44 2003/11/17 02:12:51 hyperion Exp $ +/* $Id: namespc.c,v 1.45 2004/07/16 17:19:15 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -349,6 +349,9 @@ ObInit(VOID) OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING Name; + /* Initialize the security descriptor cache */ + ObpInitSdCache(); + /* create 'directory' object type */ ObDirectoryType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE)); diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index 81eabe93747..a83d29e93b8 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -1,4 +1,4 @@ -/* $Id: object.c,v 1.77 2004/03/12 00:46:35 dwelch Exp $ +/* $Id: object.c,v 1.78 2004/07/16 17:19:15 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -36,14 +36,14 @@ typedef struct _RETENTION_CHECK_PARAMS PVOID HEADER_TO_BODY(POBJECT_HEADER obj) { - return(((char*)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER)); + return(((char*)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER)); } POBJECT_HEADER BODY_TO_HEADER(PVOID body) { - PCOMMON_BODY_HEADER chdr = (PCOMMON_BODY_HEADER)body; - return(CONTAINING_RECORD((&(chdr->Type)),OBJECT_HEADER,Type)); + PCOMMON_BODY_HEADER chdr = (PCOMMON_BODY_HEADER)body; + return(CONTAINING_RECORD((&(chdr->Type)),OBJECT_HEADER,Type)); } @@ -76,44 +76,44 @@ ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes, PUNICODE_STRING RemainingPath, POBJECT_TYPE ObjectType) { - PVOID NextObject; - PVOID CurrentObject; - PVOID RootObject; - POBJECT_HEADER CurrentHeader; - NTSTATUS Status; - PWSTR current; - UNICODE_STRING PathString; - ULONG Attributes; - PUNICODE_STRING ObjectName; + PVOID NextObject; + PVOID CurrentObject; + PVOID RootObject; + POBJECT_HEADER CurrentHeader; + NTSTATUS Status; + PWSTR current; + UNICODE_STRING PathString; + ULONG Attributes; + PUNICODE_STRING ObjectName; - DPRINT("ObFindObject(ObjectAttributes %x, ReturnedObject %x, " - "RemainingPath %x)\n",ObjectAttributes,ReturnedObject,RemainingPath); - DPRINT("ObjectAttributes->ObjectName %wZ\n", - ObjectAttributes->ObjectName); + DPRINT("ObFindObject(ObjectAttributes %x, ReturnedObject %x, " + "RemainingPath %x)\n",ObjectAttributes,ReturnedObject,RemainingPath); + DPRINT("ObjectAttributes->ObjectName %wZ\n", + ObjectAttributes->ObjectName); - RtlInitUnicodeString (RemainingPath, NULL); + RtlInitUnicodeString (RemainingPath, NULL); - if (ObjectAttributes->RootDirectory == NULL) - { - ObReferenceObjectByPointer(NameSpaceRoot, - DIRECTORY_TRAVERSE, - NULL, - UserMode); - CurrentObject = NameSpaceRoot; - } - else - { - Status = ObReferenceObjectByHandle(ObjectAttributes->RootDirectory, - DIRECTORY_TRAVERSE, - NULL, - UserMode, - &CurrentObject, - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - } + if (ObjectAttributes->RootDirectory == NULL) + { + ObReferenceObjectByPointer(NameSpaceRoot, + DIRECTORY_TRAVERSE, + NULL, + UserMode); + CurrentObject = NameSpaceRoot; + } + else + { + Status = ObReferenceObjectByHandle(ObjectAttributes->RootDirectory, + DIRECTORY_TRAVERSE, + NULL, + UserMode, + &CurrentObject, + NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } ObjectName = ObjectAttributes->ObjectName; if (ObjectName->Length == 0 || @@ -148,13 +148,13 @@ ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes, current = PathString.Buffer; - RootObject = CurrentObject; - Attributes = ObjectAttributes->Attributes; - if (ObjectType == ObSymbolicLinkType) - Attributes |= OBJ_OPENLINK; + RootObject = CurrentObject; + Attributes = ObjectAttributes->Attributes; + if (ObjectType == ObSymbolicLinkType) + Attributes |= OBJ_OPENLINK; - while (TRUE) - { + while (TRUE) + { DPRINT("current %S\n",current); CurrentHeader = BODY_TO_HEADER(CurrentObject); @@ -189,14 +189,14 @@ ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes, } ObDereferenceObject(CurrentObject); CurrentObject = NextObject; - } - - if (current) - RtlCreateUnicodeString (RemainingPath, current); - RtlFreeUnicodeString (&PathString); - *ReturnedObject = CurrentObject; - - return(STATUS_SUCCESS); + } + + if (current) + RtlCreateUnicodeString (RemainingPath, current); + RtlFreeUnicodeString (&PathString); + *ReturnedObject = CurrentObject; + + return STATUS_SUCCESS; } @@ -451,6 +451,30 @@ ObCreateObject (IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL, } RtlFreeUnicodeString( &RemainingPath ); + if (Header->ObjectType != NULL) + { + /* FIXME: Call SeAssignSecurity() to create a new security descriptor */ + + if (Header->ObjectType->Security != NULL) + { + /* FIXME: Call the security method */ + Status = STATUS_SUCCESS; + } + else + { + /* Assign the security descriptor to the object header */ + if (ObjectAttributes != NULL && ObjectAttributes->SecurityDescriptor != NULL) + { + Status = ObpAddSecurityDescriptor(ObjectAttributes->SecurityDescriptor, + &Header->SecurityDescriptor); + } + else + { + Status = STATUS_SUCCESS; + } + } + } + if (Object != NULL) { *Object = HEADER_TO_BODY(Header); @@ -574,6 +598,11 @@ ObpDeleteObject(POBJECT_HEADER Header) KEBUGCHECK(0); } + if (Header->SecurityDescriptor != NULL) + { + ObpRemoveSecurityDescriptor(Header->SecurityDescriptor); + } + if (Header->ObjectType != NULL && Header->ObjectType->Delete != NULL) { diff --git a/reactos/ntoskrnl/ob/sdcache.c b/reactos/ntoskrnl/ob/sdcache.c new file mode 100644 index 00000000000..0b26490ce3a --- /dev/null +++ b/reactos/ntoskrnl/ob/sdcache.c @@ -0,0 +1,312 @@ +/* $Id: sdcache.c,v 1.1 2004/07/16 17:19:15 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ps/kill.c + * PURPOSE: Terminating a thread + * PROGRAMMER: David Welch (welch@cwcom.net) + * UPDATE HISTORY: + * Created 22/05/98 + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +#define NDEBUG +#include + + +/* TYPES ********************************************************************/ + +typedef struct _SD_CACHE_ENTRY +{ + LIST_ENTRY ListEntry; + ULONG HashValue; + ULONG Index; + ULONG RefCount; +} SD_CACHE_ENTRY, *PSD_CACHE_ENTRY; + + +/* GLOBALS ******************************************************************/ + +PLIST_ENTRY ObpSdCache; +KSPIN_LOCK ObpSdCacheSpinLock; +KIRQL ObpSdCacheIrql; + + +#define SD_CACHE_ENTRIES 0x100 + +/* FUNCTIONS ****************************************************************/ + +NTSTATUS +ObpInitSdCache(VOID) +{ + ULONG i; + + ObpSdCache = ExAllocatePool(NonPagedPool, + SD_CACHE_ENTRIES * sizeof(LIST_ENTRY)); + if (ObpSdCache == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + for (i = 0; i < SD_CACHE_ENTRIES; i++) + { + InitializeListHead(&ObpSdCache[i]); + } + + KeInitializeSpinLock(&ObpSdCacheSpinLock); + + return STATUS_SUCCESS; +} + + +static VOID +ObpSdCacheLock(VOID) +{ + KeAcquireSpinLock(&ObpSdCacheSpinLock, + &ObpSdCacheIrql); +} + + +static VOID +ObpSdCacheUnlock(VOID) +{ + KeReleaseSpinLock(&ObpSdCacheSpinLock, + ObpSdCacheIrql); +} + + +static ULONG +ObpHash(PVOID Buffer, + ULONG Length) +{ + PUCHAR Ptr; + ULONG Value; + ULONG i; + + Ptr = (PUCHAR)Buffer; + Value = 0; + for (i = 0; i < Length; i++) + { + Value += *Ptr; + Ptr++; + } + + return Value; +} + + +static ULONG +ObpHashSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + ULONG Value; + BOOLEAN Defaulted; + BOOLEAN DaclPresent; + BOOLEAN SaclPresent; + PSID Owner = NULL; + PSID Group = NULL; + PACL Dacl = NULL; + PACL Sacl = NULL; + + RtlGetOwnerSecurityDescriptor(SecurityDescriptor, + &Owner, + &Defaulted); + + RtlGetGroupSecurityDescriptor(SecurityDescriptor, + &Group, + &Defaulted); + + RtlGetDaclSecurityDescriptor(SecurityDescriptor, + &DaclPresent, + &Dacl, + &Defaulted); + + RtlGetSaclSecurityDescriptor(SecurityDescriptor, + &SaclPresent, + &Sacl, + &Defaulted); + + Value = 0; + if (Owner != NULL) + { + Value += ObpHash(Owner, RtlLengthSid(Owner)); + } + + if (Group != NULL) + { + Value += ObpHash(Group, RtlLengthSid(Group)); + } + + if (DaclPresent == TRUE && Dacl != NULL) + { + Value += ObpHash(Dacl, Dacl->AclSize); + } + + if (SaclPresent == TRUE && Sacl != NULL) + { + Value += ObpHash(Sacl, Sacl->AclSize); + } + + return Value; +} + + +static PSD_CACHE_ENTRY +ObpCreateCacheEntry(IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG HashValue, + IN ULONG Index, + OUT PSECURITY_DESCRIPTOR *NewSD) +{ + PSECURITY_DESCRIPTOR Sd; + PSD_CACHE_ENTRY CacheEntry; + ULONG Length; + + DPRINT("ObpCreateCacheEntry() called\n"); + + Length = RtlLengthSecurityDescriptor(SecurityDescriptor); + + CacheEntry = ExAllocatePool(NonPagedPool, + sizeof(SD_CACHE_ENTRY) + Length); + if (CacheEntry == NULL) + { + DPRINT1("ExAllocatePool() failed\n"); + return NULL; + } + + CacheEntry->HashValue = HashValue; + CacheEntry->Index = Index; + CacheEntry->RefCount = 1; + + Sd = (PSECURITY_DESCRIPTOR)(CacheEntry + 1); + RtlCopyMemory(Sd, + SecurityDescriptor, + Length); + + *NewSD = Sd; + + DPRINT("ObpCreateCacheEntry() done\n"); + + return CacheEntry; +} + + +static BOOLEAN +ObpCompareSecurityDescriptors(IN PSECURITY_DESCRIPTOR Sd1, + IN PSECURITY_DESCRIPTOR Sd2) +{ + ULONG Length1; + ULONG Length2; + + Length1 = RtlLengthSecurityDescriptor(Sd1); + Length2 = RtlLengthSecurityDescriptor(Sd2); + if (Length1 != Length2) + return FALSE; + + if (RtlCompareMemory(Sd1, Sd2, Length1) != Length1) + return FALSE; + + return TRUE; +} + + +NTSTATUS +ObpAddSecurityDescriptor(IN PSECURITY_DESCRIPTOR SourceSD, + OUT PSECURITY_DESCRIPTOR *DestinationSD) +{ + PSECURITY_DESCRIPTOR Sd; + PLIST_ENTRY CurrentEntry; + PSD_CACHE_ENTRY CacheEntry; + ULONG HashValue; + ULONG Index; + NTSTATUS Status; + + DPRINT("ObpAddSecurityDescriptor() called\n"); + + HashValue = ObpHashSecurityDescriptor(SourceSD); + Index = HashValue & 0xFF; + + ObpSdCacheLock(); + + if (!IsListEmpty(&ObpSdCache[Index])) + { + CurrentEntry = ObpSdCache[Index].Flink; + while (CurrentEntry != &ObpSdCache[Index]) + { + CacheEntry = CONTAINING_RECORD(CurrentEntry, + SD_CACHE_ENTRY, + ListEntry); + Sd = (PSECURITY_DESCRIPTOR)(CacheEntry + 1); + + if (CacheEntry->HashValue == HashValue && + ObpCompareSecurityDescriptors(SourceSD, Sd)) + { + CacheEntry->RefCount++; + DPRINT("RefCount %lu\n", CacheEntry->RefCount); + *DestinationSD = Sd; + + ObpSdCacheUnlock(); + + DPRINT("ObpAddSecurityDescriptor() done\n"); + + return STATUS_SUCCESS; + } + + CurrentEntry = CurrentEntry->Flink; + } + } + + CacheEntry = ObpCreateCacheEntry(SourceSD, + HashValue, + Index, + DestinationSD); + if (CacheEntry == NULL) + { + DPRINT1("ObpCreateCacheEntry() failed\n"); + Status = STATUS_INSUFFICIENT_RESOURCES; + } + else + { + DPRINT("RefCount 1\n"); + InsertTailList(&ObpSdCache[Index], &CacheEntry->ListEntry); + Status = STATUS_SUCCESS; + } + + ObpSdCacheUnlock(); + + DPRINT("ObpAddSecurityDescriptor() done\n"); + + return Status; +} + + +NTSTATUS +ObpRemoveSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + PSD_CACHE_ENTRY CacheEntry; + + DPRINT("ObpRemoveSecurityDescriptor() called\n"); + + ObpSdCacheLock(); + + CacheEntry = (PSD_CACHE_ENTRY)((ULONG_PTR)SecurityDescriptor - sizeof(SD_CACHE_ENTRY)); + + CacheEntry->RefCount--; + DPRINT("RefCount %lu\n", CacheEntry->RefCount); + if (CacheEntry->RefCount == 0) + { + DPRINT("Remove cache entry\n"); + RemoveEntryList(&CacheEntry->ListEntry); + ExFreePool(CacheEntry); + } + + ObpSdCacheUnlock(); + + DPRINT("ObpRemoveSecurityDescriptor() done\n"); + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ob/security.c b/reactos/ntoskrnl/ob/security.c index d93165cda2c..b5c00dab365 100644 --- a/reactos/ntoskrnl/ob/security.c +++ b/reactos/ntoskrnl/ob/security.c @@ -56,7 +56,7 @@ ObReleaseObjectSecurity(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* - * @unimplemented + * @implemented */ NTSTATUS STDCALL NtQuerySecurityObject(IN HANDLE Handle, @@ -81,7 +81,7 @@ NtQuerySecurityObject(IN HANDLE Handle, } Header = BODY_TO_HEADER(Object); - if (Header->ObjectType != NULL && + if (Header->ObjectType == NULL && Header->ObjectType->Security != NULL) { Status = Header->ObjectType->Security(Object, @@ -93,12 +93,33 @@ NtQuerySecurityObject(IN HANDLE Handle, } else { - Status = STATUS_NOT_IMPLEMENTED; + if (Header->SecurityDescriptor != NULL) + { + /* FIXME: Use SecurityInformation */ + *ResultLength = RtlLengthSecurityDescriptor(Header->SecurityDescriptor); + if (Length >= *ResultLength) + { + RtlCopyMemory(SecurityDescriptor, + Header->SecurityDescriptor, + *ResultLength); + + Status = STATUS_SUCCESS; + } + else + { + Status = STATUS_BUFFER_TOO_SMALL; + } + } + else + { + *ResultLength = 0; + Status = STATUS_UNSUCCESSFUL; + } } ObDereferenceObject(Object); - return(Status); + return Status; } From fbdcc7cb6f48bfb45c7a716f8f8d3991cd31d7f7 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Fri, 16 Jul 2004 17:21:05 +0000 Subject: [PATCH 309/356] Fonts converted by Larry Snyder Converted suitably licensed X fonts from type 1 to TTF for use in ROS. svn path=/trunk/; revision=10143 --- reactos/media/fonts/COPYRIGHT.IBM | 9 +++++++++ reactos/media/fonts/Copyright.Bitstream | 11 +++++++++++ reactos/media/fonts/UTBI____.ttf | Bin 0 -> 101284 bytes reactos/media/fonts/UTB_____.ttf | Bin 0 -> 98740 bytes reactos/media/fonts/UTI_____.ttf | Bin 0 -> 114404 bytes reactos/media/fonts/UTRG____.ttf | Bin 0 -> 110316 bytes reactos/media/fonts/c0419bt_.ttf | Bin 0 -> 71564 bytes reactos/media/fonts/c0582bt_.ttf | Bin 0 -> 70368 bytes reactos/media/fonts/c0583bt_.ttf | Bin 0 -> 62772 bytes reactos/media/fonts/c0611bt_.ttf | Bin 0 -> 61740 bytes reactos/media/fonts/c0632bt_.ttf | Bin 0 -> 61452 bytes reactos/media/fonts/c0633bt_.ttf | Bin 0 -> 62188 bytes reactos/media/fonts/c0648bt_.ttf | Bin 0 -> 67348 bytes reactos/media/fonts/c0649bt_.ttf | Bin 0 -> 69152 bytes reactos/media/fonts/cour.ttf | Bin 0 -> 144456 bytes reactos/media/fonts/courb.ttf | Bin 0 -> 122944 bytes reactos/media/fonts/courbi.ttf | Bin 0 -> 122068 bytes 17 files changed, 20 insertions(+) create mode 100644 reactos/media/fonts/COPYRIGHT.IBM create mode 100644 reactos/media/fonts/Copyright.Bitstream create mode 100644 reactos/media/fonts/UTBI____.ttf create mode 100644 reactos/media/fonts/UTB_____.ttf create mode 100644 reactos/media/fonts/UTI_____.ttf create mode 100644 reactos/media/fonts/UTRG____.ttf create mode 100644 reactos/media/fonts/c0419bt_.ttf create mode 100644 reactos/media/fonts/c0582bt_.ttf create mode 100644 reactos/media/fonts/c0583bt_.ttf create mode 100644 reactos/media/fonts/c0611bt_.ttf create mode 100644 reactos/media/fonts/c0632bt_.ttf create mode 100644 reactos/media/fonts/c0633bt_.ttf create mode 100644 reactos/media/fonts/c0648bt_.ttf create mode 100644 reactos/media/fonts/c0649bt_.ttf create mode 100644 reactos/media/fonts/cour.ttf create mode 100644 reactos/media/fonts/courb.ttf create mode 100644 reactos/media/fonts/courbi.ttf diff --git a/reactos/media/fonts/COPYRIGHT.IBM b/reactos/media/fonts/COPYRIGHT.IBM new file mode 100644 index 00000000000..5e50d448f28 --- /dev/null +++ b/reactos/media/fonts/COPYRIGHT.IBM @@ -0,0 +1,9 @@ +IBM Courier - Copyright (c) IBM Corporation 1990, 1991 + +You are hereby granted permission under the terms of the IBM/MIT X Consortium +Courier Typefont agreement to execute, reproduce, distribute, display, market, +sell and otherwise transfer copies of the IBM Courier font to third parties. + +The font is provided "AS IS" without charge. NO WARRANTIES OR INDEMNIFICATION +ARE GIVEN, WHETHER EXPRESS OR IMPLIED INCLUDING, BUT LIMITED TO THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/reactos/media/fonts/Copyright.Bitstream b/reactos/media/fonts/Copyright.Bitstream new file mode 100644 index 00000000000..a77490018a6 --- /dev/null +++ b/reactos/media/fonts/Copyright.Bitstream @@ -0,0 +1,11 @@ +(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. + +You are hereby granted permission under all Bitstream propriety rights +to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream +Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts +for any purpose and without restriction; provided, that this notice is +left intact on all copies of such fonts and that Bitstream's trademark +is acknowledged as shown below on all unmodified copies of the 4 Charter +Type 1 fonts. + +BITSTREAM CHARTER is a registered trademark of Bitstream Inc. diff --git a/reactos/media/fonts/UTBI____.ttf b/reactos/media/fonts/UTBI____.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d1b4c7893d37427e3057826af5ec864cb7a9f151 GIT binary patch literal 101284 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 z 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 E5BzS~pa1{> literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/UTB_____.ttf b/reactos/media/fonts/UTB_____.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4d027c4892dc70f5b5f9678028fccf50d6d3a88b GIT binary patch literal 98740 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 Gv+o~Wkx-%l literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/UTI_____.ttf b/reactos/media/fonts/UTI_____.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6606a72723aa3753425ea88a27442b627a7ba7f0 GIT binary patch literal 114404 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 pzml!s*YY;_Kk|gHQdfBmrYLB^tQWz5`h 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 literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/c0419bt_.ttf b/reactos/media/fonts/c0419bt_.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4c8a116cf9e401496bf80ea59929c7f4b59b6763 GIT binary patch literal 71564 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 literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/c0582bt_.ttf b/reactos/media/fonts/c0582bt_.ttf new file mode 100644 index 0000000000000000000000000000000000000000..107c54970fca04031e07800e9feeb4dfca4763b7 GIT binary patch literal 70368 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�}|BHk(+TMAvAlgsgZCTMhw7R^I$S0Xnr z-?^}O*Jz1%{5<`*19=k_KEiqxp>1o74*5O!hyy<2fR8xfBM$h813uz_k2v5X4)}cSt?>Bx&kL-on}W%V-Fzr?%R3(wd31PX-ke9=lx;z1Z&J+J^wqC%g=< z)+Y*VyUkdA!j6Moo;}FOI-~aalhuiRW7LV99jFsV`Zw%(?f&=nyw<$_o|l=v8KT)> zl4F-u)qiGqSyoQjhK!T;jpvBAF~_oO=%wLGsbDZ=TSxkLp{Dp0r7lhJaxM|G{%h9e zvYdd2`spY!tI2kR*tNvbMz(z>@!10m0tm3zivX@Z*)UPDt}Rr|J44XTVRA zMJvtkOPt_}UO24`m(xrCY=n>hp2La8{qfXjzFUVUf5m4ih`#hM^8O}jFT5}oVvA6n zOSJ4?nk!IArx~1LA#$N+6)+qpUy6YmpbHoPRs!3A3xLak!@v>1o;4@NKD2{XoU}4x zKiLX(Xq^TTe_%5sr7U{3rIZ-)Or(^FlroW0CQ`~oN|{J06DegPrA(xhxN~O5a1z2q zoarP$-|2~OEM|0xOD!5^=HTyi(!??UyO~FP=o3yQtmQ2gG*crSO;jV&e_U2u)jzKy z8EdbP=j0ZIea^n6T~moc(o)h;lGj&Uos7B*e9?xU4CnH>T9 zEGqLQliEbK-jeuWSKvBorIu==*CgwKN7ZZ$Wvyy<{?zbU!c@Y?`H1HeN@)E)_U_l7f_PiNR0=^lwhEB1HG zYfsiwjdm88JZdxhDdKNSsA5Y;>}BrsGIx5JJH5=EUgl0ObElWN)63lHW$yGccX~5( zrx%IC-H@?3M2JsZFKvrQ%Cvv&_h*NP%MP#YL!LFAWwRN}@e+HUiFwOJHWOAEAT|Lk z)r1k7n72&KTPEf$6Z4jdc}sgrOXM9Z8-N^g%*XH9iYh1Z<4#9}uW5FR@Y>>z3GA%n zm0X+IVE5^@u-;OanBaQ4S!af<;L{~}%t{@8wB)MBxtj(mDs%G&T^?6~&(~EYSsUjL zO`GIGd+__F1`0_bcj4SEQzq5-wXW!^HFM8y-`H~QgrfSQkGMGeW8qa3Lc`-!a6W#Y)j~cO!OlALI*xSRxP70Hr#>sZMn&3*60K1VXv=}laB;8k z!?uOpWvQ}7NB=%1WBm=uS+3l|Y{L4yF@h|QeD#0b8eP}H;p_a_9ntchr5#fav>hCk zVUoN4mN7ESlT-clnr!NNQ!NN}PMuyhd!E)mH>)R&|2CJy_sfmo`1OUgezSHa#S20D zrYJK{ix{gS#;S<1Dq^gP7^@=2s)(^7-wJRTI0D!*u86VXZY^%a>TGkFQn-w5b#_yT z0`))-Fb`M_3<3LrL%?;wtpJ+3&8clGIAd;|`H*vWmStO;5Z_b?SXsP{9>Hb)jE|we zIW=ur+mg3{+ZVs(*~-Zck*QsklN%$`jeRYPr&O+*r}2xi<|&mEr^H&Oq&j*<=Xa!E zCWg!k;_CF_|FPP*@0eNx*E$PW1C7-}W8xif7G)HmKE zzn}i^r~muu|9<+vpZ@Qs|NH6x{!IV()BoH}|2t`CS*HJ&(f@q0R!Yn0|7G<5GWvfR z{lAR8;g#2YP>p^};R+5ugs31k43i0o#Fnz!ku?z%792NrkjGllEjkcP^j85>|?KlR1B> zPkM}raAF;_Y&DE;scAE*QAwaD@NFYrW^XeiL4}zrOBza)B1wBuCkIZ=dxgo z)t1K!~axcE(dy7}lR7 z#S7BEF=rajpwkqo>BbF~{@4fK>OM_6{l-z}5~=-P7KdIw80ocQYDADC*ss zy~r-3j>Djt(Mh>|?69p_{$;NPvK3=Poar{E2t%79i|Ny$DB>Xo!}4YrmbLL=FYLT9 zEH4bp3&Zllu)HuVFAU2I!}7wgyf7>;49g3{l6Rh>iN;b7b%=S=*P;oE)>o2QbJ)ko zG0sS6Im=bm#~wk3d)-zwt6^SOnJYh8IH9tEV36KrezF96dPDxk!E>fH^rzbL3P{nI z=bTs^Y8>1?wS7r!Wn~31A;VRHN{^oyk&P9Vm$9ATDVP}VuISl1zcCzXbfQ}3`f{5} zC#NP;6N`v!R4#l|mLVHm$hA4fo!J;`ap(#|kF_>=!)F(*SZ$g0i0nYcp$X|Jt8|xW z_0~$Hn>p8wgze@@x{XMt~w^lEfcd=87udOc!kReV17jk4{83=C)@P7kV7uykPA8FLJql*LoVcy z3pwOM4!Mv+F61DV25WaPWWO%9EZoFkhOKl+B#%y9kR9# zSzCv!twYw&ThV6HJ0!mFy! zvtrWhu7OnV!iItJ>VdkcGXf$JkByUv70om5uZ$EoR~5%2B^}{l*l>&38kqUuf<<#@ z?p-}`W<|xEnWOTrsVIj0t4bEv>}_go8r(dos-~s6el2!@KR|m)^Prj~Cuvy1lI|{NjM5kaGelbCqv!|!F57#oe*3n1lI|{bwY5R5L_n& zC&4Vlf9EbarNT+tknD6Jeh7M_u~vvMShH%?Y^k=UQhea18TKMpbRc4OWe$;i+MQ^g z)w*P3u%fl>!pf;DCN|fGL#|k`0&k6mD$GXHd z3mP2}vxXR*_*SWl(l4ubjn)^9)*l>KpEFv2>A3oAI|rm*<=E}7(fc};YQSh4f!&xW z92h&XF9vFWE?@vy32Xx{04@g(14jUx4`oi_!Y)6m5#O}1WRFaft>vxpR6)QGh2UH>D8k#>gxR_$*;Eud|^PDlqc2@i1$AmX&%*$TBJF+S(M6P)^u)(mP9f|LMN= zj}jdBlh})2TUyq9dr2^NNwlo_NNH1F;I(PyPZQPEvSW4PrquCvqxASMzbJM#<16vH zP~v#2ly~oDa7JkdTcb@=@33e@)ub!TesekXvZv})m;J@M{=cAuGc*m>Pyr1>2||Nb zz0jale{fvA(4bX+>9~5KL970NRgeCt%qHDFkzTXy+x61ERd2Vi>nA#-eXHJX|D<;8 z_Ic7*%>C>J)xfZ%{dZuk;`vo^`XzI={@u25ziZXY?^^Yl-?i%Hcdh!&@1EFB=Dng9Q?`b)>vOFvun z2kiQl^z*s8-&k$Xe&+dEQ<*LLcf~M}2m93HYvr;uuc4ip)H~Hh;*UeW=^U5l2S)1; zj;XITFCMMGbWDB0n05|GJq{UGJI}Ftn1vN?v+1^WPbD(Mh*|^hkvIre+=#^)F7$@? z?q%tcP-~dgnjgL46PL%-8AwdaI->dFY#N>oMbD)-^^?vy(q$d6~T?%~s5mTV`5%+6oxi0^MP(%Ftk?>*i2; z3ng(}ussPxzjC8rxzVrO=vQtoa-(0l(XZU-S8ntxH~N(u{Ysn%=&hp^9ssPxBvI}) zYwV&$i51NSQg{fkh4ZQVwTW;RAF-)0)2S#UmbsjrT3H;Nuu=2xq!V?#4pTNhG%jbT z?-VnQ?mK};XMF?4W)yw;R8o+dJH(kFQBxZ~!I{9GTS@c4=p1^7J%?t%o5^WOy*ReP zn`H`dz0SF(=hlF(zi3>&%u%cU;JA93qgK6~fc|Ig9I)$!H{g%Q^&g-H9+0i)%%ik# z)o0q5>+!=GtZa?$rDmSb^N1V!)(7+NtOzfGhMv9B=Cd8kk*XTs0y5AW~7I=zt zW8Q+!WHKk3Q&?D>7tN_C?~F!si#!G8acAlA2aN)sH{Xoi95Ef<0$;viCWAr0w_rzs z*B=Tb4RbN)V2g5ZcSH((@%WW%Jq3}qSH|Py~kl{U#E(QIaz+HI%e0dE+NkL_>eW z`&L>auEYYr(qiFm3X;U69_Rt)0jq%_U_WpOxDL1#5EkCUkggk*W42DN9Y_}=fTrvB z6n7>uBaFz_G$LPwQX}`7kc0`LiT2%}5hwkK6WJu7Q(P1xKpij%mzbPy>d)?N zT#}kT%cy8OGgVn#Q#of-+p5Y`Rdr?ROylK(^16zEKSHY9nbUe^68JKaA1n69+h*3* z&7P3>(&X(84ULWUb;CV9=TM54G+bm%sY<0*wbI5MX`-!db!8<1#h7Eanf1m!oG&c5 zPRvN?Hp?5E=#!#USx3cL{%VgW9ANAYnrfUGC@KmVM-$fL%@FE5O5uEE1;XYn+JOs(DdV` z5C!Ui9$+4@8W;lh1BZa?fLj4EPRZW~M)~4es8hCEwv1A@Q&cV-3}v5>l_B$2-drpp z6Lo1OrK!4vDF-c9MnZPFhy!P-N)c!~lA-Mg#R#+=fwm*ib_CjvK-&>$I|6M-pzR2> zZJi^Ng9MXds`F@ft$s$S5qBp!QMiQ9seEpPx#H~k?+~|xxnZ$j%|3-nEavRY!^__0 z#jx5IEFndm;%3-ruoHi3q`tU15L^`x;rCJ$imw|ONS5ZfI&v!GrG)qF@OlI8MBfa8 zo1QAcA3qZJ6~+VkKXnJf%bLlCM+_II=`l8PWTaY*jn>%& zk!-$96x(c|-$LoENgivS#?&N0rujna#<}8MLf*O&L zH#HB_oYM!j>2uvB{MxCX>lV(L;;AN%(w4nLne`jU#vvc!2Q&WavM-4`g;7FWR>VJ; zQx-HNaoOciLWEB_rY47?B_x8pdK;e-EHIRDU*l6-yi(#B$EbH__h#UK4qF~~|F-5m zc&T04xNQ2?{_0ihUnQ<$OLci!)2HA4uJ)SPlzFQ$dHld#I(XAzBcte~jl92McB9(uXM|;`c4SQOEqyeON~yiUk*rFK*3IK#s=r z0P}#=z!0z>I0Re=+zLn^%KU5@?L*tuBHM>{K%8uaJ%h96@9aLxh^nTSE#V|?206NK zPfq)i!%vEqQwGT77H=y=kGA#Dv1M#)Fr9Q)XH17y_hNk%qcrYhE6bW&J+x%@jWy88!AOlMSEl| zFKc{jEw61d$~1iG<;EGNxXZ?3*>Ojfc%^**_>(U;o#B8JV1DoR_qAE#AawOYwqqf@9k+JU4 zHN3q$>}Gcu&dBT$mvZrd6DCpq7`;{u(O4!Jcnp%x67dG7X!KbOt!i6l^AhM?@9}n& zjHxx6i<9LgCFRK%%gc|?FE9UbNxA-N<`99kB3V+ByuFHl@8+9am!u0J(pL67>dgz8 zdoztgSXOz**}yEGs+Xth#U+&8Y>T!|eNWuhEHZwrR@}{YcJMe&Xzk#6pf7#2Q234q z`tm?u9_Y&heR-fS5A@}MzC6&E2m10rUy=<X_D^+2H>DAWUmdZ6^$^jbb|0fZ5X zMdtM62%Di4>IEFl^2;0D9H||*S1X$K=vHlZr&dlQXqOUWKqu?#CvjitLQhqEbAFD? zSG2gaKH!ZuB{$|e9WGyZ-tuL#SKC2~zvlT{y8NZayDKKmshu%c**&**`e1iwv@yr) z3b-p1v4UJ@tfbyFJ^6lj+2G;+?oDSjmUW)d)U|P5qj>pOq$in0_=a?;>*@C(VmACli#NpA*MPb@3V^#{X#=Q*`yO)DZs51DVuCbg71TXKAn z3S&NUL(<+1l-*Po^Z0ym)1-oQyrjNy^~t&4UxvLgQsLYr^ZOiik@0&YjZFT4Bz!5+ z3;hCST`sdOS9ThIMCA(rBq?VbPW=?iU0nMRAZHs&Xi)^F&P+y`^M`jc>%IEt|shfe->v1Z}oV6MV^b^=?VJ+h3~wG7Y-F3c&DeB zEwxLGKX{6KUe86B$TfxUJm3j&4c|!9>bZnT1Mi-a{uFVGZ(%Zb;RE(7Jq&nXT@QnAVjrLl6(*d*LVLC=hq ziObr`ynf>oiD3QBx7Di>U9_Q>`q1tCf0Ep0S8Hsq(x#Mh7gc0~cCTO}o z6ea5xSfxIdgU}I@91ZLkcs$1yFZAroB_vaM`3vRA#b&D!Dadz3jnMIXWBfDVT?p}J z<3)1^Ew`#m$H$v?FeDC!q@CdjLQDC44^l3sEZR}2{V5(3rF^g9Q%)0T->q0{*1j@= z_F|v|%B+<2mxl|B_>@(GoIt6zKU;VoD;%9Zio`%yi2t@M89>au%&0T4`sgcTepR5j z#BcP7Y3BI1tj~QRY&QF(eqT5c2<>YY>kWBy!p3DG@YR8$V*l0D6A)l){Eq%437UF<;4xFB&^%Yiz_AM*1w+@_ZPFWd2tiRpSSYjUL$#NON{o{ z%Zn>3LvsWH?{qvnJ}+*TXI8SR?NY;rVOgN9T~$%KvpJM9CIj(wbV8~YZ)7npM{OlJ zXbsQ>3;<#j-UeI%Tn-!tjsUi{-GdzuOE(&F6|$^HcTV?cX@^}prgosyV{m>Ajv&)d zb6z{bcy@==CMC^zw=uh{t&QcB~v1iGcO4bmK-To_(#c3(ap8X^~mIo zn_mBlsfI+c&4zO6uCA5IDVdC{>6lr=Tk_O$GP6&UW)_#m<8WK=H33hK_fTHGD>uJ1 z!)<#G9z1irAbp{4{tV6<2SeUqQ@pGuS>gJ7qOnxbjVC4n<`MzjHutRwC`_!}W=>2M{QEA0z zl6@kyK1qP~Fkr8|Yw6NjRz|gqY%MFJS_YyPrdrF&sFsycEi0p1Rz|gYWh7?>rs#1m zu}dP4b*pdqM6~5~i4*;(rKelgRCqm#P$o15#tc!6Dk(|CsJmfzF`ZamRHD-ncbJI{ z9b~o;pph~x2{QUR9~kylvVzr&J3c682IHNBk)|1SsV+Rlyzb&ebxC7uD(Nluy8~f= zB2-XW9xRI$yFLDrI->ZuRtAl)RLzJrRfNdQT2L4!8&-8$Nx5klxrN01AwGM4C=e<2 zkSVJmKUU(C(}faJ>1t%{*O9dy>a!!PKJ8PWGLBKkF`5}i$zT;_9HWe5lyQtQj#0)j z$~ZGh65ugs31k43i0o#Fn zz!ku?z%78@ud(dZqULKqJALwUtdeRU#k5Q|dB%kfGwkt(G4Ym!pA3b3oY!vcL;)#{ z5t|}VQrnRzYpV<;x)ya9^#OmVIFRS4@D)Tt-bgeasOU%~Dv224%P))+d4d&9(PT&4 z#3UXXDrLdS^}U-yz=p}4QaXS%&*N99XNU$OpT zEcN>DbVef1JN@2lNm%`t$)R?mxr&D^Gs34g>a1-4vL()Zrw6PRV}cc%_X3@1T>czB_vrfhUuCFT_nm=nVg`M@Sa*mjE$e?I8Bl9 zP{_sv8OeBw$~s)s&h9T~VkBLh$;h@aH%Lad8Fox0<5kJXR$P#iIR02T6qOVwWBwgA zo^mYCnUQlew=DOdbF%YF=TmvEyghl}aDCcc=l)s#Zwd|;ws=g>CEiDTxBDmgZ}dME zC=AR9c7-N|ZVw+Unp^a6@!H}amE0Ry7`Y}IjD8{JiXDkpCJGZ*mp)bY{_=a0k>rCF zO%?Z6uBm(^)s(tA^{c9ZsvD}lQC(U6YR#`|KU;T0{nGkp8Xj!Cp=q!=+5G92NNZi2 zYJ0BznF)_{tekjxXHDm;T`RkO(S1($6O*<~`tGDxde-+mGI`VF7pD|XSv$3O>c^)Y zoqoymFU+{6Z+YL5zSm|A%z9~dV)jS+C-(2_|Jgv*zmJx$cg2_pEzx-4pA6w(j@qURj^B-oHMvzHa@* z^)uEFu3xo&%lh-yA6S3I`fJwTu>SV-$2QE|uyDhg4cj*C-f(ckl^YIkxN*a0H{8A9 zfenvu`00ihHvDy?xzW2Zwy|d8gpJcSp0RP|rn=2*H(#;kS6jVX@7T6-+oo+-o}D=R ztJ{Az^!A}w&-w0-TXy_$c=x&6cfNhs`d!D*%Rg`DTg3+F#|uh!Qsv)Tz$%MnRJQu$ zpCk?#w#yC-N$1<;9Lyk>*<}d`e7#+EQh%FWb|EV7$0EUTDOx&4pfIa!sHE`;yNt!e zxX&&-R2AnFtZQ;qi}4q`oU6*r3cKu7E#`E)>{1KOb7$>3Z~yM0v$yX_w)gb3B{!a* z+_*EjcjtL~Hw_P+zkTbLVynof=MN5~Tcwutho{hspn^$h#eg4p{oyiF;ZO!d1ZT3~|ZMw0U%bTsM zPVtd(Dcq&bgTw5G)0~a;*~4O8d|rBR#!M27@O+JTg7=ad_dM_>hHi-Z?S!k`LjBul zVYk{rX%p=v@v|GEmGgn!T(ObR3rV=yPPG|%o8*5V_Yd=#{YCi=x%PZuH|nyqYh5c( zw-Y6Lh?=dG_E6f$-7WgL_v$v}9(iVY-o^U2H}h;ux&CaPc9`pTqmC~U<(8O`eLPq*~mW& z?y*j-$L(MPgK!gG`Io7CSW_KgZS@t*(O*I|epP)<-K*|XUm$kz{e}Z2>fP!aEVJ%Z zpN4-tpl)Pf-lv{YPa8Sv$Lbj}^!!BqR6VPHrhcxzsIF2UBOl8L)E(;M>IU_s`lb4W z`aFX7A!5XCQlDYaKdZ^`K{Um0t4D}W|6TPc#QB)|9;Eht^*J)mJfVI7@%<3HOyruy&Ye{U#o-aV)afuuJ2aQtM{t+s86aZ z)t}&Pe^9?uzrh3f7@ER|)r;z7^VxW!>aXfA>LvAiwtI4NTXyap9`>HMb@$M& zEt_F8TX%2W;yicb=H0t?GUf)c$N0zizT!$V+Ii`JFybz7zH);LRDSw3{#pR`s6sG- z`_g}h5(N8|7aUN&^s7*X9~>g9->XnZ5L~1}>AyiGf=g5w98pE-SD=_;aE$!xuRuAG z^nXJ=Q7}iw!DT82E+?|_U!kT1xI&eJD^(fZ@+nmguF|+#CGoniVb9`aD6JA)r&8d0 zRh9k=R96jd)VK-1{Fk7>T5yZ11GlRB^q--|25>uBP5%s43hq!%=@+5SW^ku!0e7*l z_9rN{4LnJ;gL}Y#glZ>%d&%1ON2qrqc&h45{{brQ0#8@n;2GfGL(!AKGgS|GmYSUY z9n{?m?#CkgJE(jrcnQnHC z-QdgA`QXdJPr?iKfUi({!H3iZ;49VJ(m!Oj?E}A8?FYXP`~&#H+rj^#E(Bkt4y2!e zD_jJ=S{(#`P`v|u4fy-&L+WDiVf9Y%ht(zN$62&p3cijL36HCfsLRsdQym1t_;fvX9=O?@!^h`L=}1OANq5csp|aQfTuqYs1cP}hP#ukjbub?JxUbRPkK zNqrQ2r@B7<5WC(V1Ake49DEG?AWMw@1mCT00FS6ofbUT^roRQJy$SqP^-1v8zz@K0 zZwB9|j)3o1pGtpIeO=uG{)W00{7v;~@B`p)z(sEZKd5d8KcqgB{yKd0vtXVS{D`^( z{2lQ9@YTEzz7G!jCGg|wPVo2D(e%A=TERbH#da_J_89m{byxapaQC~x zPpc8|kJLTsufpjCKcl_^{)zf(`YZ7KuYsQ>WA<0z{r7=?uI^9Y1NRsFOZ9c|uhciv zBXH(#f}c|lfS*_2O5Y7Peh~ayjbBg?QU0BJIDHqK_}kz=s7JtmRNqM-gMWV){G!Hx zR*$B?48ML1{1^2-@XP9P@PDcAr;ozRp8)^2#;>R!r0-OJQ$Ga1s-6V@T|Jfll6p-& S4gQDv5%{>qY4zju7ykzqk2e$m literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/c0583bt_.ttf b/reactos/media/fonts/c0583bt_.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8402ef63f95594ece1c1762ddc4116bbcc6b0812 GIT binary patch literal 62772 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 U@Jsf(d>0#GZve{dP5G|>1G(7jApigX literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/c0611bt_.ttf b/reactos/media/fonts/c0611bt_.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3756d90fd7ac13899bfe143efa1faf79998b820e GIT binary patch literal 61740 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

must be inside ."); + if (data->inSection) + XML_FATAL1 ("nested
elements."); + if (attr[0]) + XML_FATAL1 ("attributes specified on
element."); + data->inSection = GL_TRUE; + break; + case OI_DESCRIPTION: + if (!data->inSection && !data->inOption) + XML_FATAL1 (" must be inside or inDesc) + XML_FATAL1 ("nested elements."); + data->inDesc = GL_TRUE; + parseDescAttr (data, attr); + break; + case OI_OPTION: + if (!data->inSection) + XML_FATAL1 ("

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 literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/c0648bt_.ttf b/reactos/media/fonts/c0648bt_.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3f9e84cbb4f3608ac99a39645f9f988c785d7009 GIT binary patch literal 67348 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 literal 0 HcmV?d00001 diff --git a/reactos/media/fonts/cour.ttf b/reactos/media/fonts/cour.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d5af139f7671ede29c2d2860ecf78b5e1ca68338 GIT binary patch literal 144456 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%0DLPNld5X?cbe^K~6rHE&JVoazI#1Dgiq2DXo}%*< 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 GSN{ik3}X=h literal 0 HcmV?d00001 From fa2ac0c0ca84c8d6798a933e224e456c912c96ef Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 16 Jul 2004 19:54:05 +0000 Subject: [PATCH 310/356] Fix an old typo. svn path=/trunk/; revision=10144 --- reactos/ntoskrnl/ex/sysinfo.c | 22 ++++++------ reactos/ntoskrnl/ob/handle.c | 63 +++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 9c238b8802d..bb04e18b083 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.37 2004/06/23 21:01:27 ion Exp $ +/* $Id: sysinfo.c,v 1.38 2004/07/16 19:49:15 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -497,7 +497,7 @@ QSI_DEF(SystemPerformanceInformation) QSI_DEF(SystemTimeOfDayInformation) { LARGE_INTEGER CurrentTime; - + PSYSTEM_TIMEOFDAY_INFORMATION Sti = (PSYSTEM_TIMEOFDAY_INFORMATION) Buffer; @@ -593,24 +593,24 @@ QSI_DEF(SystemProcessInformation) SpiCur->BasePriority = pr->Pcb.BasePriority; SpiCur->ProcessId = pr->UniqueProcessId; SpiCur->InheritedFromProcessId = (DWORD)(pr->InheritedFromUniqueProcessId); - SpiCur->HandleCount = ObpGetHandleCountbyHandleTable(&pr->HandleTable); + SpiCur->HandleCount = ObpGetHandleCountByHandleTable(&pr->HandleTable); SpiCur->VmCounters.PeakVirtualSize = pr->PeakVirtualSize; SpiCur->VmCounters.VirtualSize = pr->VirtualSize.QuadPart; SpiCur->VmCounters.PageFaultCount = pr->LastFaultCount; SpiCur->VmCounters.PeakWorkingSetSize = pr->Vm.PeakWorkingSetSize; // Is this right using ->Vm. here ? SpiCur->VmCounters.WorkingSetSize = pr->Vm.WorkingSetSize; // Is this right using ->Vm. here ? SpiCur->VmCounters.QuotaPeakPagedPoolUsage = - pr->QuotaPeakPoolUsage[0]; + pr->QuotaPeakPoolUsage[0]; SpiCur->VmCounters.QuotaPagedPoolUsage = - pr->QuotaPoolUsage[0]; + pr->QuotaPoolUsage[0]; SpiCur->VmCounters.QuotaPeakNonPagedPoolUsage = - pr->QuotaPeakPoolUsage[1]; - SpiCur->VmCounters.QuotaNonPagedPoolUsage = - pr->QuotaPoolUsage[1]; + pr->QuotaPeakPoolUsage[1]; + SpiCur->VmCounters.QuotaNonPagedPoolUsage = + pr->QuotaPoolUsage[1]; SpiCur->VmCounters.PagefileUsage = pr->PagefileUsage; // FIXME SpiCur->VmCounters.PeakPagefileUsage = pr->PeakPagefileUsage; - // KJK::Hyperion: I don't know what does this mean. VM_COUNTERS - // doesn't seem to contain any equivalent field + // KJK::Hyperion: I don't know what does this mean. VM_COUNTERS + // doesn't seem to contain any equivalent field //SpiCur->TotalPrivateBytes = pr->NumberOfPrivatePages; //FIXME: bytes != pages pr = PsGetNextProcess(pr); @@ -627,7 +627,7 @@ QSI_DEF(SystemProcessInformation) *ReqSize = ovlSize; if (pr != NULL) { - ObDereferenceObject(pr); + ObDereferenceObject(pr); } return (STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/ob/handle.c b/reactos/ntoskrnl/ob/handle.c index edd5a8a64a8..3bc6c843b23 100644 --- a/reactos/ntoskrnl/ob/handle.c +++ b/reactos/ntoskrnl/ob/handle.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: handle.c,v 1.56 2004/05/04 20:18:52 jimtabor Exp $ +/* $Id: handle.c,v 1.57 2004/07/16 19:54:05 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -950,39 +950,44 @@ ObInsertObject(IN PVOID Object, } -ULONG -ObpGetHandleCountbyHandleTable(PHANDLE_TABLE HandleTable) +ULONG +ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable) { -unsigned int i, Count=0; -PHANDLE_BLOCK blk; -POBJECT_HEADER Header; -PVOID ObjectBody; -KIRQL oldIrql; + PHANDLE_BLOCK blk; + POBJECT_HEADER Header; + PVOID ObjectBody; + KIRQL OldIrql; + PLIST_ENTRY current; + ULONG i; + ULONG Count=0; -PLIST_ENTRY current = HandleTable->ListHead.Flink; - - KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql); + KeAcquireSpinLock(&HandleTable->ListLock, &OldIrql); + current = HandleTable->ListHead.Flink; while (current != &HandleTable->ListHead) - { - blk = CONTAINING_RECORD(current, HANDLE_BLOCK, entry); + { + blk = CONTAINING_RECORD(current, HANDLE_BLOCK, entry); - for ( i=0; ihandles[i].ObjectBody); - - if (ObjectBody != NULL) - { - Header = BODY_TO_HEADER(ObjectBody); - /* Make sure this is real. */ - if (Header->ObjectType != NULL) - Count++; - } - } - current = current->Flink; - } - KeReleaseSpinLock(&HandleTable->ListLock, oldIrql); - return (Count); + for (i = 0; i < HANDLE_BLOCK_ENTRIES; i++) + { + ObjectBody = OB_ENTRY_TO_POINTER(blk->handles[i].ObjectBody); + if (ObjectBody != NULL) + { + Header = BODY_TO_HEADER(ObjectBody); + + /* Make sure this is real. */ + if (Header->ObjectType != NULL) + Count++; + } + } + + current = current->Flink; + } + + KeReleaseSpinLock(&HandleTable->ListLock, + OldIrql); + + return Count; } /* EOF */ From f82a992ec206f1adff198663d14180ebe851ae0a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Fri, 16 Jul 2004 20:20:53 +0000 Subject: [PATCH 311/356] fixed typo svn path=/trunk/; revision=10145 --- reactos/ntoskrnl/ps/process.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 5c2580f7259..d3d64807294 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.132 2004/07/07 16:28:35 navaraf Exp $ +/* $Id: process.c,v 1.133 2004/07/16 20:20:53 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -1125,7 +1125,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, else { PULONG HandleCount = (PULONG)ProcessInformation; - *HandleCount = ObpGetHandleCountbyHandleTable(&Process->HandleTable); + *HandleCount = ObpGetHandleCountByHandleTable(&Process->HandleTable); if (ReturnLength) { *ReturnLength = sizeof(ULONG); From 016e6a3f65a0ebe84e1ee0e8e80c675bc8d7d775 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Jul 2004 20:24:59 +0000 Subject: [PATCH 312/356] - Implementation of mmTaskCreate. Based on patch by Eric Pouech. svn path=/trunk/; revision=10146 --- reactos/include/mmddk.h | 10 ++++++++ reactos/lib/winmm/winmm.c | 49 +++++++++++++++++++++++++++++++++++- reactos/lib/winmm/winmm.spec | 1 + 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/reactos/include/mmddk.h b/reactos/include/mmddk.h index 15ef1ad763e..29f7b7cba0f 100644 --- a/reactos/include/mmddk.h +++ b/reactos/include/mmddk.h @@ -449,6 +449,16 @@ BOOL WINAPI mciFreeCommandResource(UINT uTable); BOOL WINAPI DriverCallback(DWORD dwCallBack, UINT uFlags, HDRVR hDev, UINT wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2); +typedef void (*LPTASKCALLBACK)(DWORD dwInst); + +#define TASKERR_NOTASKSUPPORT 1 +#define TASKERR_OUTOFMEMORY 2 +MMRESULT WINAPI mmTaskCreate(LPTASKCALLBACK, HANDLE*, DWORD); +void WINAPI mmTaskBlock(HANDLE); +BOOL WINAPI mmTaskSignal(HANDLE); +void WINAPI mmTaskYield(void); +HANDLE WINAPI mmGetCurrentTask(void); + #ifdef __WINESRC__ #define WAVE_DIRECTSOUND 0x0080 #endif diff --git a/reactos/lib/winmm/winmm.c b/reactos/lib/winmm/winmm.c index 575f5105493..3df138046e3 100644 --- a/reactos/lib/winmm/winmm.c +++ b/reactos/lib/winmm/winmm.c @@ -102,8 +102,9 @@ static void WINMM_DeleteIData(void) * inside WINMM_IData */ CloseHandle(WINMM_IData->psStopEvent); CloseHandle(WINMM_IData->psLastEvent); + WINMM_IData->cs.DebugInfo = NULL; DeleteCriticalSection(&WINMM_IData->cs); - HeapFree(GetProcessHeap(), 0, WINMM_IData); + HeapFree(GetProcessHeap(), 0, WINMM_IData); WINMM_IData = NULL; } } @@ -3176,3 +3177,49 @@ UINT WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE); } + +struct mm_starter +{ + LPTASKCALLBACK cb; + DWORD client; + HANDLE event; +}; + +DWORD WINAPI mmTaskRun(void* pmt) +{ + struct mm_starter mms; + + memcpy(&mms, pmt, sizeof(struct mm_starter)); + HeapFree(GetProcessHeap(), 0, pmt); + mms.cb(mms.client); + if (mms.event) SetEvent(mms.event); + return 0; +} + +MMRESULT WINAPI mmTaskCreate(LPTASKCALLBACK cb, HANDLE* ph, DWORD client) +{ + HANDLE hThread; + HANDLE hEvent; + struct mm_starter *mms; + + mms = HeapAlloc(GetProcessHeap(), 0, sizeof(struct mm_starter)); + if (mms == NULL) { return TASKERR_OUTOFMEMORY; } + + mms->cb = cb; + mms->client = client; + if (ph) { + mms->event = hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + } else { + mms->event = NULL; + } + + hThread = CreateThread(0, 0, mmTaskRun, (LPVOID)&mms, 0, NULL); + if (!hThread) { + HeapFree(GetProcessHeap(), 0, mms); + CloseHandle(hEvent); + return TASKERR_OUTOFMEMORY; + } + if (ph) *ph = hEvent; + CloseHandle(hThread); + return 0; +} diff --git a/reactos/lib/winmm/winmm.spec b/reactos/lib/winmm/winmm.spec index dc13c46b537..7dd06bced9a 100644 --- a/reactos/lib/winmm/winmm.spec +++ b/reactos/lib/winmm/winmm.spec @@ -135,6 +135,7 @@ @ stdcall mmioStringToFOURCCW(wstr long) @ stdcall mmioWrite(long ptr long) @ stdcall mmsystemGetVersion() +@ stdcall mmTaskCreate(ptr ptr long) @ stdcall sndPlaySoundA(ptr long) @ stdcall sndPlaySoundW(ptr long) @ stdcall timeBeginPeriod(long) From 15971f9aa54d1720690005b64a4db3586c257bc3 Mon Sep 17 00:00:00 2001 From: Jens Collin Date: Fri, 16 Jul 2004 20:39:06 +0000 Subject: [PATCH 313/356] ShellExecute is run when executable is not found to open for example Notepad files by typing "myfile.txt". svn path=/trunk/; revision=10147 --- reactos/subsys/system/cmd/cmd.c | 106 +++++++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 15 deletions(-) diff --git a/reactos/subsys/system/cmd/cmd.c b/reactos/subsys/system/cmd/cmd.c index 7fc6c6692b8..b979d3b9d80 100644 --- a/reactos/subsys/system/cmd/cmd.c +++ b/reactos/subsys/system/cmd/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.16 2004/06/21 18:57:22 weiden Exp $ +/* $Id: cmd.c,v 1.17 2004/07/16 20:39:06 jc Exp $ * * CMD.C - command-line interface. * @@ -37,7 +37,7 @@ * message! * * changed the format to call internal commands (again) so that if - * they want to split their commands, they can do it themselves + * they want to split their commands, they can do it themselves * (none of the internal functions so far need that much power, anyway) * * 27 Aug 1996 (Tim Norman) @@ -124,8 +124,11 @@ * Make MakeSureDirectoryPathExistsEx unicode safe. * * 28-Mai-2004 (Hartmut Birr) - * Removed MakeSureDirectoryPathExistsEx. + * Removed MakeSureDirectoryPathExistsEx. * Use the current directory if GetTempPath fails. + * + * 12-Jul-2004 (Jens Collin ) + * Added ShellExecute call when all else fails to be able to "launch" any file. */ #include "config.h" @@ -146,6 +149,8 @@ #include "cmd.h" #include "batch.h" +#include + typedef NTSTATUS (STDCALL *NtQueryInformationProcessProc)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); typedef NTSTATUS (STDCALL *NtReadVirtualMemoryProc)(HANDLE, PVOID, PVOID, ULONG, PULONG); @@ -241,6 +246,68 @@ static BOOL IsConsoleProcess(HANDLE Process) } + +#ifdef _UNICODE +#define SHELLEXECUTETEXT L"ShellExecuteW" +#else +#define SHELLEXECUTETEXT "ShellExecuteA" +#endif + +typedef HINSTANCE (WINAPI *MYEX)( + HWND hwnd, + LPCTSTR lpOperation, + LPCTSTR lpFile, + LPCTSTR lpParameters, + LPCTSTR lpDirectory, + INT nShowCmd +); + + + +static BOOL RunFile(LPTSTR filename) +{ + HMODULE hShell32; + MYEX hShExt; + HINSTANCE ret; + +#ifdef _DEBUG + DebugPrintf (_T("RunFile(%s)\n"), filename); +#endif + hShell32 = LoadLibrary(_T("SHELL32.DLL")); + if (!hShell32) + { +#ifdef _DEBUG + DebugPrintf (_T("RunFile: couldn't load SHELL32.DLL!\n")); +#endif + return FALSE; + } + + hShExt = (MYEX)(FARPROC)GetProcAddress(hShell32, SHELLEXECUTETEXT); + if (!hShExt) + { +#ifdef _DEBUG + DebugPrintf (_T("RunFile: couldn't find ShellExecuteA/W in SHELL32.DLL!\n")); +#endif + FreeLibrary(hShell32); + return FALSE; + } + +#ifdef _DEBUG + DebugPrintf (_T("RunFile: ShellExecuteA/W is at %x\n"), hShExt); +#endif + + ret = (hShExt)(NULL, _T("open"), filename, NULL, NULL, SW_SHOWNORMAL); + +#ifdef _DEBUG + DebugPrintf (_T("RunFile: ShellExecuteA/W returned %d\n"), (DWORD)ret); +#endif + + FreeLibrary(hShell32); + return (((DWORD)ret) > 32); +} + + + /* * This command (in first) was not found in the command table * @@ -263,7 +330,7 @@ Execute (LPTSTR full, LPTSTR first, LPTSTR rest) /* check for a drive change */ if ((_istalpha (first[0])) && (!_tcscmp (first + 1, _T(":")))) - { + { BOOL working = TRUE; if (!SetCurrentDirectory(first)) /* Guess they changed disc or something, handle that gracefully and get to root */ @@ -353,8 +420,17 @@ Execute (LPTSTR full, LPTSTR first, LPTSTR rest) } else { - ErrorMessage (GetLastError (), - _T("Error executing CreateProcess()!!\n")); +#ifdef _DEBUG + DebugPrintf (_T("[ShellExecute: %s]\n"), full); +#endif + // See if we can run this with ShellExecute() ie myfile.xls + if (!RunFile(full)) + { +#ifdef _DEBUG + DebugPrintf (_T("[ShellExecute failed!: %s]\n"), full); +#endif + error_bad_command (); + } } // restore console mode SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ), @@ -420,7 +496,7 @@ DoCommand (LPTSTR line) /* Terminate first word */ *cp = _T('\0'); - + /* commands are limited to MAX_PATH */ if(_tcslen(com) > MAX_PATH) { @@ -591,16 +667,16 @@ VOID ParseCommandLine (LPTSTR cmd) /* Create unique temporary file name */ GetTempFileName (szTempPath, _T("CMD"), 0, szFileName[1]); - + /* Set current stdout to temporary file */ hFile[1] = CreateFile (szFileName[1], GENERIC_WRITE, 0, &sa, TRUNCATE_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL); - + if (hFile[1] == INVALID_HANDLE_VALUE){ ConErrPrintf (_T("Error creating temporary file for pipe data\n")); return; } - + SetStdHandle (STD_OUTPUT_HANDLE, hFile[1]); DoCommand (s); @@ -747,7 +823,7 @@ VOID ParseCommandLine (LPTSTR cmd) /* close old stdin file */ #if 0 /* buggy implementation */ SetStdHandle (STD_INPUT_HANDLE, hOldConIn); - if ((hFile[0] != INVALID_HANDLE_VALUE) && + if ((hFile[0] != INVALID_HANDLE_VALUE) && (hFile[0] != hOldConIn)) { /* delete old stdin file, if it is a real file */ @@ -835,7 +911,7 @@ VOID ParseCommandLine (LPTSTR cmd) * */ -static INT +static INT ProcessInput (BOOL bFlag) { TCHAR commandline[CMDLINE_LENGTH]; @@ -1248,7 +1324,7 @@ static VOID Cleanup (int argc, TCHAR *argv[]) FreeLastPath (); #endif -#ifdef FEATURE_HISTORY +#ifdef FEATURE_HISTORY CleanHistory(); #endif @@ -1329,8 +1405,8 @@ int main (int argc, char *argv[]) SetFileApisToOEM(); - hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, + hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (GetConsoleScreenBufferInfo(hConsole, &Info) == FALSE) { From a3ce97af9b8bca023ac1cef061b3e7352d7f679e Mon Sep 17 00:00:00 2001 From: Gregor Anich Date: Fri, 16 Jul 2004 21:50:40 +0000 Subject: [PATCH 314/356] Import Mesa-6.0.1 for use as software OpenGL renderer. svn path=/trunk/; revision=10148 --- reactos/lib/mesa32/Makefile | 256 + reactos/lib/mesa32/Mesa.dsw | 179 + reactos/lib/mesa32/README.ReactOS | 8 + reactos/lib/mesa32/include/GL/amesa.h | 65 + reactos/lib/mesa32/include/GL/dmesa.h | 148 + reactos/lib/mesa32/include/GL/fxmesa.h | 103 + reactos/lib/mesa32/include/GL/ggimesa.h | 85 + reactos/lib/mesa32/include/GL/gl.h | 2241 +++++++ reactos/lib/mesa32/include/GL/gl_mangle.h | 1356 ++++ reactos/lib/mesa32/include/GL/glext.h | 5919 +++++++++++++++++ reactos/lib/mesa32/include/GL/glu.h | 340 + reactos/lib/mesa32/include/GL/glu_mangle.h | 86 + reactos/lib/mesa32/include/GL/glx.h | 504 ++ reactos/lib/mesa32/include/GL/glx_mangle.h | 55 + reactos/lib/mesa32/include/GL/glxext.h | 607 ++ .../lib/mesa32/include/GL/internal/glcore.h | 471 ++ reactos/lib/mesa32/include/GL/mesa_wgl.h | 123 + reactos/lib/mesa32/include/GL/mglmesa.h | 79 + reactos/lib/mesa32/include/GL/osmesa.h | 274 + reactos/lib/mesa32/include/GL/svgamesa.h | 97 + reactos/lib/mesa32/include/GL/uglglutshapes.h | 45 + reactos/lib/mesa32/include/GL/uglmesa.h | 155 + reactos/lib/mesa32/include/GL/vms_x_fix.h | 880 +++ reactos/lib/mesa32/include/GL/wmesa.h | 140 + reactos/lib/mesa32/include/GL/xmesa.h | 390 ++ reactos/lib/mesa32/include/GL/xmesa_x.h | 90 + reactos/lib/mesa32/include/GL/xmesa_xf86.h | 187 + reactos/lib/mesa32/mesa32.def | 138 + reactos/lib/mesa32/mesa32.edf | 107 + 29 files changed, 15128 insertions(+) create mode 100644 reactos/lib/mesa32/Makefile create mode 100644 reactos/lib/mesa32/Mesa.dsw create mode 100644 reactos/lib/mesa32/README.ReactOS create mode 100644 reactos/lib/mesa32/include/GL/amesa.h create mode 100644 reactos/lib/mesa32/include/GL/dmesa.h create mode 100644 reactos/lib/mesa32/include/GL/fxmesa.h create mode 100644 reactos/lib/mesa32/include/GL/ggimesa.h create mode 100644 reactos/lib/mesa32/include/GL/gl.h create mode 100644 reactos/lib/mesa32/include/GL/gl_mangle.h create mode 100644 reactos/lib/mesa32/include/GL/glext.h create mode 100644 reactos/lib/mesa32/include/GL/glu.h create mode 100644 reactos/lib/mesa32/include/GL/glu_mangle.h create mode 100644 reactos/lib/mesa32/include/GL/glx.h create mode 100644 reactos/lib/mesa32/include/GL/glx_mangle.h create mode 100644 reactos/lib/mesa32/include/GL/glxext.h create mode 100644 reactos/lib/mesa32/include/GL/internal/glcore.h create mode 100644 reactos/lib/mesa32/include/GL/mesa_wgl.h create mode 100644 reactos/lib/mesa32/include/GL/mglmesa.h create mode 100644 reactos/lib/mesa32/include/GL/osmesa.h create mode 100644 reactos/lib/mesa32/include/GL/svgamesa.h create mode 100644 reactos/lib/mesa32/include/GL/uglglutshapes.h create mode 100644 reactos/lib/mesa32/include/GL/uglmesa.h create mode 100644 reactos/lib/mesa32/include/GL/vms_x_fix.h create mode 100644 reactos/lib/mesa32/include/GL/wmesa.h create mode 100644 reactos/lib/mesa32/include/GL/xmesa.h create mode 100644 reactos/lib/mesa32/include/GL/xmesa_x.h create mode 100644 reactos/lib/mesa32/include/GL/xmesa_xf86.h create mode 100644 reactos/lib/mesa32/mesa32.def create mode 100644 reactos/lib/mesa32/mesa32.edf diff --git a/reactos/lib/mesa32/Makefile b/reactos/lib/mesa32/Makefile new file mode 100644 index 00000000000..0566a2f5944 --- /dev/null +++ b/reactos/lib/mesa32/Makefile @@ -0,0 +1,256 @@ +# configuration vars: +# + +# MESA_HAVE_MMX +# MESA_HAVE_SSE +# MESA_HAVE_3DNOW +# MESA_HAVE_X86 + +#MESA_HAVE_MMX=1 +#MESA_HAVE_SSE=1 +#MESA_HAVE_3DNOW=1 +#MESA_HAVE_X86=1 + +MESA_INCLUDE_DIRS = \ + -Iinclude \ + -Isrc \ + -Isrc/main \ + -Isrc/glapi \ + -Isrc/math \ + -Isrc/tnl \ + -Isrc/swrast \ + -Isrc/swrast_setup + +MESA_MAIN_OBJECTS = \ + src/main/api_arrayelt.o \ + src/main/api_loopback.o \ + src/main/api_noop.o \ + src/main/api_validate.o \ + src/main/accum.o \ + src/main/arbparse.o \ + src/main/arbprogram.o \ + src/main/arbfragparse.o \ + src/main/arbvertparse.o \ + src/main/attrib.o \ + src/main/blend.o \ + src/main/bufferobj.o \ + src/main/buffers.o \ + src/main/clip.o \ + src/main/colortab.o \ + src/main/context.o \ + src/main/convolve.o \ + src/main/debug.o \ + src/main/depth.o \ + src/main/dispatch.o \ + src/main/dlist.o \ + src/main/drawpix.o \ + src/main/enable.o \ + src/main/enums.o \ + src/main/eval.o \ + src/main/extensions.o \ + src/main/feedback.o \ + src/main/fog.o \ + src/main/get.o \ + src/main/hash.o \ + src/main/hint.o \ + src/main/histogram.o \ + src/main/image.o \ + src/main/imports.o \ + src/main/light.o \ + src/main/lines.o \ + src/main/matrix.o \ + src/main/nvprogram.o \ + src/main/nvfragparse.o \ + src/main/nvvertexec.o \ + src/main/nvvertparse.o \ + src/main/occlude.o \ + src/main/pixel.o \ + src/main/points.o \ + src/main/polygon.o \ + src/main/program.o \ + src/main/rastpos.o \ + src/main/state.o \ + src/main/stencil.o \ + src/main/texcompress.o \ + src/main/texformat.o \ + src/main/teximage.o \ + src/main/texobj.o \ + src/main/texstate.o \ + src/main/texstore.o \ + src/main/texutil.o \ + src/main/varray.o \ + src/main/vtxfmt.o + +MESA_GLAPI_OBJECTS = \ + src/glapi/glapi.o \ + src/glapi/glthread.o + +MESA_MATH_OBJECTS = \ + src/math/m_debug_clip.o \ + src/math/m_debug_norm.o \ + src/math/m_debug_xform.o \ + src/math/m_eval.o \ + src/math/m_matrix.o \ + src/math/m_translate.o \ + src/math/m_vector.o \ + src/math/m_xform.o + +MESA_ARRAY_CACHE_OBJECTS = \ + src/array_cache/ac_context.o \ + src/array_cache/ac_import.o + +MESA_SWRAST_OBJECTS = \ + src/swrast/s_aaline.o \ + src/swrast/s_aatriangle.o \ + src/swrast/s_accum.o \ + src/swrast/s_alpha.o \ + src/swrast/s_alphabuf.o \ + src/swrast/s_bitmap.o \ + src/swrast/s_blend.o \ + src/swrast/s_buffers.o \ + src/swrast/s_copypix.o \ + src/swrast/s_context.o \ + src/swrast/s_depth.o \ + src/swrast/s_drawpix.o \ + src/swrast/s_feedback.o \ + src/swrast/s_fog.o \ + src/swrast/s_imaging.o \ + src/swrast/s_lines.o \ + src/swrast/s_logic.o \ + src/swrast/s_masking.o \ + src/swrast/s_nvfragprog.o \ + src/swrast/s_pixeltex.o \ + src/swrast/s_points.o \ + src/swrast/s_readpix.o \ + src/swrast/s_span.o \ + src/swrast/s_stencil.o \ + src/swrast/s_texture.o \ + src/swrast/s_texstore.o \ + src/swrast/s_triangle.o \ + src/swrast/s_zoom.o + +MESA_SWRAST_SETUP_OBJECTS = \ + src/swrast_setup/ss_context.o \ + src/swrast_setup/ss_triangle.o + +MESA_TNL_OBJECTS = \ + src/tnl/t_array_api.o \ + src/tnl/t_array_import.o \ + src/tnl/t_context.o \ + src/tnl/t_pipeline.o \ + src/tnl/t_save_api.o \ + src/tnl/t_save_loopback.o \ + src/tnl/t_save_playback.o \ + src/tnl/t_vb_fog.o \ + src/tnl/t_vb_light.o \ + src/tnl/t_vb_normals.o \ + src/tnl/t_vb_points.o \ + src/tnl/t_vb_program.o \ + src/tnl/t_vb_render.o \ + src/tnl/t_vb_texgen.o \ + src/tnl/t_vb_texmat.o \ + src/tnl/t_vb_vertex.o \ + src/tnl/t_vertex.o \ + src/tnl/t_vtx_api.o \ + src/tnl/t_vtx_eval.o \ + src/tnl/t_vtx_exec.o + +MESA_SPARC_OBJECTS = \ + src/sparc/clip.o \ + src/sparc/glapi_sparc.o \ + src/sparc/norm.o \ + src/sparc/xform.o + +MESA_X86_OBJECTS = \ + src/x86/x86.o \ + src/x86/glapi_x86.o \ + src/x86/common_x86.o \ + src/x86/common_x86_asm.o \ + src/x86/x86_xform2.o \ + src/x86/x86_xform3.o \ + src/x86/x86_xform4.o \ + src/x86/x86_cliptest.o + +MESA_X86_MMX_OBJECTS = \ + src/x86/mmx_blend.o + +MESA_X86_SSE_OBJECTS = \ + src/x86/sse.o \ + src/x86/sse_xform2.o \ + src/x86/sse_xform3.o \ + src/x86/sse_xform4.o \ + src/x86/sse_normal.o + +MESA_X86_K3D_OBJECTS = \ + src/x86/3dnow.o \ + src/x86/3dnow_xform2.o \ + src/x86/3dnow_xform3.o \ + src/x86/3dnow_xform4.o \ + src/x86/3dnow_normal.o + +MESA_CORE_OBJECTS = \ + $(MESA_MAIN_OBJECTS) \ + $(MESA_GLAPI_OBJECTS) \ + $(MESA_MATH_OBJECTS) \ + $(MESA_ARRAY_CACHE_OBJECTS) \ + $(MESA_TNL_OBJECTS) \ + $(MESA_SWRAST_OBJECTS) \ + $(MESA_SWRAST_SETUP_OBJECTS) + +MESA_DRIVER_OBJECTS = \ + src/drivers/windows/gdi/wmesa.o \ + src/drivers/windows/icd/icd.o + +MESA_CFLAGS = -DBUILD_GL32 -D_OPENGL32_ -D_MSC_VER -DUSE_MGL_NAMESPACE $(MESA_INCLUDE_DIRS) + +ifeq ($(MESA_HAVE_MMX),1) +MESA_X86_OBJECTS += $(MESA_X86_MMX_OBJECTS) +MESA_CFLAGS += -DUSE_MMX_ASM +MESA_HAVE_X86 = 1 +endif + +ifeq ($(MESA_HAVE_SSE),1) +MESA_X86_OBJECTS += $(MESA_X86_SSE_OBJECTS) +MESA_CFLAGS += -DUSE_SSE_ASM +MESA_HAVE_X86 = 1 +endif + +ifeq ($(MESA_HAVE_3DNOW),1) +MESA_X86_OBJECTS += $(MESA_X86_K3D_OBJECTS) +MESA_CFLAGS += -DUSE_3DNOW_ASM +MESA_HAVE_X86 = 1 +endif + +ifeq ($(MESA_HAVE_X86),1) +MESA_CFLAGS += -DUSE_X86_ASM +else +MESA_X86_OBJECTS = +endif + + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NORC = yes + +TARGET_NAME = mesa32 + +TARGET_BASE = $(TARGET_BASE_LIB_MESA32) + +TARGET_CFLAGS = -D__USE_W32API -Wall $(MESA_CFLAGS) + +TARGET_GCCLIBS = gdi32 + +TARGET_OBJECTS = $(MESA_CORE_OBJECTS) $(MESA_X86_OBJECTS) $(MESA_DRIVER_OBJECTS) + + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +#include $(TOOLS_PATH)/depend.mk + +# EOF diff --git a/reactos/lib/mesa32/Mesa.dsw b/reactos/lib/mesa32/Mesa.dsw new file mode 100644 index 00000000000..5980b5c89e6 --- /dev/null +++ b/reactos/lib/mesa32/Mesa.dsw @@ -0,0 +1,179 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "array_cache"=".\SRC\MESA\array_cache\array_cache.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "gdi"=".\src\mesa\drivers\windows\gdi\gdi.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name array_cache + End Project Dependency + Begin Project Dependency + Project_Dep_Name main + End Project Dependency + Begin Project Dependency + Project_Dep_Name math + End Project Dependency + Begin Project Dependency + Project_Dep_Name swrast_setup + End Project Dependency + Begin Project Dependency + Project_Dep_Name swrast + End Project Dependency + Begin Project Dependency + Project_Dep_Name tnl + End Project Dependency + Begin Project Dependency + Project_Dep_Name glapi + End Project Dependency +}}} + +############################################################################### + +Project: "glapi"=".\SRC\MESA\glapi\glapi.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "glu"=".\src\glu\sgi\glu.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name gdi + End Project Dependency +}}} + +############################################################################### + +Project: "glut"=".\src\glut\glx\glut.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name glu + End Project Dependency +}}} + +############################################################################### + +Project: "main"=".\SRC\MESA\main\main.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "math"=".\SRC\MESA\math\math.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "osmesa"=".\SRC\MESA\DRIVERS\osmesa\osmesa.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name gdi + End Project Dependency +}}} + +############################################################################### + +Project: "swrast"=".\SRC\MESA\swrast\swrast.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "swrast_setup"=".\SRC\MESA\swrast_setup\swrast_setup.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "tnl"=".\SRC\MESA\tnl\tnl.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/lib/mesa32/README.ReactOS b/reactos/lib/mesa32/README.ReactOS new file mode 100644 index 00000000000..c0c75fed9ef --- /dev/null +++ b/reactos/lib/mesa32/README.ReactOS @@ -0,0 +1,8 @@ +This is Mesa-6.0.1 (http://www.mesa3d.org/) with an ICD interface. + +The ICD functions are in src/drivers/windows/icd/icd.c +I have created a new Makefile for ReactOS which will build Mesa with the ICD +interface. I have not adjusted the Visual C++ project/workspace files. + + --blight + \ No newline at end of file diff --git a/reactos/lib/mesa32/include/GL/amesa.h b/reactos/lib/mesa32/include/GL/amesa.h new file mode 100644 index 00000000000..852d34cf4f5 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/amesa.h @@ -0,0 +1,65 @@ +/* + * Mesa 3-D graphics library + * Version: 3.3 + * + * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/* Allegro (DJGPP) driver by Bernhard Tschirren (bernie-t@geocities.com) */ + + +#ifndef AMESA_H +#define AMESA_H + + +#define AMESA_MAJOR_VERSION 3 +#define AMESA_MINOR_VERSION 3 + + +typedef struct amesa_visual *AMesaVisual; +typedef struct amesa_buffer *AMesaBuffer; +typedef struct amesa_context *AMesaContext; + + +extern AMesaVisual AMesaCreateVisual(GLboolean dbFlag, GLint depth, + GLint depthSize, + GLint stencilSize, + GLint accumSize); + +extern void AMesaDestroyVisual(AMesaVisual visual); + +extern AMesaBuffer AMesaCreateBuffer(AMesaVisual visual, + GLint width, GLint height); + +extern void AMesaDestroyBuffer(AMesaBuffer buffer); + + +extern AMesaContext AMesaCreateContext(AMesaVisual visual, + AMesaContext sharelist); + +extern void AMesaDestroyContext(AMesaContext context); + +extern GLboolean AMesaMakeCurrent(AMesaContext context, AMesaBuffer buffer); + +extern void AMesaSwapBuffers(AMesaBuffer buffer); + + +#endif /* AMESA_H */ diff --git a/reactos/lib/mesa32/include/GL/dmesa.h b/reactos/lib/mesa32/include/GL/dmesa.h new file mode 100644 index 00000000000..364792ac1ab --- /dev/null +++ b/reactos/lib/mesa32/include/GL/dmesa.h @@ -0,0 +1,148 @@ +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + */ + + +#ifndef DMESA_H_included +#define DMESA_H_included + +#define DMESA_MAJOR_VERSION 5 +#define DMESA_MINOR_VERSION 0 + +/* Sample Usage: + * + * 1. Call DMesaCreateVisual() to initialize graphics. + * 2. Call DMesaCreateContext() to create a DMesa rendering context. + * 3. Call DMesaCreateBuffer() to define the window. + * 4. Call DMesaMakeCurrent() to bind the DMesaBuffer to a DMesaContext. + * 5. Make gl* calls to render your graphics. + * 6. Use DMesaSwapBuffers() when double buffering to swap front/back buffers. + * 7. Before exiting, destroy DMesaBuffer, DMesaContext and DMesaVisual. + */ + +typedef struct dmesa_context *DMesaContext; +typedef struct dmesa_visual *DMesaVisual; +typedef struct dmesa_buffer *DMesaBuffer; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Create a new Visual and set graphics mode. + */ +DMesaVisual DMesaCreateVisual (GLint width, /* X res */ + GLint height, /* Y res */ + GLint colDepth, /* BPP */ + GLint refresh, /* refresh rate: 0=default */ + GLboolean dbFlag, /* double-buffered */ + GLboolean rgbFlag, /* RGB mode */ + GLint alphaSize, /* requested bits/alpha */ + GLint depthSize, /* requested bits/depth */ + GLint stencilSize, /* requested bits/stencil */ + GLint accumSize); /* requested bits/accum */ + +/* + * Destroy Visual and restore screen. + */ +void DMesaDestroyVisual (DMesaVisual v); + + + +/* + * Create a new Context for rendering. + */ +DMesaContext DMesaCreateContext (DMesaVisual visual, DMesaContext share); + +/* + * Destroy Context. + */ +void DMesaDestroyContext (DMesaContext c); + +/* + * Return a handle to the current context. + */ +void *DMesaGetCurrentContext (void); + + + +/* + * Create a new Buffer (window). + */ +DMesaBuffer DMesaCreateBuffer (DMesaVisual visual, + GLint xpos, GLint ypos, + GLint width, GLint height); + +/* + * Destroy Buffer. + */ +void DMesaDestroyBuffer (DMesaBuffer b); + +/* + * Swap the front and back buffers for the given Buffer. + * No action is taken if the buffer is not double buffered. + */ +void DMesaSwapBuffers (DMesaBuffer b); + +/* + * Bind Buffer to Context and make the Context the current one. + */ +GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b); + + + +/* + * Move/Resize current Buffer. + */ +GLboolean DMesaMoveBuffer (GLint xpos, GLint ypos); +GLboolean DMesaResizeBuffer (GLint width, GLint height); + +/* + * Set palette index, using normalized values. + */ +void DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue); + +/* + * DMesa state retrieval. + */ +#define DMESA_GET_SCREEN_SIZE 0x0100 +#define DMESA_GET_DRIVER_CAPS 0x0200 +#define DMESA_GET_VIDEO_MODES 0x0300 + +#define DMESA_DRIVER_SWDB_BIT 0x1 /* software double-buffered */ +#define DMESA_DRIVER_LLWO_BIT 0x2 /* lower-left window origin */ +int DMesaGetIntegerv (GLenum pname, GLint *params); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/lib/mesa32/include/GL/fxmesa.h b/reactos/lib/mesa32/include/GL/fxmesa.h new file mode 100644 index 00000000000..5c63a8db658 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/fxmesa.h @@ -0,0 +1,103 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * Copyright (C) 1995-2001 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* + * FXMesa - 3Dfx Glide driver for Mesa. Contributed by David Bucciarelli + * + * NOTE: This version requires Glide3 (http://sourceforge.net/projects/glide) + */ + + +#ifndef FXMESA_H +#define FXMESA_H + + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define FXMESA_MAJOR_VERSION 5 +#define FXMESA_MINOR_VERSION 0 + + +/* + * Values for attribList parameter to fxMesaCreateContext(): + */ +#define FXMESA_NONE 0 /* to terminate attribList */ +#define FXMESA_DOUBLEBUFFER 10 +#define FXMESA_ALPHA_SIZE 11 /* followed by an integer */ +#define FXMESA_DEPTH_SIZE 12 /* followed by an integer */ +#define FXMESA_STENCIL_SIZE 13 /* followed by an integer */ +#define FXMESA_ACCUM_SIZE 14 /* followed by an integer */ +#define FXMESA_COLORDEPTH 20 /* followed by an integer */ +#define FXMESA_SHARE_CONTEXT 990099 /* keep in sync with xmesa1.c! */ + + + +typedef struct tfxMesaContext *fxMesaContext; + + +#if defined (__BEOS__) +#pragma export on +#endif + + +GLAPI fxMesaContext GLAPIENTRY fxMesaCreateContext(GLuint win, GrScreenResolution_t, + GrScreenRefresh_t, + const GLint attribList[]); + +GLAPI fxMesaContext GLAPIENTRY fxMesaCreateBestContext(GLuint win, + GLint width, GLint height, + const GLint attribList[]); +GLAPI void GLAPIENTRY fxMesaDestroyContext(fxMesaContext ctx); + +GLAPI GLint GLAPIENTRY fxMesaSelectCurrentBoard(int n); + +GLAPI void GLAPIENTRY fxMesaMakeCurrent(fxMesaContext ctx); + +GLAPI void * GLAPIENTRY fxMesaGetCurrentContext(void); + +GLAPI void GLAPIENTRY fxMesaSwapBuffers(void); + +GLAPI void GLAPIENTRY fxMesaSetNearFar(GLfloat nearVal, GLfloat farVal); + +GLAPI void GLAPIENTRY fxMesaUpdateScreenSize(fxMesaContext ctx); + +GLAPI void GLAPIENTRY fxCloseHardware(void); + +GLAPI void GLAPIENTRY fxGetScreenGeometry (GLint *w, GLint *h); + + +#if defined (__BEOS__) +#pragma export off +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/reactos/lib/mesa32/include/GL/ggimesa.h b/reactos/lib/mesa32/include/GL/ggimesa.h new file mode 100644 index 00000000000..90e0b422225 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/ggimesa.h @@ -0,0 +1,85 @@ +/* + * Mesa 3-D graphics library GGI bindings (GGIGL [giggle]) + * Version: 4.0 + * Copyright (C) 1995-2000 Brian Paul + * Copyright (C) 1998 Uwe Maurer + * Copyrigth (C) 2001 Filip Spacek + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#ifndef GGIMESA_H +#define GGIMESA_H + +#define GGIMESA_MAJOR_VERSION 4 +#define GGIMESA_MINOR_VERSION 0 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "GL/gl.h" + +typedef struct ggi_mesa_context *ggi_mesa_context_t; + +/* + * Initialize Mesa GGI extension + */ +int ggiMesaInit(void); +/* + * Clean up Mesa GGI exension + */ +int ggiMesaExit(void); + +/* + * Attach Mesa GGI extension to the visual 'vis' + */ +int ggiMesaAttach(ggi_visual_t vis); +/* + * Detach Mesa GGI extension from the visual 'vis' + */ +int ggiMesaDetach(ggi_visual_t vis); + +int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag, + GLboolean stereo_flag, GLint depth_size, + GLint stencil_size, GLint accum_red_size, + GLint accum_green_size, GLint accum_blue_size, + GLint accum_alpha_size, GLint num_samples); + +/* + * Create a new context capable of displaying on the visual vis. + */ +ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis); +/* + * Destroy the context 'ctx' + */ +void ggiMesaDestroyContext(ggi_mesa_context_t ctx); + +/* + * Make context 'ctx' the current context and bind it to visual 'vis'. + * Note that the context must have been created with respect to that visual. + */ +void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis); + +void ggiMesaSwapBuffers(void); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/lib/mesa32/include/GL/gl.h b/reactos/lib/mesa32/include/GL/gl.h new file mode 100644 index 00000000000..56b883b1c3a --- /dev/null +++ b/reactos/lib/mesa32/include/GL/gl.h @@ -0,0 +1,2241 @@ +/* + * Mesa 3-D graphics library + * Version: 6.0.1 + * + * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef __gl_h_ +#define __gl_h_ + +#if defined(USE_MGL_NAMESPACE) +#include "gl_mangle.h" +#endif + + +/********************************************************************** + * Begin system-specific stuff. Do not do any of this when building + * for SciTech SNAP, as this is all done before this header file is + * included. + */ +#if !defined(__SCITECH_SNAP__) + +#include /* to get ptrdiff_t, used below */ + +#if defined(__BEOS__) +#include /* to get some BeOS-isms */ +#endif + +#if !defined(OPENSTEP) && (defined(NeXT) || defined(NeXT_PDO)) +#define OPENSTEP +#endif + +#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) +#define __WIN32__ +#endif + +#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__)) +# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ +# define GLAPI __declspec(dllexport) +# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ +# define GLAPI __declspec(dllimport) +# else /* for use with static link lib build of Win32 edition only */ +# define GLAPI extern +# endif /* _STATIC_MESA support */ +# define GLAPIENTRY __stdcall +#else +/* non-Windows compilation */ +# define GLAPI extern +# define GLAPIENTRY +#endif /* WIN32 / CYGWIN bracket */ + +#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) +# define PRAGMA_EXPORT_SUPPORTED 1 +#endif + +/* + * WINDOWS: Include windows.h here to define APIENTRY. + * It is also useful when applications include this file by + * including only glut.h, since glut.h depends on windows.h. + * Applications needing to include windows.h with parms other + * than "WIN32_LEAN_AND_MEAN" may include windows.h before + * glut.h or gl.h. + */ +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) && !defined(__CYGWIN__) +#include +#endif + +#if defined(macintosh) && PRAGMA_IMPORT_SUPPORTED +#pragma import on +#endif + +#ifndef APIENTRY +#define APIENTRY GLAPIENTRY +#endif +#define APIENTRYP APIENTRY * + +#ifndef GLAPIENTRYP +#define GLAPIENTRYP GLAPIENTRY * +#endif + +#ifdef CENTERLINE_CLPP +#define signed +#endif + +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export on +#endif + +#endif /* !__SCITECH_SNAP__ */ +/* + * End system-specific stuff. + **********************************************************************/ + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define GL_VERSION_1_1 1 +#define GL_VERSION_1_2 1 +#define GL_VERSION_1_3 1 +#define GL_ARB_imaging 1 + + +/* + * Datatypes + */ +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; /* 1-byte signed */ +typedef short GLshort; /* 2-byte signed */ +typedef int GLint; /* 4-byte signed */ +typedef unsigned char GLubyte; /* 1-byte unsigned */ +typedef unsigned short GLushort; /* 2-byte unsigned */ +typedef unsigned int GLuint; /* 4-byte unsigned */ +typedef int GLsizei; /* 4-byte signed */ +typedef float GLfloat; /* single precision float */ +typedef float GLclampf; /* single precision float in [0,1] */ +typedef double GLdouble; /* double precision float */ +typedef double GLclampd; /* double precision float in [0,1] */ + + + +/* + * Constants + */ + +/* Boolean values */ +#define GL_FALSE 0x0 +#define GL_TRUE 0x1 + +/* Data types */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_DOUBLE 0x140A +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 + +/* Primitives */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 + +/* Vertex Arrays */ +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D + +/* Matrix Mode */ +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 + +/* Points */ +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 + +/* Lines */ +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 + +/* Polygons */ +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 + +/* Display Lists */ +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 + +/* Depth buffer */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_COMPONENT 0x1902 + +/* Lighting */ +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_SHININESS 0x1601 +#define GL_EMISSION 0x1600 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_SHADE_MODEL 0x0B54 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_NORMALIZE 0x0BA1 + +/* User clipping planes */ +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 + +/* Accumulation buffer */ +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM 0x0100 +#define GL_ADD 0x0104 +#define GL_LOAD 0x0101 +#define GL_MULT 0x0103 +#define GL_RETURN 0x0102 + +/* Alpha testing */ +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TEST_FUNC 0x0BC1 + +/* Blending */ +#define GL_BLEND 0x0BE2 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_DST 0x0BE0 +#define GL_ZERO 0x0 +#define GL_ONE 0x1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 + +/* Render Mode */ +#define GL_FEEDBACK 0x1C01 +#define GL_RENDER 0x1C00 +#define GL_SELECT 0x1C02 + +/* Feedback */ +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 + +/* Selection */ +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 + +/* Fog */ +#define GL_FOG 0x0B60 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_LINEAR 0x2601 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 + +/* Logic Ops */ +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D + +/* Stencil */ +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_INDEX 0x1901 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 + +/* Buffers, Pixel Drawing/Reading */ +#define GL_NONE 0x0 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +/*GL_FRONT 0x0404 */ +/*GL_BACK 0x0405 */ +/*GL_FRONT_AND_BACK 0x0408 */ +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_COLOR_INDEX 0x1900 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_ALPHA_BITS 0x0D55 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_INDEX_BITS 0x0D51 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_READ_BUFFER 0x0C02 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_BITMAP 0x1A00 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_DITHER 0x0BD0 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 + +/* Implementation limits */ +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B + +/* Gets */ +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_RENDER_MODE 0x0C40 +#define GL_RGBA_MODE 0x0C31 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_VIEWPORT 0x0BA2 + +/* Evaluators */ +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_COEFF 0x0A00 +#define GL_DOMAIN 0x0A02 +#define GL_ORDER 0x0A01 + +/* Hints */ +#define GL_FOG_HINT 0x0C54 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* Scissor box */ +#define GL_SCISSOR_TEST 0x0C11 +#define GL_SCISSOR_BOX 0x0C10 + +/* Pixel Mode / Transfer */ +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 + +/* Texture mapping */ +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_SPHERE_MAP 0x2402 +#define GL_DECAL 0x2101 +#define GL_MODULATE 0x2100 +#define GL_NEAREST 0x2600 +#define GL_REPEAT 0x2901 +#define GL_CLAMP 0x2900 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 + +/* Utility */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* Errors */ +#define GL_NO_ERROR 0x0 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 + +/* glPush/PopAttrib bits */ +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000FFFFF + + +/* OpenGL 1.1 */ +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF + + + +/* + * Miscellaneous + */ + +GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); + +GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glClear( GLbitfield mask ); + +GLAPI void GLAPIENTRY glIndexMask( GLuint mask ); + +GLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); + +GLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref ); + +GLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor ); + +GLAPI void GLAPIENTRY glLogicOp( GLenum opcode ); + +GLAPI void GLAPIENTRY glCullFace( GLenum mode ); + +GLAPI void GLAPIENTRY glFrontFace( GLenum mode ); + +GLAPI void GLAPIENTRY glPointSize( GLfloat size ); + +GLAPI void GLAPIENTRY glLineWidth( GLfloat width ); + +GLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern ); + +GLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode ); + +GLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units ); + +GLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask ); + +GLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask ); + +GLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag ); + +GLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag ); + +GLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height); + +GLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation ); + +GLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation ); + +GLAPI void GLAPIENTRY glDrawBuffer( GLenum mode ); + +GLAPI void GLAPIENTRY glReadBuffer( GLenum mode ); + +GLAPI void GLAPIENTRY glEnable( GLenum cap ); + +GLAPI void GLAPIENTRY glDisable( GLenum cap ); + +GLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap ); + + +GLAPI void GLAPIENTRY glEnableClientState( GLenum cap ); /* 1.1 */ + +GLAPI void GLAPIENTRY glDisableClientState( GLenum cap ); /* 1.1 */ + + +GLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params ); + +GLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params ); + +GLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params ); + +GLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask ); + +GLAPI void GLAPIENTRY glPopAttrib( void ); + + +GLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */ + +GLAPI void GLAPIENTRY glPopClientAttrib( void ); /* 1.1 */ + + +GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode ); + +GLAPI GLenum GLAPIENTRY glGetError( void ); + +GLAPI const GLubyte* GLAPIENTRY glGetString( GLenum name ); + +GLAPI void GLAPIENTRY glFinish( void ); + +GLAPI void GLAPIENTRY glFlush( void ); + +GLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode ); + + +/* + * Depth Buffer + */ + +GLAPI void GLAPIENTRY glClearDepth( GLclampd depth ); + +GLAPI void GLAPIENTRY glDepthFunc( GLenum func ); + +GLAPI void GLAPIENTRY glDepthMask( GLboolean flag ); + +GLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val ); + + +/* + * Accumulation Buffer + */ + +GLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); + +GLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value ); + + +/* + * Transformation + */ + +GLAPI void GLAPIENTRY glMatrixMode( GLenum mode ); + +GLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +GLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +GLAPI void GLAPIENTRY glViewport( GLint x, GLint y, + GLsizei width, GLsizei height ); + +GLAPI void GLAPIENTRY glPushMatrix( void ); + +GLAPI void GLAPIENTRY glPopMatrix( void ); + +GLAPI void GLAPIENTRY glLoadIdentity( void ); + +GLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m ); + +GLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m ); + +GLAPI void GLAPIENTRY glRotated( GLdouble angle, + GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRotatef( GLfloat angle, + GLfloat x, GLfloat y, GLfloat z ); + +GLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z ); + +GLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z ); + + +/* + * Display Lists + */ + +GLAPI GLboolean GLAPIENTRY glIsList( GLuint list ); + +GLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range ); + +GLAPI GLuint GLAPIENTRY glGenLists( GLsizei range ); + +GLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode ); + +GLAPI void GLAPIENTRY glEndList( void ); + +GLAPI void GLAPIENTRY glCallList( GLuint list ); + +GLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type, + const GLvoid *lists ); + +GLAPI void GLAPIENTRY glListBase( GLuint base ); + + +/* + * Drawing Functions + */ + +GLAPI void GLAPIENTRY glBegin( GLenum mode ); + +GLAPI void GLAPIENTRY glEnd( void ); + + +GLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex2iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex3iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex4iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ); +GLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ); +GLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ); +GLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz ); +GLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz ); + +GLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glNormal3iv( const GLint *v ); +GLAPI void GLAPIENTRY glNormal3sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glIndexd( GLdouble c ); +GLAPI void GLAPIENTRY glIndexf( GLfloat c ); +GLAPI void GLAPIENTRY glIndexi( GLint c ); +GLAPI void GLAPIENTRY glIndexs( GLshort c ); +GLAPI void GLAPIENTRY glIndexub( GLubyte c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glIndexdv( const GLdouble *c ); +GLAPI void GLAPIENTRY glIndexfv( const GLfloat *c ); +GLAPI void GLAPIENTRY glIndexiv( const GLint *c ); +GLAPI void GLAPIENTRY glIndexsv( const GLshort *c ); +GLAPI void GLAPIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue ); +GLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue ); +GLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue ); +GLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue ); +GLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue ); +GLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue ); +GLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue ); +GLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue ); + +GLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green, + GLbyte blue, GLbyte alpha ); +GLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green, + GLdouble blue, GLdouble alpha ); +GLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha ); +GLAPI void GLAPIENTRY glColor4i( GLint red, GLint green, + GLint blue, GLint alpha ); +GLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green, + GLshort blue, GLshort alpha ); +GLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ); +GLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green, + GLuint blue, GLuint alpha ); +GLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green, + GLushort blue, GLushort alpha ); + + +GLAPI void GLAPIENTRY glColor3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor3iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor3sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor3uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor3usv( const GLushort *v ); + +GLAPI void GLAPIENTRY glColor4bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor4iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor4sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor4uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor4usv( const GLushort *v ); + + +GLAPI void GLAPIENTRY glTexCoord1d( GLdouble s ); +GLAPI void GLAPIENTRY glTexCoord1f( GLfloat s ); +GLAPI void GLAPIENTRY glTexCoord1i( GLint s ); +GLAPI void GLAPIENTRY glTexCoord1s( GLshort s ); + +GLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t ); +GLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t ); +GLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t ); +GLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ); +GLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ); +GLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r ); +GLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +GLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +GLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q ); +GLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +GLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +GLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ); +GLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); + + +GLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 ); +GLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 ); +GLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 ); +GLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 ); + + +/* + * Vertex Arrays (1.1) + */ + +GLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glGetPointerv( GLenum pname, GLvoid **params ); + +GLAPI void GLAPIENTRY glArrayElement( GLint i ); + +GLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count ); + +GLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride, + const GLvoid *pointer ); + +/* + * Lighting + */ + +GLAPI void GLAPIENTRY glShadeModel( GLenum mode ); + +GLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname, + GLfloat *params ); +GLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params ); + +GLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode ); + + +/* + * Raster functions + */ + +GLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor ); + +GLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLsizei mapsize, + const GLfloat *values ); +GLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLsizei mapsize, + const GLuint *values ); +GLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLsizei mapsize, + const GLushort *values ); + +GLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values ); +GLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values ); +GLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values ); + +GLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height, + GLfloat xorig, GLfloat yorig, + GLfloat xmove, GLfloat ymove, + const GLubyte *bitmap ); + +GLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + GLvoid *pixels ); + +GLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum type ); + +/* + * Stenciling + */ + +GLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask ); + +GLAPI void GLAPIENTRY glStencilMask( GLuint mask ); + +GLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ); + +GLAPI void GLAPIENTRY glClearStencil( GLint s ); + + + +/* + * Texture mapping + */ + +GLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param ); +GLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params ); +GLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); +GLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target, + GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target, + GLenum pname, GLint *params ); + +GLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level, + GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level, + GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level, + GLenum format, GLenum type, + GLvoid *pixels ); + + +/* 1.1 functions */ + +GLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures ); + +GLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures); + +GLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture ); + +GLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n, + const GLuint *textures, + const GLclampf *priorities ); + +GLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n, + const GLuint *textures, + GLboolean *residences ); + +GLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture ); + + +GLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level, + GLint xoffset, + GLsizei width, GLenum format, + GLenum type, const GLvoid *pixels ); + + +GLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + + +GLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLint border ); + + +GLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLint border ); + + +GLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, + GLsizei width ); + + +GLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, + GLsizei width, GLsizei height ); + + +/* + * Evaluators + */ + +GLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2, + GLint stride, + GLint order, const GLdouble *points ); +GLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2, + GLint stride, + GLint order, const GLfloat *points ); + +GLAPI void GLAPIENTRY glMap2d( GLenum target, + GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, + const GLdouble *points ); +GLAPI void GLAPIENTRY glMap2f( GLenum target, + GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, + const GLfloat *points ); + +GLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v ); +GLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v ); +GLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v ); + +GLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u ); +GLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u ); + +GLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u ); + +GLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v ); +GLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v ); + +GLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u ); + +GLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); +GLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); + +GLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, + GLint vn, GLdouble v1, GLdouble v2 ); +GLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, + GLint vn, GLfloat v1, GLfloat v2 ); + +GLAPI void GLAPIENTRY glEvalPoint1( GLint i ); + +GLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j ); + +GLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 ); + +GLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + + +/* + * Fog + */ + +GLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param ); + +GLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params ); + +GLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params ); + + +/* + * Selection and Feedback + */ + +GLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); + +GLAPI void GLAPIENTRY glPassThrough( GLfloat token ); + +GLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer ); + +GLAPI void GLAPIENTRY glInitNames( void ); + +GLAPI void GLAPIENTRY glLoadName( GLuint name ); + +GLAPI void GLAPIENTRY glPushName( GLuint name ); + +GLAPI void GLAPIENTRY glPopName( void ); + + + +/* + * OpenGL 1.2 + */ + +#define GL_RESCALE_NORMAL 0x803A +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_TEXTURE_BINDING_3D 0x806A + +GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, + GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLsizei depth, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLsizei width, + GLsizei height, GLsizei depth, + GLenum format, + GLenum type, const GLvoid *pixels); + +GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLint x, + GLint y, GLsizei width, + GLsizei height ); + +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + + +/* + * GL_ARB_imaging + */ + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_BLEND_EQUATION 0x8009 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_COLOR 0x8005 + + +GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, + GLsizei width, GLenum format, + GLenum type, const GLvoid *table ); + +GLAPI void GLAPIENTRY glColorSubTable( GLenum target, + GLsizei start, GLsizei count, + GLenum format, GLenum type, + const GLvoid *data ); + +GLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname, + const GLint *params); + +GLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname, + const GLfloat *params); + +GLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format, + GLenum type, GLvoid *table ); + +GLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glBlendEquation( GLenum mode ); + +GLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width, + GLenum internalformat, GLboolean sink ); + +GLAPI void GLAPIENTRY glResetHistogram( GLenum target ); + +GLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset, + GLenum format, GLenum type, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat, + GLboolean sink ); + +GLAPI void GLAPIENTRY glResetMinmax( GLenum target ); + +GLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset, + GLenum format, GLenum types, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *image ); + +GLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *image ); + +GLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname, + GLfloat params ); + +GLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); + +GLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname, + GLint params ); + +GLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width, + GLsizei height); + +GLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format, + GLenum type, GLvoid *image ); + +GLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *row, const GLvoid *column ); + +GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, + GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); + +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); + + + +/* + * OpenGL 1.3 + */ + +/* multitexture */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +/* texture_cube_map */ +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +/* texture_compression */ +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +/* multisample */ +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +/* transpose_matrix */ +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +/* texture_env_combine */ +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +/* texture_env_dot3 */ +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +/* texture_border_clamp */ +#define GL_CLAMP_TO_BORDER 0x812D + +GLAPI void GLAPIENTRY glActiveTexture( GLenum texture ); + +GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture ); + +GLAPI void GLAPIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img ); + +GLAPI void GLAPIENTRY glMultiTexCoord1d( GLenum target, GLdouble s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1f( GLenum target, GLfloat s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1i( GLenum target, GLint s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1s( GLenum target, GLshort s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v ); + + +GLAPI void GLAPIENTRY glLoadTransposeMatrixd( const GLdouble m[16] ); + +GLAPI void GLAPIENTRY glLoadTransposeMatrixf( const GLfloat m[16] ); + +GLAPI void GLAPIENTRY glMultTransposeMatrixd( const GLdouble m[16] ); + +GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); + +GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); + +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); + + +/* + * GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1) + */ +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s); +GLAPI void GLAPIENTRY glMultiTexCoord1dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s); +GLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord1iARB(GLenum target, GLint s); +GLAPI void GLAPIENTRY glMultiTexCoord1ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord1sARB(GLenum target, GLshort s); +GLAPI void GLAPIENTRY glMultiTexCoord1svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glMultiTexCoord2dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord2iARB(GLenum target, GLint s, GLint t); +GLAPI void GLAPIENTRY glMultiTexCoord2ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t); +GLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glMultiTexCoord3dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glMultiTexCoord3ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glMultiTexCoord3svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glMultiTexCoord4dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glMultiTexCoord4ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v); + +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#endif /* GL_ARB_multitexture */ + + + +/* + * Define this token if you want "old-style" header file behaviour (extensions + * defined in gl.h). Otherwise, extensions will be included from glext.h. + */ +#if defined(GL_GLEXT_LEGACY) + +/* All extensions that used to be here are now found in glext.h */ + +#else /* GL_GLEXT_LEGACY */ + +#include + +#endif /* GL_GLEXT_LEGACY */ + + + +/* + * ???. GL_MESA_trace + * XXX obsolete + */ +#ifndef GL_MESA_trace +#define GL_MESA_trace 1 + +#define GL_TRACE_ALL_BITS_MESA 0xFFFF +#define GL_TRACE_OPERATIONS_BIT_MESA 0x0001 +#define GL_TRACE_PRIMITIVES_BIT_MESA 0x0002 +#define GL_TRACE_ARRAYS_BIT_MESA 0x0004 +#define GL_TRACE_TEXTURES_BIT_MESA 0x0008 +#define GL_TRACE_PIXELS_BIT_MESA 0x0010 +#define GL_TRACE_ERRORS_BIT_MESA 0x0020 +#define GL_TRACE_MASK_MESA 0x8755 +#define GL_TRACE_NAME_MESA 0x8756 + +GLAPI void GLAPIENTRY glEnableTraceMESA( GLbitfield mask ); +GLAPI void GLAPIENTRY glDisableTraceMESA( GLbitfield mask ); +GLAPI void GLAPIENTRY glNewTraceMESA( GLbitfield mask, const GLubyte * traceName ); +GLAPI void GLAPIENTRY glEndTraceMESA( void ); +GLAPI void GLAPIENTRY glTraceAssertAttribMESA( GLbitfield attribMask ); +GLAPI void GLAPIENTRY glTraceCommentMESA( const GLubyte * comment ); +GLAPI void GLAPIENTRY glTraceTextureMESA( GLuint name, const GLubyte* comment ); +GLAPI void GLAPIENTRY glTraceListMESA( GLuint name, const GLubyte* comment ); +GLAPI void GLAPIENTRY glTracePointerMESA( GLvoid* pointer, const GLubyte* comment ); +GLAPI void GLAPIENTRY glTracePointerRangeMESA( const GLvoid* first, const GLvoid* last, const GLubyte* comment ); + +#endif /* GL_MESA_trace */ + + +/* + * ???. GL_MESA_packed_depth_stencil + * XXX obsolete + */ +#ifndef GL_MESA_packed_depth_stencil +#define GL_MESA_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_MESA 0x8750 +#define GL_UNSIGNED_INT_24_8_MESA 0x8751 +#define GL_UNSIGNED_INT_8_24_REV_MESA 0x8752 +#define GL_UNSIGNED_SHORT_15_1_MESA 0x8753 +#define GL_UNSIGNED_SHORT_1_15_REV_MESA 0x8754 + +#endif /* GL_MESA_packed_depth_stencil */ + + +#ifndef GL_MESA_program_debug +#define GL_MESA_program_debug 1 + +#define GL_FRAGMENT_PROGRAM_POSITION_MESA 0x8bb0 +#define GL_FRAGMENT_PROGRAM_CALLBACK_MESA 0x8bb1 +#define GL_FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA 0x8bb2 +#define GL_FRAGMENT_PROGRAM_CALLBACK_DATA_MESA 0x8bb3 +#define GL_VERTEX_PROGRAM_POSITION_MESA 0x8bb4 +#define GL_VERTEX_PROGRAM_CALLBACK_MESA 0x8bb5 +#define GL_VERTEX_PROGRAM_CALLBACK_FUNC_MESA 0x8bb6 +#define GL_VERTEX_PROGRAM_CALLBACK_DATA_MESA 0x8bb7 + +typedef void (*GLprogramcallbackMESA)(GLenum target, GLvoid *data); + +extern void +glProgramCallbackMESA(GLenum target, GLprogramcallbackMESA callback, + GLvoid *data); + +extern void +glGetProgramRegisterfvMESA(GLenum target, GLsizei len, const GLubyte *name, + GLfloat *v); + +#endif /* GL_MESA_program_debug */ + + +/** + ** NOTE!!!!! If you add new functions to this file, or update + ** glext.h be sure to regenerate the gl_mangle.h file. See comments + ** in that file for details. + **/ + + +/********************************************************************** + * Begin system-specific stuff + */ +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export off +#endif + +#if defined(macintosh) && PRAGMA_IMPORT_SUPPORTED +#pragma import off +#endif +/* + * End system-specific stuff + **********************************************************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ diff --git a/reactos/lib/mesa32/include/GL/gl_mangle.h b/reactos/lib/mesa32/include/GL/gl_mangle.h new file mode 100644 index 00000000000..bd7e4ee8cee --- /dev/null +++ b/reactos/lib/mesa32/include/GL/gl_mangle.h @@ -0,0 +1,1356 @@ +#if 0 +#define GL_MANGLE_C1 "DO NOT EDIT!!! - TO REGENERATE from gl.h, EXECUTE THIS FILE IN SHELL (/bin/sh) and save the output" +#define GL_MANGLE_C2 "This file is used to create GL function protypes and aliases for the function names" + files="gl.h glext.h" +#define GL_MANGLE_C3 "get regeneration header - copy everything in this file above the 'REGENERATE_TO_END' line" + awk '!done; /^\/\*REGENERATE_TO_END/ {done=1}' $0 + echo "" +#define GL_MANGLE_C4 get aliases + grep '^GLAPI' $files | sed -e 's/.*ENTRY gl\([^( ]*\).*$/#define gl\1 MANGLE(\1)/' | sort | uniq + echo "" + echo "#endif /* GL_MANGLE_H */" + exit +#endif /* REGENERATION */ + +/* + * If you compile Mesa with USE_MGL_NAMESPACE defined then you can link + * your application both with OpenGL and Mesa. The Mesa functions will + * be redefined so they are prefixed with "mgl" instead of "gl". + * Mgl contributed by Randy Frank (rfrank@rsinc.com) + * Regneration code contributed by Ray Tice (rayt@ma.ultra.net) + */ + +#ifndef GL_MANGLE_H +#define GL_MANGLE_H + +#ifndef MANGLE +#define MANGLE(x) mgl##x +#endif /*MANGLE*/ + +/* Internal symbols which may collide with other OpenGL implementations. */ +#define __glCoreCreateContext __mglCoreCreateContext +#define __glCoreNopDispatch __mglCoreNopDispatch + +/*REGENERATE_TO_END-----------ALL LINES BELOW HERE GET REPLACED ON REGENERATION */ + +#define glAccum MANGLE(Accum) +#define glActiveStencilFaceEXT MANGLE(ActiveStencilFaceEXT) +#define glActiveTextureARB MANGLE(ActiveTextureARB) +#define glActiveTexture MANGLE(ActiveTexture) +#define glAlphaFragmentOp1ATI MANGLE(AlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI MANGLE(AlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI MANGLE(AlphaFragmentOp3ATI) +#define glAlphaFunc MANGLE(AlphaFunc) +#define glApplyTextureEXT MANGLE(ApplyTextureEXT) +#define glAreProgramsResidentNV MANGLE(AreProgramsResidentNV) +#define glAreTexturesResidentEXT MANGLE(AreTexturesResidentEXT) +#define glAreTexturesResident MANGLE(AreTexturesResident) +#define glArrayElementEXT MANGLE(ArrayElementEXT) +#define glArrayElement MANGLE(ArrayElement) +#define glArrayObjectATI MANGLE(ArrayObjectATI) +#define glAsyncMarkerSGIX MANGLE(AsyncMarkerSGIX) +#define glAttachObjectARB MANGLE(AttachObjectARB) +#define glBeginFragmentShaderATI MANGLE(BeginFragmentShaderATI) +#define glBegin MANGLE(Begin) +#define glBeginOcclusionQueryNV MANGLE(BeginOcclusionQueryNV) +#define glBeginQueryARB MANGLE(BeginQueryARB) +#define glBeginQuery MANGLE(BeginQuery) +#define glBeginVertexShaderEXT MANGLE(BeginVertexShaderEXT) +#define glBindAttribLocationARB MANGLE(BindAttribLocationARB) +#define glBindBufferARB MANGLE(BindBufferARB) +#define glBindBuffer MANGLE(BindBuffer) +#define glBindFragmentShaderATI MANGLE(BindFragmentShaderATI) +#define glBindLightParameterEXT MANGLE(BindLightParameterEXT) +#define glBindMaterialParameterEXT MANGLE(BindMaterialParameterEXT) +#define glBindParameterEXT MANGLE(BindParameterEXT) +#define glBindProgramARB MANGLE(BindProgramARB) +#define glBindProgramNV MANGLE(BindProgramNV) +#define glBindTexGenParameterEXT MANGLE(BindTexGenParameterEXT) +#define glBindTextureEXT MANGLE(BindTextureEXT) +#define glBindTexture MANGLE(BindTexture) +#define glBindTextureUnitParameterEXT MANGLE(BindTextureUnitParameterEXT) +#define glBindVertexArrayAPPLE MANGLE(BindVertexArrayAPPLE) +#define glBindVertexShaderEXT MANGLE(BindVertexShaderEXT) +#define glBinormal3bEXT MANGLE(Binormal3bEXT) +#define glBinormal3bvEXT MANGLE(Binormal3bvEXT) +#define glBinormal3dEXT MANGLE(Binormal3dEXT) +#define glBinormal3dvEXT MANGLE(Binormal3dvEXT) +#define glBinormal3fEXT MANGLE(Binormal3fEXT) +#define glBinormal3fvEXT MANGLE(Binormal3fvEXT) +#define glBinormal3iEXT MANGLE(Binormal3iEXT) +#define glBinormal3ivEXT MANGLE(Binormal3ivEXT) +#define glBinormal3sEXT MANGLE(Binormal3sEXT) +#define glBinormal3svEXT MANGLE(Binormal3svEXT) +#define glBinormalPointerEXT MANGLE(BinormalPointerEXT) +#define glBitmap MANGLE(Bitmap) +#define glBlendColorEXT MANGLE(BlendColorEXT) +#define glBlendColor MANGLE(BlendColor) +#define glBlendEquationEXT MANGLE(BlendEquationEXT) +#define glBlendEquation MANGLE(BlendEquation) +#define glBlendEquationSeparateEXT MANGLE(BlendEquationSeparateEXT) +#define glBlendFunc MANGLE(BlendFunc) +#define glBlendFuncSeparateEXT MANGLE(BlendFuncSeparateEXT) +#define glBlendFuncSeparateINGR MANGLE(BlendFuncSeparateINGR) +#define glBlendFuncSeparate MANGLE(BlendFuncSeparate) +#define glBufferDataARB MANGLE(BufferDataARB) +#define glBufferData MANGLE(BufferData) +#define glBufferSubDataARB MANGLE(BufferSubDataARB) +#define glBufferSubData MANGLE(BufferSubData) +#define glCallList MANGLE(CallList) +#define glCallLists MANGLE(CallLists) +#define glClearAccum MANGLE(ClearAccum) +#define glClearColor MANGLE(ClearColor) +#define glClearDepth MANGLE(ClearDepth) +#define glClearIndex MANGLE(ClearIndex) +#define glClear MANGLE(Clear) +#define glClearStencil MANGLE(ClearStencil) +#define glClientActiveTextureARB MANGLE(ClientActiveTextureARB) +#define glClientActiveTexture MANGLE(ClientActiveTexture) +#define glClientActiveVertexStreamATI MANGLE(ClientActiveVertexStreamATI) +#define glClipPlane MANGLE(ClipPlane) +#define glColor3b MANGLE(Color3b) +#define glColor3bv MANGLE(Color3bv) +#define glColor3d MANGLE(Color3d) +#define glColor3dv MANGLE(Color3dv) +#define glColor3f MANGLE(Color3f) +#define glColor3fVertex3fSUN MANGLE(Color3fVertex3fSUN) +#define glColor3fVertex3fvSUN MANGLE(Color3fVertex3fvSUN) +#define glColor3fv MANGLE(Color3fv) +#define glColor3hNV MANGLE(Color3hNV) +#define glColor3hvNV MANGLE(Color3hvNV) +#define glColor3i MANGLE(Color3i) +#define glColor3iv MANGLE(Color3iv) +#define glColor3s MANGLE(Color3s) +#define glColor3sv MANGLE(Color3sv) +#define glColor3ub MANGLE(Color3ub) +#define glColor3ubv MANGLE(Color3ubv) +#define glColor3ui MANGLE(Color3ui) +#define glColor3uiv MANGLE(Color3uiv) +#define glColor3us MANGLE(Color3us) +#define glColor3usv MANGLE(Color3usv) +#define glColor4b MANGLE(Color4b) +#define glColor4bv MANGLE(Color4bv) +#define glColor4d MANGLE(Color4d) +#define glColor4dv MANGLE(Color4dv) +#define glColor4f MANGLE(Color4f) +#define glColor4fNormal3fVertex3fSUN MANGLE(Color4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN MANGLE(Color4fNormal3fVertex3fvSUN) +#define glColor4fv MANGLE(Color4fv) +#define glColor4hNV MANGLE(Color4hNV) +#define glColor4hvNV MANGLE(Color4hvNV) +#define glColor4i MANGLE(Color4i) +#define glColor4iv MANGLE(Color4iv) +#define glColor4s MANGLE(Color4s) +#define glColor4sv MANGLE(Color4sv) +#define glColor4ub MANGLE(Color4ub) +#define glColor4ubVertex2fSUN MANGLE(Color4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN MANGLE(Color4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN MANGLE(Color4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN MANGLE(Color4ubVertex3fvSUN) +#define glColor4ubv MANGLE(Color4ubv) +#define glColor4ui MANGLE(Color4ui) +#define glColor4uiv MANGLE(Color4uiv) +#define glColor4us MANGLE(Color4us) +#define glColor4usv MANGLE(Color4usv) +#define glColorFragmentOp1ATI MANGLE(ColorFragmentOp1ATI) +#define glColorFragmentOp2ATI MANGLE(ColorFragmentOp2ATI) +#define glColorFragmentOp3ATI MANGLE(ColorFragmentOp3ATI) +#define glColorMask MANGLE(ColorMask) +#define glColorMaterial MANGLE(ColorMaterial) +#define glColorPointerEXT MANGLE(ColorPointerEXT) +#define glColorPointerListIBM MANGLE(ColorPointerListIBM) +#define glColorPointer MANGLE(ColorPointer) +#define glColorPointervINTEL MANGLE(ColorPointervINTEL) +#define glColorSubTableEXT MANGLE(ColorSubTableEXT) +#define glColorSubTable MANGLE(ColorSubTable) +#define glColorTableEXT MANGLE(ColorTableEXT) +#define glColorTable MANGLE(ColorTable) +#define glColorTableParameterfv MANGLE(ColorTableParameterfv) +#define glColorTableParameterfvSGI MANGLE(ColorTableParameterfvSGI) +#define glColorTableParameteriv MANGLE(ColorTableParameteriv) +#define glColorTableParameterivSGI MANGLE(ColorTableParameterivSGI) +#define glColorTableSGI MANGLE(ColorTableSGI) +#define glCombinerInputNV MANGLE(CombinerInputNV) +#define glCombinerOutputNV MANGLE(CombinerOutputNV) +#define glCombinerParameterfNV MANGLE(CombinerParameterfNV) +#define glCombinerParameterfvNV MANGLE(CombinerParameterfvNV) +#define glCombinerParameteriNV MANGLE(CombinerParameteriNV) +#define glCombinerParameterivNV MANGLE(CombinerParameterivNV) +#define glCombinerStageParameterfvNV MANGLE(CombinerStageParameterfvNV) +#define glCompileShaderARB MANGLE(CompileShaderARB) +#define glCompressedTexImage1DARB MANGLE(CompressedTexImage1DARB) +#define glCompressedTexImage1D MANGLE(CompressedTexImage1D) +#define glCompressedTexImage2DARB MANGLE(CompressedTexImage2DARB) +#define glCompressedTexImage2D MANGLE(CompressedTexImage2D) +#define glCompressedTexImage3DARB MANGLE(CompressedTexImage3DARB) +#define glCompressedTexImage3D MANGLE(CompressedTexImage3D) +#define glCompressedTexSubImage1DARB MANGLE(CompressedTexSubImage1DARB) +#define glCompressedTexSubImage1D MANGLE(CompressedTexSubImage1D) +#define glCompressedTexSubImage2DARB MANGLE(CompressedTexSubImage2DARB) +#define glCompressedTexSubImage2D MANGLE(CompressedTexSubImage2D) +#define glCompressedTexSubImage3DARB MANGLE(CompressedTexSubImage3DARB) +#define glCompressedTexSubImage3D MANGLE(CompressedTexSubImage3D) +#define glConvolutionFilter1DEXT MANGLE(ConvolutionFilter1DEXT) +#define glConvolutionFilter1D MANGLE(ConvolutionFilter1D) +#define glConvolutionFilter2DEXT MANGLE(ConvolutionFilter2DEXT) +#define glConvolutionFilter2D MANGLE(ConvolutionFilter2D) +#define glConvolutionParameterfEXT MANGLE(ConvolutionParameterfEXT) +#define glConvolutionParameterf MANGLE(ConvolutionParameterf) +#define glConvolutionParameterfvEXT MANGLE(ConvolutionParameterfvEXT) +#define glConvolutionParameterfv MANGLE(ConvolutionParameterfv) +#define glConvolutionParameteriEXT MANGLE(ConvolutionParameteriEXT) +#define glConvolutionParameteri MANGLE(ConvolutionParameteri) +#define glConvolutionParameterivEXT MANGLE(ConvolutionParameterivEXT) +#define glConvolutionParameteriv MANGLE(ConvolutionParameteriv) +#define glCopyColorSubTableEXT MANGLE(CopyColorSubTableEXT) +#define glCopyColorSubTable MANGLE(CopyColorSubTable) +#define glCopyColorTable MANGLE(CopyColorTable) +#define glCopyColorTableSGI MANGLE(CopyColorTableSGI) +#define glCopyConvolutionFilter1DEXT MANGLE(CopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter1D MANGLE(CopyConvolutionFilter1D) +#define glCopyConvolutionFilter2DEXT MANGLE(CopyConvolutionFilter2DEXT) +#define glCopyConvolutionFilter2D MANGLE(CopyConvolutionFilter2D) +#define glCopyPixels MANGLE(CopyPixels) +#define glCopyTexImage1DEXT MANGLE(CopyTexImage1DEXT) +#define glCopyTexImage1D MANGLE(CopyTexImage1D) +#define glCopyTexImage2DEXT MANGLE(CopyTexImage2DEXT) +#define glCopyTexImage2D MANGLE(CopyTexImage2D) +#define glCopyTexSubImage1DEXT MANGLE(CopyTexSubImage1DEXT) +#define glCopyTexSubImage1D MANGLE(CopyTexSubImage1D) +#define glCopyTexSubImage2DEXT MANGLE(CopyTexSubImage2DEXT) +#define glCopyTexSubImage2D MANGLE(CopyTexSubImage2D) +#define glCopyTexSubImage3DEXT MANGLE(CopyTexSubImage3DEXT) +#define glCopyTexSubImage3D MANGLE(CopyTexSubImage3D) +#define glCreateProgramObjectARB MANGLE(CreateProgramObjectARB) +#define glCreateShaderObjectARB MANGLE(CreateShaderObjectARB) +#define glCullFace MANGLE(CullFace) +#define glCullParameterdvEXT MANGLE(CullParameterdvEXT) +#define glCullParameterfvEXT MANGLE(CullParameterfvEXT) +#define glCurrentPaletteMatrixARB MANGLE(CurrentPaletteMatrixARB) +#define glDeformationMap3dSGIX MANGLE(DeformationMap3dSGIX) +#define glDeformationMap3fSGIX MANGLE(DeformationMap3fSGIX) +#define glDeformSGIX MANGLE(DeformSGIX) +#define glDeleteAsyncMarkersSGIX MANGLE(DeleteAsyncMarkersSGIX) +#define glDeleteBuffersARB MANGLE(DeleteBuffersARB) +#define glDeleteBuffers MANGLE(DeleteBuffers) +#define glDeleteFencesAPPLE MANGLE(DeleteFencesAPPLE) +#define glDeleteFencesNV MANGLE(DeleteFencesNV) +#define glDeleteFragmentShaderATI MANGLE(DeleteFragmentShaderATI) +#define glDeleteLists MANGLE(DeleteLists) +#define glDeleteObjectARB MANGLE(DeleteObjectARB) +#define glDeleteOcclusionQueriesNV MANGLE(DeleteOcclusionQueriesNV) +#define glDeleteProgramsARB MANGLE(DeleteProgramsARB) +#define glDeleteProgramsNV MANGLE(DeleteProgramsNV) +#define glDeleteQueriesARB MANGLE(DeleteQueriesARB) +#define glDeleteQueries MANGLE(DeleteQueries) +#define glDeleteTexturesEXT MANGLE(DeleteTexturesEXT) +#define glDeleteTextures MANGLE(DeleteTextures) +#define glDeleteVertexArraysAPPLE MANGLE(DeleteVertexArraysAPPLE) +#define glDeleteVertexShaderEXT MANGLE(DeleteVertexShaderEXT) +#define glDepthBoundsEXT MANGLE(DepthBoundsEXT) +#define glDepthFunc MANGLE(DepthFunc) +#define glDepthMask MANGLE(DepthMask) +#define glDepthRange MANGLE(DepthRange) +#define glDetachObjectARB MANGLE(DetachObjectARB) +#define glDetailTexFuncSGIS MANGLE(DetailTexFuncSGIS) +#define glDisableClientState MANGLE(DisableClientState) +#define glDisable MANGLE(Disable) +#define glDisableTraceMESA MANGLE(DisableTraceMESA) +#define glDisableVariantClientStateEXT MANGLE(DisableVariantClientStateEXT) +#define glDisableVertexAttribArrayARB MANGLE(DisableVertexAttribArrayARB) +#define glDrawArraysEXT MANGLE(DrawArraysEXT) +#define glDrawArrays MANGLE(DrawArrays) +#define glDrawBuffer MANGLE(DrawBuffer) +#define glDrawBuffersATI MANGLE(DrawBuffersATI) +#define glDrawElementArrayAPPLE MANGLE(DrawElementArrayAPPLE) +#define glDrawElementArrayATI MANGLE(DrawElementArrayATI) +#define glDrawElements MANGLE(DrawElements) +#define glDrawMeshArraysSUN MANGLE(DrawMeshArraysSUN) +#define glDrawPixels MANGLE(DrawPixels) +#define glDrawRangeElementArrayAPPLE MANGLE(DrawRangeElementArrayAPPLE) +#define glDrawRangeElementArrayATI MANGLE(DrawRangeElementArrayATI) +#define glDrawRangeElementsEXT MANGLE(DrawRangeElementsEXT) +#define glDrawRangeElements MANGLE(DrawRangeElements) +#define glEdgeFlag MANGLE(EdgeFlag) +#define glEdgeFlagPointerEXT MANGLE(EdgeFlagPointerEXT) +#define glEdgeFlagPointerListIBM MANGLE(EdgeFlagPointerListIBM) +#define glEdgeFlagPointer MANGLE(EdgeFlagPointer) +#define glEdgeFlagv MANGLE(EdgeFlagv) +#define glElementPointerAPPLE MANGLE(ElementPointerAPPLE) +#define glElementPointerATI MANGLE(ElementPointerATI) +#define glEnableClientState MANGLE(EnableClientState) +#define glEnable MANGLE(Enable) +#define glEnableTraceMESA MANGLE(EnableTraceMESA) +#define glEnableVariantClientStateEXT MANGLE(EnableVariantClientStateEXT) +#define glEnableVertexAttribArrayARB MANGLE(EnableVertexAttribArrayARB) +#define glEndFragmentShaderATI MANGLE(EndFragmentShaderATI) +#define glEndList MANGLE(EndList) +#define glEnd MANGLE(End) +#define glEndOcclusionQueryNV MANGLE(EndOcclusionQueryNV) +#define glEndQueryARB MANGLE(EndQueryARB) +#define glEndQuery MANGLE(EndQuery) +#define glEndTraceMESA MANGLE(EndTraceMESA) +#define glEndVertexShaderEXT MANGLE(EndVertexShaderEXT) +#define glEvalCoord1d MANGLE(EvalCoord1d) +#define glEvalCoord1dv MANGLE(EvalCoord1dv) +#define glEvalCoord1f MANGLE(EvalCoord1f) +#define glEvalCoord1fv MANGLE(EvalCoord1fv) +#define glEvalCoord2d MANGLE(EvalCoord2d) +#define glEvalCoord2dv MANGLE(EvalCoord2dv) +#define glEvalCoord2f MANGLE(EvalCoord2f) +#define glEvalCoord2fv MANGLE(EvalCoord2fv) +#define glEvalMapsNV MANGLE(EvalMapsNV) +#define glEvalMesh1 MANGLE(EvalMesh1) +#define glEvalMesh2 MANGLE(EvalMesh2) +#define glEvalPoint1 MANGLE(EvalPoint1) +#define glEvalPoint2 MANGLE(EvalPoint2) +#define glExecuteProgramNV MANGLE(ExecuteProgramNV) +#define glExtractComponentEXT MANGLE(ExtractComponentEXT) +#define glFeedbackBuffer MANGLE(FeedbackBuffer) +#define glFinalCombinerInputNV MANGLE(FinalCombinerInputNV) +#define glFinishAsyncSGIX MANGLE(FinishAsyncSGIX) +#define glFinishFenceAPPLE MANGLE(FinishFenceAPPLE) +#define glFinishFenceNV MANGLE(FinishFenceNV) +#define glFinish MANGLE(Finish) +#define glFinishObjectAPPLE MANGLE(FinishObjectAPPLE) +#define glFinishTextureSUNX MANGLE(FinishTextureSUNX) +#define glFlush MANGLE(Flush) +#define glFlushPixelDataRangeNV MANGLE(FlushPixelDataRangeNV) +#define glFlushRasterSGIX MANGLE(FlushRasterSGIX) +#define glFlushVertexArrayRangeAPPLE MANGLE(FlushVertexArrayRangeAPPLE) +#define glFlushVertexArrayRangeNV MANGLE(FlushVertexArrayRangeNV) +#define glFogCoorddEXT MANGLE(FogCoorddEXT) +#define glFogCoordd MANGLE(FogCoordd) +#define glFogCoorddvEXT MANGLE(FogCoorddvEXT) +#define glFogCoorddv MANGLE(FogCoorddv) +#define glFogCoordfEXT MANGLE(FogCoordfEXT) +#define glFogCoordf MANGLE(FogCoordf) +#define glFogCoordfvEXT MANGLE(FogCoordfvEXT) +#define glFogCoordfv MANGLE(FogCoordfv) +#define glFogCoordhNV MANGLE(FogCoordhNV) +#define glFogCoordhvNV MANGLE(FogCoordhvNV) +#define glFogCoordPointerEXT MANGLE(FogCoordPointerEXT) +#define glFogCoordPointerListIBM MANGLE(FogCoordPointerListIBM) +#define glFogCoordPointer MANGLE(FogCoordPointer) +#define glFogf MANGLE(Fogf) +#define glFogFuncSGIS MANGLE(FogFuncSGIS) +#define glFogfv MANGLE(Fogfv) +#define glFogi MANGLE(Fogi) +#define glFogiv MANGLE(Fogiv) +#define glFragmentColorMaterialSGIX MANGLE(FragmentColorMaterialSGIX) +#define glFragmentLightfSGIX MANGLE(FragmentLightfSGIX) +#define glFragmentLightfvSGIX MANGLE(FragmentLightfvSGIX) +#define glFragmentLightiSGIX MANGLE(FragmentLightiSGIX) +#define glFragmentLightivSGIX MANGLE(FragmentLightivSGIX) +#define glFragmentLightModelfSGIX MANGLE(FragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX MANGLE(FragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX MANGLE(FragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX MANGLE(FragmentLightModelivSGIX) +#define glFragmentMaterialfSGIX MANGLE(FragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX MANGLE(FragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX MANGLE(FragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX MANGLE(FragmentMaterialivSGIX) +#define glFrameZoomSGIX MANGLE(FrameZoomSGIX) +#define glFreeObjectBufferATI MANGLE(FreeObjectBufferATI) +#define glFrontFace MANGLE(FrontFace) +#define glFrustum MANGLE(Frustum) +#define glGenAsyncMarkersSGIX MANGLE(GenAsyncMarkersSGIX) +#define glGenBuffersARB MANGLE(GenBuffersARB) +#define glGenBuffers MANGLE(GenBuffers) +#define glGenFencesAPPLE MANGLE(GenFencesAPPLE) +#define glGenFencesNV MANGLE(GenFencesNV) +#define glGenFragmentShadersATI MANGLE(GenFragmentShadersATI) +#define glGenLists MANGLE(GenLists) +#define glGenOcclusionQueriesNV MANGLE(GenOcclusionQueriesNV) +#define glGenProgramsARB MANGLE(GenProgramsARB) +#define glGenProgramsNV MANGLE(GenProgramsNV) +#define glGenQueriesARB MANGLE(GenQueriesARB) +#define glGenQueries MANGLE(GenQueries) +#define glGenSymbolsEXT MANGLE(GenSymbolsEXT) +#define glGenTexturesEXT MANGLE(GenTexturesEXT) +#define glGenTextures MANGLE(GenTextures) +#define glGenVertexArraysAPPLE MANGLE(GenVertexArraysAPPLE) +#define glGenVertexShadersEXT MANGLE(GenVertexShadersEXT) +#define glGetActiveAttribARB MANGLE(GetActiveAttribARB) +#define glGetActiveUniformARB MANGLE(GetActiveUniformARB) +#define glGetArrayObjectfvATI MANGLE(GetArrayObjectfvATI) +#define glGetArrayObjectivATI MANGLE(GetArrayObjectivATI) +#define glGetAttachedObjectsARB MANGLE(GetAttachedObjectsARB) +#define glGetAttribLocationARB MANGLE(GetAttribLocationARB) +#define glGetBooleanv MANGLE(GetBooleanv) +#define glGetBufferParameterivARB MANGLE(GetBufferParameterivARB) +#define glGetBufferParameteriv MANGLE(GetBufferParameteriv) +#define glGetBufferPointervARB MANGLE(GetBufferPointervARB) +#define glGetBufferPointerv MANGLE(GetBufferPointerv) +#define glGetBufferSubDataARB MANGLE(GetBufferSubDataARB) +#define glGetBufferSubData MANGLE(GetBufferSubData) +#define glGetClipPlane MANGLE(GetClipPlane) +#define glGetColorTableEXT MANGLE(GetColorTableEXT) +#define glGetColorTable MANGLE(GetColorTable) +#define glGetColorTableParameterfvEXT MANGLE(GetColorTableParameterfvEXT) +#define glGetColorTableParameterfv MANGLE(GetColorTableParameterfv) +#define glGetColorTableParameterfvSGI MANGLE(GetColorTableParameterfvSGI) +#define glGetColorTableParameterivEXT MANGLE(GetColorTableParameterivEXT) +#define glGetColorTableParameteriv MANGLE(GetColorTableParameteriv) +#define glGetColorTableParameterivSGI MANGLE(GetColorTableParameterivSGI) +#define glGetColorTableSGI MANGLE(GetColorTableSGI) +#define glGetCombinerInputParameterfvNV MANGLE(GetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV MANGLE(GetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV MANGLE(GetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV MANGLE(GetCombinerOutputParameterivNV) +#define glGetCombinerStageParameterfvNV MANGLE(GetCombinerStageParameterfvNV) +#define glGetCompressedTexImageARB MANGLE(GetCompressedTexImageARB) +#define glGetCompressedTexImage MANGLE(GetCompressedTexImage) +#define glGetConvolutionFilterEXT MANGLE(GetConvolutionFilterEXT) +#define glGetConvolutionFilter MANGLE(GetConvolutionFilter) +#define glGetConvolutionParameterfvEXT MANGLE(GetConvolutionParameterfvEXT) +#define glGetConvolutionParameterfv MANGLE(GetConvolutionParameterfv) +#define glGetConvolutionParameterivEXT MANGLE(GetConvolutionParameterivEXT) +#define glGetConvolutionParameteriv MANGLE(GetConvolutionParameteriv) +#define glGetDetailTexFuncSGIS MANGLE(GetDetailTexFuncSGIS) +#define glGetDoublev MANGLE(GetDoublev) +#define glGetError MANGLE(GetError) +#define glGetFenceivNV MANGLE(GetFenceivNV) +#define glGetFinalCombinerInputParameterfvNV MANGLE(GetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV MANGLE(GetFinalCombinerInputParameterivNV) +#define glGetFloatv MANGLE(GetFloatv) +#define glGetFogFuncSGIS MANGLE(GetFogFuncSGIS) +#define glGetFragmentLightfvSGIX MANGLE(GetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX MANGLE(GetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX MANGLE(GetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX MANGLE(GetFragmentMaterialivSGIX) +#define glGetHandleARB MANGLE(GetHandleARB) +#define glGetHistogramEXT MANGLE(GetHistogramEXT) +#define glGetHistogram MANGLE(GetHistogram) +#define glGetHistogramParameterfvEXT MANGLE(GetHistogramParameterfvEXT) +#define glGetHistogramParameterfv MANGLE(GetHistogramParameterfv) +#define glGetHistogramParameterivEXT MANGLE(GetHistogramParameterivEXT) +#define glGetHistogramParameteriv MANGLE(GetHistogramParameteriv) +#define glGetImageTransformParameterfvHP MANGLE(GetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP MANGLE(GetImageTransformParameterivHP) +#define glGetInfoLogARB MANGLE(GetInfoLogARB) +#define glGetInstrumentsSGIX MANGLE(GetInstrumentsSGIX) +#define glGetIntegerv MANGLE(GetIntegerv) +#define glGetInvariantBooleanvEXT MANGLE(GetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT MANGLE(GetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT MANGLE(GetInvariantIntegervEXT) +#define glGetLightfv MANGLE(GetLightfv) +#define glGetLightiv MANGLE(GetLightiv) +#define glGetListParameterfvSGIX MANGLE(GetListParameterfvSGIX) +#define glGetListParameterivSGIX MANGLE(GetListParameterivSGIX) +#define glGetLocalConstantBooleanvEXT MANGLE(GetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT MANGLE(GetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT MANGLE(GetLocalConstantIntegervEXT) +#define glGetMapAttribParameterfvNV MANGLE(GetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV MANGLE(GetMapAttribParameterivNV) +#define glGetMapControlPointsNV MANGLE(GetMapControlPointsNV) +#define glGetMapdv MANGLE(GetMapdv) +#define glGetMapfv MANGLE(GetMapfv) +#define glGetMapiv MANGLE(GetMapiv) +#define glGetMapParameterfvNV MANGLE(GetMapParameterfvNV) +#define glGetMapParameterivNV MANGLE(GetMapParameterivNV) +#define glGetMaterialfv MANGLE(GetMaterialfv) +#define glGetMaterialiv MANGLE(GetMaterialiv) +#define glGetMinmaxEXT MANGLE(GetMinmaxEXT) +#define glGetMinmax MANGLE(GetMinmax) +#define glGetMinmaxParameterfvEXT MANGLE(GetMinmaxParameterfvEXT) +#define glGetMinmaxParameterfv MANGLE(GetMinmaxParameterfv) +#define glGetMinmaxParameterivEXT MANGLE(GetMinmaxParameterivEXT) +#define glGetMinmaxParameteriv MANGLE(GetMinmaxParameteriv) +#define glGetObjectBufferfvATI MANGLE(GetObjectBufferfvATI) +#define glGetObjectBufferivATI MANGLE(GetObjectBufferivATI) +#define glGetObjectParameterfvARB MANGLE(GetObjectParameterfvARB) +#define glGetObjectParameterivARB MANGLE(GetObjectParameterivARB) +#define glGetOcclusionQueryivNV MANGLE(GetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV MANGLE(GetOcclusionQueryuivNV) +#define glGetPixelMapfv MANGLE(GetPixelMapfv) +#define glGetPixelMapuiv MANGLE(GetPixelMapuiv) +#define glGetPixelMapusv MANGLE(GetPixelMapusv) +#define glGetPixelTexGenParameterfvSGIS MANGLE(GetPixelTexGenParameterfvSGIS) +#define glGetPixelTexGenParameterivSGIS MANGLE(GetPixelTexGenParameterivSGIS) +#define glGetPointervEXT MANGLE(GetPointervEXT) +#define glGetPointerv MANGLE(GetPointerv) +#define glGetPolygonStipple MANGLE(GetPolygonStipple) +#define glGetProgramEnvParameterdvARB MANGLE(GetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB MANGLE(GetProgramEnvParameterfvARB) +#define glGetProgramivARB MANGLE(GetProgramivARB) +#define glGetProgramivNV MANGLE(GetProgramivNV) +#define glGetProgramLocalParameterdvARB MANGLE(GetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB MANGLE(GetProgramLocalParameterfvARB) +#define glGetProgramNamedParameterdvNV MANGLE(GetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV MANGLE(GetProgramNamedParameterfvNV) +#define glGetProgramParameterdvNV MANGLE(GetProgramParameterdvNV) +#define glGetProgramParameterfvNV MANGLE(GetProgramParameterfvNV) +#define glGetProgramStringARB MANGLE(GetProgramStringARB) +#define glGetProgramStringNV MANGLE(GetProgramStringNV) +#define glGetQueryivARB MANGLE(GetQueryivARB) +#define glGetQueryiv MANGLE(GetQueryiv) +#define glGetQueryObjectivARB MANGLE(GetQueryObjectivARB) +#define glGetQueryObjectiv MANGLE(GetQueryObjectiv) +#define glGetQueryObjectuivARB MANGLE(GetQueryObjectuivARB) +#define glGetQueryObjectuiv MANGLE(GetQueryObjectuiv) +#define glGetSeparableFilterEXT MANGLE(GetSeparableFilterEXT) +#define glGetSeparableFilter MANGLE(GetSeparableFilter) +#define glGetShaderSourceARB MANGLE(GetShaderSourceARB) +#define glGetSharpenTexFuncSGIS MANGLE(GetSharpenTexFuncSGIS) +#define glGetString MANGLE(GetString) +#define glGetTexBumpParameterfvATI MANGLE(GetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI MANGLE(GetTexBumpParameterivATI) +#define glGetTexEnvfv MANGLE(GetTexEnvfv) +#define glGetTexEnviv MANGLE(GetTexEnviv) +#define glGetTexFilterFuncSGIS MANGLE(GetTexFilterFuncSGIS) +#define glGetTexGendv MANGLE(GetTexGendv) +#define glGetTexGenfv MANGLE(GetTexGenfv) +#define glGetTexGeniv MANGLE(GetTexGeniv) +#define glGetTexImage MANGLE(GetTexImage) +#define glGetTexLevelParameterfv MANGLE(GetTexLevelParameterfv) +#define glGetTexLevelParameteriv MANGLE(GetTexLevelParameteriv) +#define glGetTexParameterfv MANGLE(GetTexParameterfv) +#define glGetTexParameteriv MANGLE(GetTexParameteriv) +#define glGetTrackMatrixivNV MANGLE(GetTrackMatrixivNV) +#define glGetUniformfvARB MANGLE(GetUniformfvARB) +#define glGetUniformivARB MANGLE(GetUniformivARB) +#define glGetUniformLocationARB MANGLE(GetUniformLocationARB) +#define glGetVariantArrayObjectfvATI MANGLE(GetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI MANGLE(GetVariantArrayObjectivATI) +#define glGetVariantBooleanvEXT MANGLE(GetVariantBooleanvEXT) +#define glGetVariantFloatvEXT MANGLE(GetVariantFloatvEXT) +#define glGetVariantIntegervEXT MANGLE(GetVariantIntegervEXT) +#define glGetVariantPointervEXT MANGLE(GetVariantPointervEXT) +#define glGetVertexAttribArrayObjectfvATI MANGLE(GetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI MANGLE(GetVertexAttribArrayObjectivATI) +#define glGetVertexAttribdvARB MANGLE(GetVertexAttribdvARB) +#define glGetVertexAttribdvNV MANGLE(GetVertexAttribdvNV) +#define glGetVertexAttribfvARB MANGLE(GetVertexAttribfvARB) +#define glGetVertexAttribfvNV MANGLE(GetVertexAttribfvNV) +#define glGetVertexAttribivARB MANGLE(GetVertexAttribivARB) +#define glGetVertexAttribivNV MANGLE(GetVertexAttribivNV) +#define glGetVertexAttribPointervARB MANGLE(GetVertexAttribPointervARB) +#define glGetVertexAttribPointervNV MANGLE(GetVertexAttribPointervNV) +#define glGlobalAlphaFactorbSUN MANGLE(GlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN MANGLE(GlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN MANGLE(GlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN MANGLE(GlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN MANGLE(GlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN MANGLE(GlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN MANGLE(GlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN MANGLE(GlobalAlphaFactorusSUN) +#define glHint MANGLE(Hint) +#define glHintPGI MANGLE(HintPGI) +#define glHistogramEXT MANGLE(HistogramEXT) +#define glHistogram MANGLE(Histogram) +#define glIglooInterfaceSGIX MANGLE(IglooInterfaceSGIX) +#define glImageTransformParameterfHP MANGLE(ImageTransformParameterfHP) +#define glImageTransformParameterfvHP MANGLE(ImageTransformParameterfvHP) +#define glImageTransformParameteriHP MANGLE(ImageTransformParameteriHP) +#define glImageTransformParameterivHP MANGLE(ImageTransformParameterivHP) +#define glIndexd MANGLE(Indexd) +#define glIndexdv MANGLE(Indexdv) +#define glIndexf MANGLE(Indexf) +#define glIndexFuncEXT MANGLE(IndexFuncEXT) +#define glIndexfv MANGLE(Indexfv) +#define glIndexi MANGLE(Indexi) +#define glIndexiv MANGLE(Indexiv) +#define glIndexMask MANGLE(IndexMask) +#define glIndexMaterialEXT MANGLE(IndexMaterialEXT) +#define glIndexPointerEXT MANGLE(IndexPointerEXT) +#define glIndexPointerListIBM MANGLE(IndexPointerListIBM) +#define glIndexPointer MANGLE(IndexPointer) +#define glIndexs MANGLE(Indexs) +#define glIndexsv MANGLE(Indexsv) +#define glIndexub MANGLE(Indexub) +#define glIndexubv MANGLE(Indexubv) +#define glInitNames MANGLE(InitNames) +#define glInsertComponentEXT MANGLE(InsertComponentEXT) +#define glInstrumentsBufferSGIX MANGLE(InstrumentsBufferSGIX) +#define glInterleavedArrays MANGLE(InterleavedArrays) +#define glIsAsyncMarkerSGIX MANGLE(IsAsyncMarkerSGIX) +#define glIsBufferARB MANGLE(IsBufferARB) +#define glIsBuffer MANGLE(IsBuffer) +#define glIsEnabled MANGLE(IsEnabled) +#define glIsFenceAPPLE MANGLE(IsFenceAPPLE) +#define glIsFenceNV MANGLE(IsFenceNV) +#define glIsList MANGLE(IsList) +#define glIsObjectBufferATI MANGLE(IsObjectBufferATI) +#define glIsOcclusionQueryNV MANGLE(IsOcclusionQueryNV) +#define glIsProgramARB MANGLE(IsProgramARB) +#define glIsProgramNV MANGLE(IsProgramNV) +#define glIsQueryARB MANGLE(IsQueryARB) +#define glIsQuery MANGLE(IsQuery) +#define glIsTextureEXT MANGLE(IsTextureEXT) +#define glIsTexture MANGLE(IsTexture) +#define glIsVariantEnabledEXT MANGLE(IsVariantEnabledEXT) +#define glIsVertexArrayAPPLE MANGLE(IsVertexArrayAPPLE) +#define glLightEnviSGIX MANGLE(LightEnviSGIX) +#define glLightf MANGLE(Lightf) +#define glLightfv MANGLE(Lightfv) +#define glLighti MANGLE(Lighti) +#define glLightiv MANGLE(Lightiv) +#define glLightModelf MANGLE(LightModelf) +#define glLightModelfv MANGLE(LightModelfv) +#define glLightModeli MANGLE(LightModeli) +#define glLightModeliv MANGLE(LightModeliv) +#define glLineStipple MANGLE(LineStipple) +#define glLineWidth MANGLE(LineWidth) +#define glLinkProgramARB MANGLE(LinkProgramARB) +#define glListBase MANGLE(ListBase) +#define glListParameterfSGIX MANGLE(ListParameterfSGIX) +#define glListParameterfvSGIX MANGLE(ListParameterfvSGIX) +#define glListParameteriSGIX MANGLE(ListParameteriSGIX) +#define glListParameterivSGIX MANGLE(ListParameterivSGIX) +#define glLoadIdentityDeformationMapSGIX MANGLE(LoadIdentityDeformationMapSGIX) +#define glLoadIdentity MANGLE(LoadIdentity) +#define glLoadMatrixd MANGLE(LoadMatrixd) +#define glLoadMatrixf MANGLE(LoadMatrixf) +#define glLoadName MANGLE(LoadName) +#define glLoadProgramNV MANGLE(LoadProgramNV) +#define glLoadTransposeMatrixdARB MANGLE(LoadTransposeMatrixdARB) +#define glLoadTransposeMatrixd MANGLE(LoadTransposeMatrixd) +#define glLoadTransposeMatrixfARB MANGLE(LoadTransposeMatrixfARB) +#define glLoadTransposeMatrixf MANGLE(LoadTransposeMatrixf) +#define glLockArraysEXT MANGLE(LockArraysEXT) +#define glLogicOp MANGLE(LogicOp) +#define glMap1d MANGLE(Map1d) +#define glMap1f MANGLE(Map1f) +#define glMap2d MANGLE(Map2d) +#define glMap2f MANGLE(Map2f) +#define glMapBufferARB MANGLE(MapBufferARB) +#define glMapBuffer MANGLE(MapBuffer) +#define glMapControlPointsNV MANGLE(MapControlPointsNV) +#define glMapGrid1d MANGLE(MapGrid1d) +#define glMapGrid1f MANGLE(MapGrid1f) +#define glMapGrid2d MANGLE(MapGrid2d) +#define glMapGrid2f MANGLE(MapGrid2f) +#define glMapObjectBufferATI MANGLE(MapObjectBufferATI) +#define glMapParameterfvNV MANGLE(MapParameterfvNV) +#define glMapParameterivNV MANGLE(MapParameterivNV) +#define glMaterialf MANGLE(Materialf) +#define glMaterialfv MANGLE(Materialfv) +#define glMateriali MANGLE(Materiali) +#define glMaterialiv MANGLE(Materialiv) +#define glMatrixIndexPointerARB MANGLE(MatrixIndexPointerARB) +#define glMatrixIndexubvARB MANGLE(MatrixIndexubvARB) +#define glMatrixIndexuivARB MANGLE(MatrixIndexuivARB) +#define glMatrixIndexusvARB MANGLE(MatrixIndexusvARB) +#define glMatrixMode MANGLE(MatrixMode) +#define glMinmaxEXT MANGLE(MinmaxEXT) +#define glMinmax MANGLE(Minmax) +#define glMultiDrawArraysEXT MANGLE(MultiDrawArraysEXT) +#define glMultiDrawArrays MANGLE(MultiDrawArrays) +#define glMultiDrawElementArrayAPPLE MANGLE(MultiDrawElementArrayAPPLE) +#define glMultiDrawElementsEXT MANGLE(MultiDrawElementsEXT) +#define glMultiDrawElements MANGLE(MultiDrawElements) +#define glMultiDrawRangeElementArrayAPPLE MANGLE(MultiDrawRangeElementArrayAPPLE) +#define glMultiModeDrawArraysIBM MANGLE(MultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM MANGLE(MultiModeDrawElementsIBM) +#define glMultiTexCoord1dARB MANGLE(MultiTexCoord1dARB) +#define glMultiTexCoord1d MANGLE(MultiTexCoord1d) +#define glMultiTexCoord1dvARB MANGLE(MultiTexCoord1dvARB) +#define glMultiTexCoord1dv MANGLE(MultiTexCoord1dv) +#define glMultiTexCoord1fARB MANGLE(MultiTexCoord1fARB) +#define glMultiTexCoord1f MANGLE(MultiTexCoord1f) +#define glMultiTexCoord1fvARB MANGLE(MultiTexCoord1fvARB) +#define glMultiTexCoord1fv MANGLE(MultiTexCoord1fv) +#define glMultiTexCoord1hNV MANGLE(MultiTexCoord1hNV) +#define glMultiTexCoord1hvNV MANGLE(MultiTexCoord1hvNV) +#define glMultiTexCoord1iARB MANGLE(MultiTexCoord1iARB) +#define glMultiTexCoord1i MANGLE(MultiTexCoord1i) +#define glMultiTexCoord1ivARB MANGLE(MultiTexCoord1ivARB) +#define glMultiTexCoord1iv MANGLE(MultiTexCoord1iv) +#define glMultiTexCoord1sARB MANGLE(MultiTexCoord1sARB) +#define glMultiTexCoord1s MANGLE(MultiTexCoord1s) +#define glMultiTexCoord1svARB MANGLE(MultiTexCoord1svARB) +#define glMultiTexCoord1sv MANGLE(MultiTexCoord1sv) +#define glMultiTexCoord2dARB MANGLE(MultiTexCoord2dARB) +#define glMultiTexCoord2d MANGLE(MultiTexCoord2d) +#define glMultiTexCoord2dvARB MANGLE(MultiTexCoord2dvARB) +#define glMultiTexCoord2dv MANGLE(MultiTexCoord2dv) +#define glMultiTexCoord2fARB MANGLE(MultiTexCoord2fARB) +#define glMultiTexCoord2f MANGLE(MultiTexCoord2f) +#define glMultiTexCoord2fvARB MANGLE(MultiTexCoord2fvARB) +#define glMultiTexCoord2fv MANGLE(MultiTexCoord2fv) +#define glMultiTexCoord2hNV MANGLE(MultiTexCoord2hNV) +#define glMultiTexCoord2hvNV MANGLE(MultiTexCoord2hvNV) +#define glMultiTexCoord2iARB MANGLE(MultiTexCoord2iARB) +#define glMultiTexCoord2i MANGLE(MultiTexCoord2i) +#define glMultiTexCoord2ivARB MANGLE(MultiTexCoord2ivARB) +#define glMultiTexCoord2iv MANGLE(MultiTexCoord2iv) +#define glMultiTexCoord2sARB MANGLE(MultiTexCoord2sARB) +#define glMultiTexCoord2s MANGLE(MultiTexCoord2s) +#define glMultiTexCoord2svARB MANGLE(MultiTexCoord2svARB) +#define glMultiTexCoord2sv MANGLE(MultiTexCoord2sv) +#define glMultiTexCoord3dARB MANGLE(MultiTexCoord3dARB) +#define glMultiTexCoord3d MANGLE(MultiTexCoord3d) +#define glMultiTexCoord3dvARB MANGLE(MultiTexCoord3dvARB) +#define glMultiTexCoord3dv MANGLE(MultiTexCoord3dv) +#define glMultiTexCoord3fARB MANGLE(MultiTexCoord3fARB) +#define glMultiTexCoord3f MANGLE(MultiTexCoord3f) +#define glMultiTexCoord3fvARB MANGLE(MultiTexCoord3fvARB) +#define glMultiTexCoord3fv MANGLE(MultiTexCoord3fv) +#define glMultiTexCoord3hNV MANGLE(MultiTexCoord3hNV) +#define glMultiTexCoord3hvNV MANGLE(MultiTexCoord3hvNV) +#define glMultiTexCoord3iARB MANGLE(MultiTexCoord3iARB) +#define glMultiTexCoord3i MANGLE(MultiTexCoord3i) +#define glMultiTexCoord3ivARB MANGLE(MultiTexCoord3ivARB) +#define glMultiTexCoord3iv MANGLE(MultiTexCoord3iv) +#define glMultiTexCoord3sARB MANGLE(MultiTexCoord3sARB) +#define glMultiTexCoord3s MANGLE(MultiTexCoord3s) +#define glMultiTexCoord3svARB MANGLE(MultiTexCoord3svARB) +#define glMultiTexCoord3sv MANGLE(MultiTexCoord3sv) +#define glMultiTexCoord4dARB MANGLE(MultiTexCoord4dARB) +#define glMultiTexCoord4d MANGLE(MultiTexCoord4d) +#define glMultiTexCoord4dvARB MANGLE(MultiTexCoord4dvARB) +#define glMultiTexCoord4dv MANGLE(MultiTexCoord4dv) +#define glMultiTexCoord4fARB MANGLE(MultiTexCoord4fARB) +#define glMultiTexCoord4f MANGLE(MultiTexCoord4f) +#define glMultiTexCoord4fvARB MANGLE(MultiTexCoord4fvARB) +#define glMultiTexCoord4fv MANGLE(MultiTexCoord4fv) +#define glMultiTexCoord4hNV MANGLE(MultiTexCoord4hNV) +#define glMultiTexCoord4hvNV MANGLE(MultiTexCoord4hvNV) +#define glMultiTexCoord4iARB MANGLE(MultiTexCoord4iARB) +#define glMultiTexCoord4i MANGLE(MultiTexCoord4i) +#define glMultiTexCoord4ivARB MANGLE(MultiTexCoord4ivARB) +#define glMultiTexCoord4iv MANGLE(MultiTexCoord4iv) +#define glMultiTexCoord4sARB MANGLE(MultiTexCoord4sARB) +#define glMultiTexCoord4s MANGLE(MultiTexCoord4s) +#define glMultiTexCoord4svARB MANGLE(MultiTexCoord4svARB) +#define glMultiTexCoord4sv MANGLE(MultiTexCoord4sv) +#define glMultMatrixd MANGLE(MultMatrixd) +#define glMultMatrixf MANGLE(MultMatrixf) +#define glMultTransposeMatrixdARB MANGLE(MultTransposeMatrixdARB) +#define glMultTransposeMatrixd MANGLE(MultTransposeMatrixd) +#define glMultTransposeMatrixfARB MANGLE(MultTransposeMatrixfARB) +#define glMultTransposeMatrixf MANGLE(MultTransposeMatrixf) +#define glNewList MANGLE(NewList) +#define glNewObjectBufferATI MANGLE(NewObjectBufferATI) +#define glNewTraceMESA MANGLE(NewTraceMESA) +#define glNormal3b MANGLE(Normal3b) +#define glNormal3bv MANGLE(Normal3bv) +#define glNormal3d MANGLE(Normal3d) +#define glNormal3dv MANGLE(Normal3dv) +#define glNormal3f MANGLE(Normal3f) +#define glNormal3fVertex3fSUN MANGLE(Normal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN MANGLE(Normal3fVertex3fvSUN) +#define glNormal3fv MANGLE(Normal3fv) +#define glNormal3hNV MANGLE(Normal3hNV) +#define glNormal3hvNV MANGLE(Normal3hvNV) +#define glNormal3i MANGLE(Normal3i) +#define glNormal3iv MANGLE(Normal3iv) +#define glNormal3s MANGLE(Normal3s) +#define glNormal3sv MANGLE(Normal3sv) +#define glNormalPointerEXT MANGLE(NormalPointerEXT) +#define glNormalPointerListIBM MANGLE(NormalPointerListIBM) +#define glNormalPointer MANGLE(NormalPointer) +#define glNormalPointervINTEL MANGLE(NormalPointervINTEL) +#define glNormalStream3bATI MANGLE(NormalStream3bATI) +#define glNormalStream3bvATI MANGLE(NormalStream3bvATI) +#define glNormalStream3dATI MANGLE(NormalStream3dATI) +#define glNormalStream3dvATI MANGLE(NormalStream3dvATI) +#define glNormalStream3fATI MANGLE(NormalStream3fATI) +#define glNormalStream3fvATI MANGLE(NormalStream3fvATI) +#define glNormalStream3iATI MANGLE(NormalStream3iATI) +#define glNormalStream3ivATI MANGLE(NormalStream3ivATI) +#define glNormalStream3sATI MANGLE(NormalStream3sATI) +#define glNormalStream3svATI MANGLE(NormalStream3svATI) +#define glOrtho MANGLE(Ortho) +#define glPassTexCoordATI MANGLE(PassTexCoordATI) +#define glPassThrough MANGLE(PassThrough) +#define glPixelDataRangeNV MANGLE(PixelDataRangeNV) +#define glPixelMapfv MANGLE(PixelMapfv) +#define glPixelMapuiv MANGLE(PixelMapuiv) +#define glPixelMapusv MANGLE(PixelMapusv) +#define glPixelStoref MANGLE(PixelStoref) +#define glPixelStorei MANGLE(PixelStorei) +#define glPixelTexGenParameterfSGIS MANGLE(PixelTexGenParameterfSGIS) +#define glPixelTexGenParameterfvSGIS MANGLE(PixelTexGenParameterfvSGIS) +#define glPixelTexGenParameteriSGIS MANGLE(PixelTexGenParameteriSGIS) +#define glPixelTexGenParameterivSGIS MANGLE(PixelTexGenParameterivSGIS) +#define glPixelTexGenSGIX MANGLE(PixelTexGenSGIX) +#define glPixelTransferf MANGLE(PixelTransferf) +#define glPixelTransferi MANGLE(PixelTransferi) +#define glPixelTransformParameterfEXT MANGLE(PixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT MANGLE(PixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT MANGLE(PixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT MANGLE(PixelTransformParameterivEXT) +#define glPixelZoom MANGLE(PixelZoom) +#define glPNTrianglesfATI MANGLE(PNTrianglesfATI) +#define glPNTrianglesiATI MANGLE(PNTrianglesiATI) +#define glPointParameterfARB MANGLE(PointParameterfARB) +#define glPointParameterfEXT MANGLE(PointParameterfEXT) +#define glPointParameterf MANGLE(PointParameterf) +#define glPointParameterfSGIS MANGLE(PointParameterfSGIS) +#define glPointParameterfvARB MANGLE(PointParameterfvARB) +#define glPointParameterfvEXT MANGLE(PointParameterfvEXT) +#define glPointParameterfv MANGLE(PointParameterfv) +#define glPointParameterfvSGIS MANGLE(PointParameterfvSGIS) +#define glPointParameteri MANGLE(PointParameteri) +#define glPointParameteriNV MANGLE(PointParameteriNV) +#define glPointParameteriv MANGLE(PointParameteriv) +#define glPointParameterivNV MANGLE(PointParameterivNV) +#define glPointSize MANGLE(PointSize) +#define glPollAsyncSGIX MANGLE(PollAsyncSGIX) +#define glPollInstrumentsSGIX MANGLE(PollInstrumentsSGIX) +#define glPolygonMode MANGLE(PolygonMode) +#define glPolygonOffsetEXT MANGLE(PolygonOffsetEXT) +#define glPolygonOffset MANGLE(PolygonOffset) +#define glPolygonStipple MANGLE(PolygonStipple) +#define glPopAttrib MANGLE(PopAttrib) +#define glPopClientAttrib MANGLE(PopClientAttrib) +#define glPopMatrix MANGLE(PopMatrix) +#define glPopName MANGLE(PopName) +#define glPrimitiveRestartIndexNV MANGLE(PrimitiveRestartIndexNV) +#define glPrimitiveRestartNV MANGLE(PrimitiveRestartNV) +#define glPrioritizeTexturesEXT MANGLE(PrioritizeTexturesEXT) +#define glPrioritizeTextures MANGLE(PrioritizeTextures) +#define glProgramEnvParameter4dARB MANGLE(ProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB MANGLE(ProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB MANGLE(ProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB MANGLE(ProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB MANGLE(ProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB MANGLE(ProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB MANGLE(ProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB MANGLE(ProgramLocalParameter4fvARB) +#define glProgramNamedParameter4dNV MANGLE(ProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV MANGLE(ProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV MANGLE(ProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV MANGLE(ProgramNamedParameter4fvNV) +#define glProgramParameter4dNV MANGLE(ProgramParameter4dNV) +#define glProgramParameter4dvNV MANGLE(ProgramParameter4dvNV) +#define glProgramParameter4fNV MANGLE(ProgramParameter4fNV) +#define glProgramParameter4fvNV MANGLE(ProgramParameter4fvNV) +#define glProgramParameters4dvNV MANGLE(ProgramParameters4dvNV) +#define glProgramParameters4fvNV MANGLE(ProgramParameters4fvNV) +#define glProgramStringARB MANGLE(ProgramStringARB) +#define glPushAttrib MANGLE(PushAttrib) +#define glPushClientAttrib MANGLE(PushClientAttrib) +#define glPushMatrix MANGLE(PushMatrix) +#define glPushName MANGLE(PushName) +#define glRasterPos2d MANGLE(RasterPos2d) +#define glRasterPos2dv MANGLE(RasterPos2dv) +#define glRasterPos2f MANGLE(RasterPos2f) +#define glRasterPos2fv MANGLE(RasterPos2fv) +#define glRasterPos2i MANGLE(RasterPos2i) +#define glRasterPos2iv MANGLE(RasterPos2iv) +#define glRasterPos2s MANGLE(RasterPos2s) +#define glRasterPos2sv MANGLE(RasterPos2sv) +#define glRasterPos3d MANGLE(RasterPos3d) +#define glRasterPos3dv MANGLE(RasterPos3dv) +#define glRasterPos3f MANGLE(RasterPos3f) +#define glRasterPos3fv MANGLE(RasterPos3fv) +#define glRasterPos3i MANGLE(RasterPos3i) +#define glRasterPos3iv MANGLE(RasterPos3iv) +#define glRasterPos3s MANGLE(RasterPos3s) +#define glRasterPos3sv MANGLE(RasterPos3sv) +#define glRasterPos4d MANGLE(RasterPos4d) +#define glRasterPos4dv MANGLE(RasterPos4dv) +#define glRasterPos4f MANGLE(RasterPos4f) +#define glRasterPos4fv MANGLE(RasterPos4fv) +#define glRasterPos4i MANGLE(RasterPos4i) +#define glRasterPos4iv MANGLE(RasterPos4iv) +#define glRasterPos4s MANGLE(RasterPos4s) +#define glRasterPos4sv MANGLE(RasterPos4sv) +#define glReadBuffer MANGLE(ReadBuffer) +#define glReadInstrumentsSGIX MANGLE(ReadInstrumentsSGIX) +#define glReadPixels MANGLE(ReadPixels) +#define glRectd MANGLE(Rectd) +#define glRectdv MANGLE(Rectdv) +#define glRectf MANGLE(Rectf) +#define glRectfv MANGLE(Rectfv) +#define glRecti MANGLE(Recti) +#define glRectiv MANGLE(Rectiv) +#define glRects MANGLE(Rects) +#define glRectsv MANGLE(Rectsv) +#define glReferencePlaneSGIX MANGLE(ReferencePlaneSGIX) +#define glRenderMode MANGLE(RenderMode) +#define glReplacementCodePointerSUN MANGLE(ReplacementCodePointerSUN) +#define glReplacementCodeubSUN MANGLE(ReplacementCodeubSUN) +#define glReplacementCodeubvSUN MANGLE(ReplacementCodeubvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN MANGLE(ReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN MANGLE(ReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN MANGLE(ReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN MANGLE(ReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN MANGLE(ReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN MANGLE(ReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiSUN MANGLE(ReplacementCodeuiSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN MANGLE(ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN MANGLE(ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN MANGLE(ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN MANGLE(ReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN MANGLE(ReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN MANGLE(ReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN MANGLE(ReplacementCodeuiVertex3fvSUN) +#define glReplacementCodeuivSUN MANGLE(ReplacementCodeuivSUN) +#define glReplacementCodeusSUN MANGLE(ReplacementCodeusSUN) +#define glReplacementCodeusvSUN MANGLE(ReplacementCodeusvSUN) +#define glRequestResidentProgramsNV MANGLE(RequestResidentProgramsNV) +#define glResetHistogramEXT MANGLE(ResetHistogramEXT) +#define glResetHistogram MANGLE(ResetHistogram) +#define glResetMinmaxEXT MANGLE(ResetMinmaxEXT) +#define glResetMinmax MANGLE(ResetMinmax) +#define glResizeBuffersMESA MANGLE(ResizeBuffersMESA) +#define glRotated MANGLE(Rotated) +#define glRotatef MANGLE(Rotatef) +#define glSampleCoverageARB MANGLE(SampleCoverageARB) +#define glSampleCoverage MANGLE(SampleCoverage) +#define glSampleMapATI MANGLE(SampleMapATI) +#define glSampleMaskEXT MANGLE(SampleMaskEXT) +#define glSampleMaskSGIS MANGLE(SampleMaskSGIS) +#define glSamplePatternEXT MANGLE(SamplePatternEXT) +#define glSamplePatternSGIS MANGLE(SamplePatternSGIS) +#define glScaled MANGLE(Scaled) +#define glScalef MANGLE(Scalef) +#define glScissor MANGLE(Scissor) +#define glSecondaryColor3bEXT MANGLE(SecondaryColor3bEXT) +#define glSecondaryColor3b MANGLE(SecondaryColor3b) +#define glSecondaryColor3bvEXT MANGLE(SecondaryColor3bvEXT) +#define glSecondaryColor3bv MANGLE(SecondaryColor3bv) +#define glSecondaryColor3dEXT MANGLE(SecondaryColor3dEXT) +#define glSecondaryColor3d MANGLE(SecondaryColor3d) +#define glSecondaryColor3dvEXT MANGLE(SecondaryColor3dvEXT) +#define glSecondaryColor3dv MANGLE(SecondaryColor3dv) +#define glSecondaryColor3fEXT MANGLE(SecondaryColor3fEXT) +#define glSecondaryColor3f MANGLE(SecondaryColor3f) +#define glSecondaryColor3fvEXT MANGLE(SecondaryColor3fvEXT) +#define glSecondaryColor3fv MANGLE(SecondaryColor3fv) +#define glSecondaryColor3hNV MANGLE(SecondaryColor3hNV) +#define glSecondaryColor3hvNV MANGLE(SecondaryColor3hvNV) +#define glSecondaryColor3iEXT MANGLE(SecondaryColor3iEXT) +#define glSecondaryColor3i MANGLE(SecondaryColor3i) +#define glSecondaryColor3ivEXT MANGLE(SecondaryColor3ivEXT) +#define glSecondaryColor3iv MANGLE(SecondaryColor3iv) +#define glSecondaryColor3sEXT MANGLE(SecondaryColor3sEXT) +#define glSecondaryColor3s MANGLE(SecondaryColor3s) +#define glSecondaryColor3svEXT MANGLE(SecondaryColor3svEXT) +#define glSecondaryColor3sv MANGLE(SecondaryColor3sv) +#define glSecondaryColor3ubEXT MANGLE(SecondaryColor3ubEXT) +#define glSecondaryColor3ub MANGLE(SecondaryColor3ub) +#define glSecondaryColor3ubvEXT MANGLE(SecondaryColor3ubvEXT) +#define glSecondaryColor3ubv MANGLE(SecondaryColor3ubv) +#define glSecondaryColor3uiEXT MANGLE(SecondaryColor3uiEXT) +#define glSecondaryColor3ui MANGLE(SecondaryColor3ui) +#define glSecondaryColor3uivEXT MANGLE(SecondaryColor3uivEXT) +#define glSecondaryColor3uiv MANGLE(SecondaryColor3uiv) +#define glSecondaryColor3usEXT MANGLE(SecondaryColor3usEXT) +#define glSecondaryColor3us MANGLE(SecondaryColor3us) +#define glSecondaryColor3usvEXT MANGLE(SecondaryColor3usvEXT) +#define glSecondaryColor3usv MANGLE(SecondaryColor3usv) +#define glSecondaryColorPointerEXT MANGLE(SecondaryColorPointerEXT) +#define glSecondaryColorPointerListIBM MANGLE(SecondaryColorPointerListIBM) +#define glSecondaryColorPointer MANGLE(SecondaryColorPointer) +#define glSelectBuffer MANGLE(SelectBuffer) +#define glSeparableFilter2DEXT MANGLE(SeparableFilter2DEXT) +#define glSeparableFilter2D MANGLE(SeparableFilter2D) +#define glSetFenceAPPLE MANGLE(SetFenceAPPLE) +#define glSetFenceNV MANGLE(SetFenceNV) +#define glSetFragmentShaderConstantATI MANGLE(SetFragmentShaderConstantATI) +#define glSetInvariantEXT MANGLE(SetInvariantEXT) +#define glSetLocalConstantEXT MANGLE(SetLocalConstantEXT) +#define glShadeModel MANGLE(ShadeModel) +#define glShaderOp1EXT MANGLE(ShaderOp1EXT) +#define glShaderOp2EXT MANGLE(ShaderOp2EXT) +#define glShaderOp3EXT MANGLE(ShaderOp3EXT) +#define glShaderSourceARB MANGLE(ShaderSourceARB) +#define glSharpenTexFuncSGIS MANGLE(SharpenTexFuncSGIS) +#define glSpriteParameterfSGIX MANGLE(SpriteParameterfSGIX) +#define glSpriteParameterfvSGIX MANGLE(SpriteParameterfvSGIX) +#define glSpriteParameteriSGIX MANGLE(SpriteParameteriSGIX) +#define glSpriteParameterivSGIX MANGLE(SpriteParameterivSGIX) +#define glStartInstrumentsSGIX MANGLE(StartInstrumentsSGIX) +#define glStencilFunc MANGLE(StencilFunc) +#define glStencilFuncSeparateATI MANGLE(StencilFuncSeparateATI) +#define glStencilMask MANGLE(StencilMask) +#define glStencilOp MANGLE(StencilOp) +#define glStencilOpSeparateATI MANGLE(StencilOpSeparateATI) +#define glStopInstrumentsSGIX MANGLE(StopInstrumentsSGIX) +#define glSwizzleEXT MANGLE(SwizzleEXT) +#define glTagSampleBufferSGIX MANGLE(TagSampleBufferSGIX) +#define glTangent3bEXT MANGLE(Tangent3bEXT) +#define glTangent3bvEXT MANGLE(Tangent3bvEXT) +#define glTangent3dEXT MANGLE(Tangent3dEXT) +#define glTangent3dvEXT MANGLE(Tangent3dvEXT) +#define glTangent3fEXT MANGLE(Tangent3fEXT) +#define glTangent3fvEXT MANGLE(Tangent3fvEXT) +#define glTangent3iEXT MANGLE(Tangent3iEXT) +#define glTangent3ivEXT MANGLE(Tangent3ivEXT) +#define glTangent3sEXT MANGLE(Tangent3sEXT) +#define glTangent3svEXT MANGLE(Tangent3svEXT) +#define glTangentPointerEXT MANGLE(TangentPointerEXT) +#define glTbufferMask3DFX MANGLE(TbufferMask3DFX) +#define glTestFenceAPPLE MANGLE(TestFenceAPPLE) +#define glTestFenceNV MANGLE(TestFenceNV) +#define glTestObjectAPPLE MANGLE(TestObjectAPPLE) +#define glTexBumpParameterfvATI MANGLE(TexBumpParameterfvATI) +#define glTexBumpParameterivATI MANGLE(TexBumpParameterivATI) +#define glTexCoord1d MANGLE(TexCoord1d) +#define glTexCoord1dv MANGLE(TexCoord1dv) +#define glTexCoord1f MANGLE(TexCoord1f) +#define glTexCoord1fv MANGLE(TexCoord1fv) +#define glTexCoord1hNV MANGLE(TexCoord1hNV) +#define glTexCoord1hvNV MANGLE(TexCoord1hvNV) +#define glTexCoord1i MANGLE(TexCoord1i) +#define glTexCoord1iv MANGLE(TexCoord1iv) +#define glTexCoord1s MANGLE(TexCoord1s) +#define glTexCoord1sv MANGLE(TexCoord1sv) +#define glTexCoord2d MANGLE(TexCoord2d) +#define glTexCoord2dv MANGLE(TexCoord2dv) +#define glTexCoord2fColor3fVertex3fSUN MANGLE(TexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN MANGLE(TexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN MANGLE(TexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN MANGLE(TexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN MANGLE(TexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN MANGLE(TexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2f MANGLE(TexCoord2f) +#define glTexCoord2fNormal3fVertex3fSUN MANGLE(TexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN MANGLE(TexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN MANGLE(TexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN MANGLE(TexCoord2fVertex3fvSUN) +#define glTexCoord2fv MANGLE(TexCoord2fv) +#define glTexCoord2hNV MANGLE(TexCoord2hNV) +#define glTexCoord2hvNV MANGLE(TexCoord2hvNV) +#define glTexCoord2i MANGLE(TexCoord2i) +#define glTexCoord2iv MANGLE(TexCoord2iv) +#define glTexCoord2s MANGLE(TexCoord2s) +#define glTexCoord2sv MANGLE(TexCoord2sv) +#define glTexCoord3d MANGLE(TexCoord3d) +#define glTexCoord3dv MANGLE(TexCoord3dv) +#define glTexCoord3f MANGLE(TexCoord3f) +#define glTexCoord3fv MANGLE(TexCoord3fv) +#define glTexCoord3hNV MANGLE(TexCoord3hNV) +#define glTexCoord3hvNV MANGLE(TexCoord3hvNV) +#define glTexCoord3i MANGLE(TexCoord3i) +#define glTexCoord3iv MANGLE(TexCoord3iv) +#define glTexCoord3s MANGLE(TexCoord3s) +#define glTexCoord3sv MANGLE(TexCoord3sv) +#define glTexCoord4d MANGLE(TexCoord4d) +#define glTexCoord4dv MANGLE(TexCoord4dv) +#define glTexCoord4fColor4fNormal3fVertex4fSUN MANGLE(TexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN MANGLE(TexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4f MANGLE(TexCoord4f) +#define glTexCoord4fVertex4fSUN MANGLE(TexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN MANGLE(TexCoord4fVertex4fvSUN) +#define glTexCoord4fv MANGLE(TexCoord4fv) +#define glTexCoord4hNV MANGLE(TexCoord4hNV) +#define glTexCoord4hvNV MANGLE(TexCoord4hvNV) +#define glTexCoord4i MANGLE(TexCoord4i) +#define glTexCoord4iv MANGLE(TexCoord4iv) +#define glTexCoord4s MANGLE(TexCoord4s) +#define glTexCoord4sv MANGLE(TexCoord4sv) +#define glTexCoordPointerEXT MANGLE(TexCoordPointerEXT) +#define glTexCoordPointerListIBM MANGLE(TexCoordPointerListIBM) +#define glTexCoordPointer MANGLE(TexCoordPointer) +#define glTexCoordPointervINTEL MANGLE(TexCoordPointervINTEL) +#define glTexEnvf MANGLE(TexEnvf) +#define glTexEnvfv MANGLE(TexEnvfv) +#define glTexEnvi MANGLE(TexEnvi) +#define glTexEnviv MANGLE(TexEnviv) +#define glTexFilterFuncSGIS MANGLE(TexFilterFuncSGIS) +#define glTexGend MANGLE(TexGend) +#define glTexGendv MANGLE(TexGendv) +#define glTexGenf MANGLE(TexGenf) +#define glTexGenfv MANGLE(TexGenfv) +#define glTexGeni MANGLE(TexGeni) +#define glTexGeniv MANGLE(TexGeniv) +#define glTexImage1D MANGLE(TexImage1D) +#define glTexImage2D MANGLE(TexImage2D) +#define glTexImage3DEXT MANGLE(TexImage3DEXT) +#define glTexImage3D MANGLE(TexImage3D) +#define glTexImage4DSGIS MANGLE(TexImage4DSGIS) +#define glTexParameterf MANGLE(TexParameterf) +#define glTexParameterfv MANGLE(TexParameterfv) +#define glTexParameteri MANGLE(TexParameteri) +#define glTexParameteriv MANGLE(TexParameteriv) +#define glTexSubImage1DEXT MANGLE(TexSubImage1DEXT) +#define glTexSubImage1D MANGLE(TexSubImage1D) +#define glTexSubImage2DEXT MANGLE(TexSubImage2DEXT) +#define glTexSubImage2D MANGLE(TexSubImage2D) +#define glTexSubImage3DEXT MANGLE(TexSubImage3DEXT) +#define glTexSubImage3D MANGLE(TexSubImage3D) +#define glTexSubImage4DSGIS MANGLE(TexSubImage4DSGIS) +#define glTextureColorMaskSGIS MANGLE(TextureColorMaskSGIS) +#define glTextureLightEXT MANGLE(TextureLightEXT) +#define glTextureMaterialEXT MANGLE(TextureMaterialEXT) +#define glTextureNormalEXT MANGLE(TextureNormalEXT) +#define glTraceAssertAttribMESA MANGLE(TraceAssertAttribMESA) +#define glTraceCommentMESA MANGLE(TraceCommentMESA) +#define glTraceListMESA MANGLE(TraceListMESA) +#define glTracePointerMESA MANGLE(TracePointerMESA) +#define glTracePointerRangeMESA MANGLE(TracePointerRangeMESA) +#define glTraceTextureMESA MANGLE(TraceTextureMESA) +#define glTrackMatrixNV MANGLE(TrackMatrixNV) +#define glTranslated MANGLE(Translated) +#define glTranslatef MANGLE(Translatef) +#define glUniform1fARB MANGLE(Uniform1fARB) +#define glUniform1fvARB MANGLE(Uniform1fvARB) +#define glUniform1iARB MANGLE(Uniform1iARB) +#define glUniform1ivARB MANGLE(Uniform1ivARB) +#define glUniform2fARB MANGLE(Uniform2fARB) +#define glUniform2fvARB MANGLE(Uniform2fvARB) +#define glUniform2iARB MANGLE(Uniform2iARB) +#define glUniform2ivARB MANGLE(Uniform2ivARB) +#define glUniform3fARB MANGLE(Uniform3fARB) +#define glUniform3fvARB MANGLE(Uniform3fvARB) +#define glUniform3iARB MANGLE(Uniform3iARB) +#define glUniform3ivARB MANGLE(Uniform3ivARB) +#define glUniform4fARB MANGLE(Uniform4fARB) +#define glUniform4fvARB MANGLE(Uniform4fvARB) +#define glUniform4iARB MANGLE(Uniform4iARB) +#define glUniform4ivARB MANGLE(Uniform4ivARB) +#define glUniformMatrix2fvARB MANGLE(UniformMatrix2fvARB) +#define glUniformMatrix3fvARB MANGLE(UniformMatrix3fvARB) +#define glUniformMatrix4fvARB MANGLE(UniformMatrix4fvARB) +#define glUnlockArraysEXT MANGLE(UnlockArraysEXT) +#define glUnmapBufferARB MANGLE(UnmapBufferARB) +#define glUnmapBuffer MANGLE(UnmapBuffer) +#define glUnmapObjectBufferATI MANGLE(UnmapObjectBufferATI) +#define glUpdateObjectBufferATI MANGLE(UpdateObjectBufferATI) +#define glUseProgramObjectARB MANGLE(UseProgramObjectARB) +#define glValidateProgramARB MANGLE(ValidateProgramARB) +#define glVariantArrayObjectATI MANGLE(VariantArrayObjectATI) +#define glVariantbvEXT MANGLE(VariantbvEXT) +#define glVariantdvEXT MANGLE(VariantdvEXT) +#define glVariantfvEXT MANGLE(VariantfvEXT) +#define glVariantivEXT MANGLE(VariantivEXT) +#define glVariantPointerEXT MANGLE(VariantPointerEXT) +#define glVariantsvEXT MANGLE(VariantsvEXT) +#define glVariantubvEXT MANGLE(VariantubvEXT) +#define glVariantuivEXT MANGLE(VariantuivEXT) +#define glVariantusvEXT MANGLE(VariantusvEXT) +#define glVertex2d MANGLE(Vertex2d) +#define glVertex2dv MANGLE(Vertex2dv) +#define glVertex2f MANGLE(Vertex2f) +#define glVertex2fv MANGLE(Vertex2fv) +#define glVertex2hNV MANGLE(Vertex2hNV) +#define glVertex2hvNV MANGLE(Vertex2hvNV) +#define glVertex2i MANGLE(Vertex2i) +#define glVertex2iv MANGLE(Vertex2iv) +#define glVertex2s MANGLE(Vertex2s) +#define glVertex2sv MANGLE(Vertex2sv) +#define glVertex3d MANGLE(Vertex3d) +#define glVertex3dv MANGLE(Vertex3dv) +#define glVertex3f MANGLE(Vertex3f) +#define glVertex3fv MANGLE(Vertex3fv) +#define glVertex3hNV MANGLE(Vertex3hNV) +#define glVertex3hvNV MANGLE(Vertex3hvNV) +#define glVertex3i MANGLE(Vertex3i) +#define glVertex3iv MANGLE(Vertex3iv) +#define glVertex3s MANGLE(Vertex3s) +#define glVertex3sv MANGLE(Vertex3sv) +#define glVertex4d MANGLE(Vertex4d) +#define glVertex4dv MANGLE(Vertex4dv) +#define glVertex4f MANGLE(Vertex4f) +#define glVertex4fv MANGLE(Vertex4fv) +#define glVertex4hNV MANGLE(Vertex4hNV) +#define glVertex4hvNV MANGLE(Vertex4hvNV) +#define glVertex4i MANGLE(Vertex4i) +#define glVertex4iv MANGLE(Vertex4iv) +#define glVertex4s MANGLE(Vertex4s) +#define glVertex4sv MANGLE(Vertex4sv) +#define glVertexArrayParameteriAPPLE MANGLE(VertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE MANGLE(VertexArrayRangeAPPLE) +#define glVertexArrayRangeNV MANGLE(VertexArrayRangeNV) +#define glVertexAttrib1dARB MANGLE(VertexAttrib1dARB) +#define glVertexAttrib1dNV MANGLE(VertexAttrib1dNV) +#define glVertexAttrib1dvARB MANGLE(VertexAttrib1dvARB) +#define glVertexAttrib1dvNV MANGLE(VertexAttrib1dvNV) +#define glVertexAttrib1fARB MANGLE(VertexAttrib1fARB) +#define glVertexAttrib1fNV MANGLE(VertexAttrib1fNV) +#define glVertexAttrib1fvARB MANGLE(VertexAttrib1fvARB) +#define glVertexAttrib1fvNV MANGLE(VertexAttrib1fvNV) +#define glVertexAttrib1hNV MANGLE(VertexAttrib1hNV) +#define glVertexAttrib1hvNV MANGLE(VertexAttrib1hvNV) +#define glVertexAttrib1sARB MANGLE(VertexAttrib1sARB) +#define glVertexAttrib1sNV MANGLE(VertexAttrib1sNV) +#define glVertexAttrib1svARB MANGLE(VertexAttrib1svARB) +#define glVertexAttrib1svNV MANGLE(VertexAttrib1svNV) +#define glVertexAttrib2dARB MANGLE(VertexAttrib2dARB) +#define glVertexAttrib2dNV MANGLE(VertexAttrib2dNV) +#define glVertexAttrib2dvARB MANGLE(VertexAttrib2dvARB) +#define glVertexAttrib2dvNV MANGLE(VertexAttrib2dvNV) +#define glVertexAttrib2fARB MANGLE(VertexAttrib2fARB) +#define glVertexAttrib2fNV MANGLE(VertexAttrib2fNV) +#define glVertexAttrib2fvARB MANGLE(VertexAttrib2fvARB) +#define glVertexAttrib2fvNV MANGLE(VertexAttrib2fvNV) +#define glVertexAttrib2hNV MANGLE(VertexAttrib2hNV) +#define glVertexAttrib2hvNV MANGLE(VertexAttrib2hvNV) +#define glVertexAttrib2sARB MANGLE(VertexAttrib2sARB) +#define glVertexAttrib2sNV MANGLE(VertexAttrib2sNV) +#define glVertexAttrib2svARB MANGLE(VertexAttrib2svARB) +#define glVertexAttrib2svNV MANGLE(VertexAttrib2svNV) +#define glVertexAttrib3dARB MANGLE(VertexAttrib3dARB) +#define glVertexAttrib3dNV MANGLE(VertexAttrib3dNV) +#define glVertexAttrib3dvARB MANGLE(VertexAttrib3dvARB) +#define glVertexAttrib3dvNV MANGLE(VertexAttrib3dvNV) +#define glVertexAttrib3fARB MANGLE(VertexAttrib3fARB) +#define glVertexAttrib3fNV MANGLE(VertexAttrib3fNV) +#define glVertexAttrib3fvARB MANGLE(VertexAttrib3fvARB) +#define glVertexAttrib3fvNV MANGLE(VertexAttrib3fvNV) +#define glVertexAttrib3hNV MANGLE(VertexAttrib3hNV) +#define glVertexAttrib3hvNV MANGLE(VertexAttrib3hvNV) +#define glVertexAttrib3sARB MANGLE(VertexAttrib3sARB) +#define glVertexAttrib3sNV MANGLE(VertexAttrib3sNV) +#define glVertexAttrib3svARB MANGLE(VertexAttrib3svARB) +#define glVertexAttrib3svNV MANGLE(VertexAttrib3svNV) +#define glVertexAttrib4bvARB MANGLE(VertexAttrib4bvARB) +#define glVertexAttrib4dARB MANGLE(VertexAttrib4dARB) +#define glVertexAttrib4dNV MANGLE(VertexAttrib4dNV) +#define glVertexAttrib4dvARB MANGLE(VertexAttrib4dvARB) +#define glVertexAttrib4dvNV MANGLE(VertexAttrib4dvNV) +#define glVertexAttrib4fARB MANGLE(VertexAttrib4fARB) +#define glVertexAttrib4fNV MANGLE(VertexAttrib4fNV) +#define glVertexAttrib4fvARB MANGLE(VertexAttrib4fvARB) +#define glVertexAttrib4fvNV MANGLE(VertexAttrib4fvNV) +#define glVertexAttrib4hNV MANGLE(VertexAttrib4hNV) +#define glVertexAttrib4hvNV MANGLE(VertexAttrib4hvNV) +#define glVertexAttrib4ivARB MANGLE(VertexAttrib4ivARB) +#define glVertexAttrib4NbvARB MANGLE(VertexAttrib4NbvARB) +#define glVertexAttrib4NivARB MANGLE(VertexAttrib4NivARB) +#define glVertexAttrib4NsvARB MANGLE(VertexAttrib4NsvARB) +#define glVertexAttrib4NubARB MANGLE(VertexAttrib4NubARB) +#define glVertexAttrib4NubvARB MANGLE(VertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB MANGLE(VertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB MANGLE(VertexAttrib4NusvARB) +#define glVertexAttrib4sARB MANGLE(VertexAttrib4sARB) +#define glVertexAttrib4sNV MANGLE(VertexAttrib4sNV) +#define glVertexAttrib4svARB MANGLE(VertexAttrib4svARB) +#define glVertexAttrib4svNV MANGLE(VertexAttrib4svNV) +#define glVertexAttrib4ubNV MANGLE(VertexAttrib4ubNV) +#define glVertexAttrib4ubvARB MANGLE(VertexAttrib4ubvARB) +#define glVertexAttrib4ubvNV MANGLE(VertexAttrib4ubvNV) +#define glVertexAttrib4uivARB MANGLE(VertexAttrib4uivARB) +#define glVertexAttrib4usvARB MANGLE(VertexAttrib4usvARB) +#define glVertexAttribArrayObjectATI MANGLE(VertexAttribArrayObjectATI) +#define glVertexAttribPointerARB MANGLE(VertexAttribPointerARB) +#define glVertexAttribPointerNV MANGLE(VertexAttribPointerNV) +#define glVertexAttribs1dvNV MANGLE(VertexAttribs1dvNV) +#define glVertexAttribs1fvNV MANGLE(VertexAttribs1fvNV) +#define glVertexAttribs1hvNV MANGLE(VertexAttribs1hvNV) +#define glVertexAttribs1svNV MANGLE(VertexAttribs1svNV) +#define glVertexAttribs2dvNV MANGLE(VertexAttribs2dvNV) +#define glVertexAttribs2fvNV MANGLE(VertexAttribs2fvNV) +#define glVertexAttribs2hvNV MANGLE(VertexAttribs2hvNV) +#define glVertexAttribs2svNV MANGLE(VertexAttribs2svNV) +#define glVertexAttribs3dvNV MANGLE(VertexAttribs3dvNV) +#define glVertexAttribs3fvNV MANGLE(VertexAttribs3fvNV) +#define glVertexAttribs3hvNV MANGLE(VertexAttribs3hvNV) +#define glVertexAttribs3svNV MANGLE(VertexAttribs3svNV) +#define glVertexAttribs4dvNV MANGLE(VertexAttribs4dvNV) +#define glVertexAttribs4fvNV MANGLE(VertexAttribs4fvNV) +#define glVertexAttribs4hvNV MANGLE(VertexAttribs4hvNV) +#define glVertexAttribs4svNV MANGLE(VertexAttribs4svNV) +#define glVertexAttribs4ubvNV MANGLE(VertexAttribs4ubvNV) +#define glVertexBlendARB MANGLE(VertexBlendARB) +#define glVertexBlendEnvfATI MANGLE(VertexBlendEnvfATI) +#define glVertexBlendEnviATI MANGLE(VertexBlendEnviATI) +#define glVertexPointerEXT MANGLE(VertexPointerEXT) +#define glVertexPointerListIBM MANGLE(VertexPointerListIBM) +#define glVertexPointer MANGLE(VertexPointer) +#define glVertexPointervINTEL MANGLE(VertexPointervINTEL) +#define glVertexStream1dATI MANGLE(VertexStream1dATI) +#define glVertexStream1dvATI MANGLE(VertexStream1dvATI) +#define glVertexStream1fATI MANGLE(VertexStream1fATI) +#define glVertexStream1fvATI MANGLE(VertexStream1fvATI) +#define glVertexStream1iATI MANGLE(VertexStream1iATI) +#define glVertexStream1ivATI MANGLE(VertexStream1ivATI) +#define glVertexStream1sATI MANGLE(VertexStream1sATI) +#define glVertexStream1svATI MANGLE(VertexStream1svATI) +#define glVertexStream2dATI MANGLE(VertexStream2dATI) +#define glVertexStream2dvATI MANGLE(VertexStream2dvATI) +#define glVertexStream2fATI MANGLE(VertexStream2fATI) +#define glVertexStream2fvATI MANGLE(VertexStream2fvATI) +#define glVertexStream2iATI MANGLE(VertexStream2iATI) +#define glVertexStream2ivATI MANGLE(VertexStream2ivATI) +#define glVertexStream2sATI MANGLE(VertexStream2sATI) +#define glVertexStream2svATI MANGLE(VertexStream2svATI) +#define glVertexStream3dATI MANGLE(VertexStream3dATI) +#define glVertexStream3dvATI MANGLE(VertexStream3dvATI) +#define glVertexStream3fATI MANGLE(VertexStream3fATI) +#define glVertexStream3fvATI MANGLE(VertexStream3fvATI) +#define glVertexStream3iATI MANGLE(VertexStream3iATI) +#define glVertexStream3ivATI MANGLE(VertexStream3ivATI) +#define glVertexStream3sATI MANGLE(VertexStream3sATI) +#define glVertexStream3svATI MANGLE(VertexStream3svATI) +#define glVertexStream4dATI MANGLE(VertexStream4dATI) +#define glVertexStream4dvATI MANGLE(VertexStream4dvATI) +#define glVertexStream4fATI MANGLE(VertexStream4fATI) +#define glVertexStream4fvATI MANGLE(VertexStream4fvATI) +#define glVertexStream4iATI MANGLE(VertexStream4iATI) +#define glVertexStream4ivATI MANGLE(VertexStream4ivATI) +#define glVertexStream4sATI MANGLE(VertexStream4sATI) +#define glVertexStream4svATI MANGLE(VertexStream4svATI) +#define glVertexWeightfEXT MANGLE(VertexWeightfEXT) +#define glVertexWeightfvEXT MANGLE(VertexWeightfvEXT) +#define glVertexWeighthNV MANGLE(VertexWeighthNV) +#define glVertexWeighthvNV MANGLE(VertexWeighthvNV) +#define glVertexWeightPointerEXT MANGLE(VertexWeightPointerEXT) +#define glViewport MANGLE(Viewport) +#define glWeightbvARB MANGLE(WeightbvARB) +#define glWeightdvARB MANGLE(WeightdvARB) +#define glWeightfvARB MANGLE(WeightfvARB) +#define glWeightivARB MANGLE(WeightivARB) +#define glWeightPointerARB MANGLE(WeightPointerARB) +#define glWeightsvARB MANGLE(WeightsvARB) +#define glWeightubvARB MANGLE(WeightubvARB) +#define glWeightuivARB MANGLE(WeightuivARB) +#define glWeightusvARB MANGLE(WeightusvARB) +#define glWindowPos2dARB MANGLE(WindowPos2dARB) +#define glWindowPos2d MANGLE(WindowPos2d) +#define glWindowPos2dMESA MANGLE(WindowPos2dMESA) +#define glWindowPos2dvARB MANGLE(WindowPos2dvARB) +#define glWindowPos2dv MANGLE(WindowPos2dv) +#define glWindowPos2dvMESA MANGLE(WindowPos2dvMESA) +#define glWindowPos2fARB MANGLE(WindowPos2fARB) +#define glWindowPos2f MANGLE(WindowPos2f) +#define glWindowPos2fMESA MANGLE(WindowPos2fMESA) +#define glWindowPos2fvARB MANGLE(WindowPos2fvARB) +#define glWindowPos2fv MANGLE(WindowPos2fv) +#define glWindowPos2fvMESA MANGLE(WindowPos2fvMESA) +#define glWindowPos2iARB MANGLE(WindowPos2iARB) +#define glWindowPos2i MANGLE(WindowPos2i) +#define glWindowPos2iMESA MANGLE(WindowPos2iMESA) +#define glWindowPos2ivARB MANGLE(WindowPos2ivARB) +#define glWindowPos2iv MANGLE(WindowPos2iv) +#define glWindowPos2ivMESA MANGLE(WindowPos2ivMESA) +#define glWindowPos2sARB MANGLE(WindowPos2sARB) +#define glWindowPos2s MANGLE(WindowPos2s) +#define glWindowPos2sMESA MANGLE(WindowPos2sMESA) +#define glWindowPos2svARB MANGLE(WindowPos2svARB) +#define glWindowPos2sv MANGLE(WindowPos2sv) +#define glWindowPos2svMESA MANGLE(WindowPos2svMESA) +#define glWindowPos3dARB MANGLE(WindowPos3dARB) +#define glWindowPos3d MANGLE(WindowPos3d) +#define glWindowPos3dMESA MANGLE(WindowPos3dMESA) +#define glWindowPos3dvARB MANGLE(WindowPos3dvARB) +#define glWindowPos3dv MANGLE(WindowPos3dv) +#define glWindowPos3dvMESA MANGLE(WindowPos3dvMESA) +#define glWindowPos3fARB MANGLE(WindowPos3fARB) +#define glWindowPos3f MANGLE(WindowPos3f) +#define glWindowPos3fMESA MANGLE(WindowPos3fMESA) +#define glWindowPos3fvARB MANGLE(WindowPos3fvARB) +#define glWindowPos3fv MANGLE(WindowPos3fv) +#define glWindowPos3fvMESA MANGLE(WindowPos3fvMESA) +#define glWindowPos3iARB MANGLE(WindowPos3iARB) +#define glWindowPos3i MANGLE(WindowPos3i) +#define glWindowPos3iMESA MANGLE(WindowPos3iMESA) +#define glWindowPos3ivARB MANGLE(WindowPos3ivARB) +#define glWindowPos3iv MANGLE(WindowPos3iv) +#define glWindowPos3ivMESA MANGLE(WindowPos3ivMESA) +#define glWindowPos3sARB MANGLE(WindowPos3sARB) +#define glWindowPos3s MANGLE(WindowPos3s) +#define glWindowPos3sMESA MANGLE(WindowPos3sMESA) +#define glWindowPos3svARB MANGLE(WindowPos3svARB) +#define glWindowPos3sv MANGLE(WindowPos3sv) +#define glWindowPos3svMESA MANGLE(WindowPos3svMESA) +#define glWindowPos4dMESA MANGLE(WindowPos4dMESA) +#define glWindowPos4dvMESA MANGLE(WindowPos4dvMESA) +#define glWindowPos4fMESA MANGLE(WindowPos4fMESA) +#define glWindowPos4fvMESA MANGLE(WindowPos4fvMESA) +#define glWindowPos4iMESA MANGLE(WindowPos4iMESA) +#define glWindowPos4ivMESA MANGLE(WindowPos4ivMESA) +#define glWindowPos4sMESA MANGLE(WindowPos4sMESA) +#define glWindowPos4svMESA MANGLE(WindowPos4svMESA) +#define glWriteMaskEXT MANGLE(WriteMaskEXT) + +#endif /* GL_MANGLE_H */ diff --git a/reactos/lib/mesa32/include/GL/glext.h b/reactos/lib/mesa32/include/GL/glext.h new file mode 100644 index 00000000000..4260acdacdb --- /dev/null +++ b/reactos/lib/mesa32/include/GL/glext.h @@ -0,0 +1,5919 @@ +#ifndef __glext_h_ +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2004/2/23 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 22 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SOURCE GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#endif + +#ifndef GL_ARB_shading_language_100 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and characters */ +typedef char GLcharARB; /* native character */ +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif + +#ifndef GL_NV_half_float +/* GL type for representing NVIDIA "half" floating point type in host memory */ +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendEquation (GLenum); +GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogram (GLenum); +GLAPI void APIENTRY glResetMinmax (GLenum); +GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum); +GLAPI void APIENTRY glClientActiveTexture (GLenum); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glFogCoordf (GLfloat); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *); +GLAPI void APIENTRY glFogCoordd (GLdouble); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameteri (GLenum, GLint); +GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos2i (GLint, GLint); +GLAPI void APIENTRY glWindowPos2iv (const GLint *); +GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *); +GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3iv (const GLint *); +GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQuery (GLuint); +GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void APIENTRY glEndQuery (GLenum); +GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint); +GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); +GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); +GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void APIENTRY glEndQueryARB (GLenum); +GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1iARB (GLint, GLint); +GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogramEXT (GLenum); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint); +GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void APIENTRY glDeformSGIX (GLbitfield); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum); +GLAPI void APIENTRY glTextureLightEXT (GLenum); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *); +GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); +GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFinishFenceNV (GLuint); +GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); +GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/lib/mesa32/include/GL/glu.h b/reactos/lib/mesa32/include/GL/glu.h new file mode 100644 index 00000000000..c0bac75a8cc --- /dev/null +++ b/reactos/lib/mesa32/include/GL/glu.h @@ -0,0 +1,340 @@ +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#ifndef __glu_h__ +#define __glu_h__ + +#if defined(USE_MGL_NAMESPACE) +#include "glu_mangle.h" +#endif + +#include + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef GLAPIENTRYP +#define GLAPIENTRYP GLAPIENTRY * +#endif + +#ifndef GLAPI +#define GLAPI +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*************************************************************/ + +/* Extensions */ +#define GLU_EXT_object_space_tess 1 +#define GLU_EXT_nurbs_tessellator 1 + +/* Boolean */ +#define GLU_FALSE 0 +#define GLU_TRUE 1 + +/* Version */ +#define GLU_VERSION_1_1 1 +#define GLU_VERSION_1_2 1 +#define GLU_VERSION_1_3 1 + +/* StringName */ +#define GLU_VERSION 100800 +#define GLU_EXTENSIONS 100801 + +/* ErrorCode */ +#define GLU_INVALID_ENUM 100900 +#define GLU_INVALID_VALUE 100901 +#define GLU_OUT_OF_MEMORY 100902 +#define GLU_INCOMPATIBLE_GL_VERSION 100903 +#define GLU_INVALID_OPERATION 100904 + +/* NurbsDisplay */ +/* GLU_FILL */ +#define GLU_OUTLINE_POLYGON 100240 +#define GLU_OUTLINE_PATCH 100241 + +/* NurbsCallback */ +#define GLU_NURBS_ERROR 100103 +#define GLU_ERROR 100103 +#define GLU_NURBS_BEGIN 100164 +#define GLU_NURBS_BEGIN_EXT 100164 +#define GLU_NURBS_VERTEX 100165 +#define GLU_NURBS_VERTEX_EXT 100165 +#define GLU_NURBS_NORMAL 100166 +#define GLU_NURBS_NORMAL_EXT 100166 +#define GLU_NURBS_COLOR 100167 +#define GLU_NURBS_COLOR_EXT 100167 +#define GLU_NURBS_TEXTURE_COORD 100168 +#define GLU_NURBS_TEX_COORD_EXT 100168 +#define GLU_NURBS_END 100169 +#define GLU_NURBS_END_EXT 100169 +#define GLU_NURBS_BEGIN_DATA 100170 +#define GLU_NURBS_BEGIN_DATA_EXT 100170 +#define GLU_NURBS_VERTEX_DATA 100171 +#define GLU_NURBS_VERTEX_DATA_EXT 100171 +#define GLU_NURBS_NORMAL_DATA 100172 +#define GLU_NURBS_NORMAL_DATA_EXT 100172 +#define GLU_NURBS_COLOR_DATA 100173 +#define GLU_NURBS_COLOR_DATA_EXT 100173 +#define GLU_NURBS_TEXTURE_COORD_DATA 100174 +#define GLU_NURBS_TEX_COORD_DATA_EXT 100174 +#define GLU_NURBS_END_DATA 100175 +#define GLU_NURBS_END_DATA_EXT 100175 + +/* NurbsError */ +#define GLU_NURBS_ERROR1 100251 +#define GLU_NURBS_ERROR2 100252 +#define GLU_NURBS_ERROR3 100253 +#define GLU_NURBS_ERROR4 100254 +#define GLU_NURBS_ERROR5 100255 +#define GLU_NURBS_ERROR6 100256 +#define GLU_NURBS_ERROR7 100257 +#define GLU_NURBS_ERROR8 100258 +#define GLU_NURBS_ERROR9 100259 +#define GLU_NURBS_ERROR10 100260 +#define GLU_NURBS_ERROR11 100261 +#define GLU_NURBS_ERROR12 100262 +#define GLU_NURBS_ERROR13 100263 +#define GLU_NURBS_ERROR14 100264 +#define GLU_NURBS_ERROR15 100265 +#define GLU_NURBS_ERROR16 100266 +#define GLU_NURBS_ERROR17 100267 +#define GLU_NURBS_ERROR18 100268 +#define GLU_NURBS_ERROR19 100269 +#define GLU_NURBS_ERROR20 100270 +#define GLU_NURBS_ERROR21 100271 +#define GLU_NURBS_ERROR22 100272 +#define GLU_NURBS_ERROR23 100273 +#define GLU_NURBS_ERROR24 100274 +#define GLU_NURBS_ERROR25 100275 +#define GLU_NURBS_ERROR26 100276 +#define GLU_NURBS_ERROR27 100277 +#define GLU_NURBS_ERROR28 100278 +#define GLU_NURBS_ERROR29 100279 +#define GLU_NURBS_ERROR30 100280 +#define GLU_NURBS_ERROR31 100281 +#define GLU_NURBS_ERROR32 100282 +#define GLU_NURBS_ERROR33 100283 +#define GLU_NURBS_ERROR34 100284 +#define GLU_NURBS_ERROR35 100285 +#define GLU_NURBS_ERROR36 100286 +#define GLU_NURBS_ERROR37 100287 + +/* NurbsProperty */ +#define GLU_AUTO_LOAD_MATRIX 100200 +#define GLU_CULLING 100201 +#define GLU_SAMPLING_TOLERANCE 100203 +#define GLU_DISPLAY_MODE 100204 +#define GLU_PARAMETRIC_TOLERANCE 100202 +#define GLU_SAMPLING_METHOD 100205 +#define GLU_U_STEP 100206 +#define GLU_V_STEP 100207 +#define GLU_NURBS_MODE 100160 +#define GLU_NURBS_MODE_EXT 100160 +#define GLU_NURBS_TESSELLATOR 100161 +#define GLU_NURBS_TESSELLATOR_EXT 100161 +#define GLU_NURBS_RENDERER 100162 +#define GLU_NURBS_RENDERER_EXT 100162 + +/* NurbsSampling */ +#define GLU_OBJECT_PARAMETRIC_ERROR 100208 +#define GLU_OBJECT_PARAMETRIC_ERROR_EXT 100208 +#define GLU_OBJECT_PATH_LENGTH 100209 +#define GLU_OBJECT_PATH_LENGTH_EXT 100209 +#define GLU_PATH_LENGTH 100215 +#define GLU_PARAMETRIC_ERROR 100216 +#define GLU_DOMAIN_DISTANCE 100217 + +/* NurbsTrim */ +#define GLU_MAP1_TRIM_2 100210 +#define GLU_MAP1_TRIM_3 100211 + +/* QuadricDrawStyle */ +#define GLU_POINT 100010 +#define GLU_LINE 100011 +#define GLU_FILL 100012 +#define GLU_SILHOUETTE 100013 + +/* QuadricCallback */ +/* GLU_ERROR */ + +/* QuadricNormal */ +#define GLU_SMOOTH 100000 +#define GLU_FLAT 100001 +#define GLU_NONE 100002 + +/* QuadricOrientation */ +#define GLU_OUTSIDE 100020 +#define GLU_INSIDE 100021 + +/* TessCallback */ +#define GLU_TESS_BEGIN 100100 +#define GLU_BEGIN 100100 +#define GLU_TESS_VERTEX 100101 +#define GLU_VERTEX 100101 +#define GLU_TESS_END 100102 +#define GLU_END 100102 +#define GLU_TESS_ERROR 100103 +#define GLU_TESS_EDGE_FLAG 100104 +#define GLU_EDGE_FLAG 100104 +#define GLU_TESS_COMBINE 100105 +#define GLU_TESS_BEGIN_DATA 100106 +#define GLU_TESS_VERTEX_DATA 100107 +#define GLU_TESS_END_DATA 100108 +#define GLU_TESS_ERROR_DATA 100109 +#define GLU_TESS_EDGE_FLAG_DATA 100110 +#define GLU_TESS_COMBINE_DATA 100111 + +/* TessContour */ +#define GLU_CW 100120 +#define GLU_CCW 100121 +#define GLU_INTERIOR 100122 +#define GLU_EXTERIOR 100123 +#define GLU_UNKNOWN 100124 + +/* TessProperty */ +#define GLU_TESS_WINDING_RULE 100140 +#define GLU_TESS_BOUNDARY_ONLY 100141 +#define GLU_TESS_TOLERANCE 100142 + +/* TessError */ +#define GLU_TESS_ERROR1 100151 +#define GLU_TESS_ERROR2 100152 +#define GLU_TESS_ERROR3 100153 +#define GLU_TESS_ERROR4 100154 +#define GLU_TESS_ERROR5 100155 +#define GLU_TESS_ERROR6 100156 +#define GLU_TESS_ERROR7 100157 +#define GLU_TESS_ERROR8 100158 +#define GLU_TESS_MISSING_BEGIN_POLYGON 100151 +#define GLU_TESS_MISSING_BEGIN_CONTOUR 100152 +#define GLU_TESS_MISSING_END_POLYGON 100153 +#define GLU_TESS_MISSING_END_CONTOUR 100154 +#define GLU_TESS_COORD_TOO_LARGE 100155 +#define GLU_TESS_NEED_COMBINE_CALLBACK 100156 + +/* TessWinding */ +#define GLU_TESS_WINDING_ODD 100130 +#define GLU_TESS_WINDING_NONZERO 100131 +#define GLU_TESS_WINDING_POSITIVE 100132 +#define GLU_TESS_WINDING_NEGATIVE 100133 +#define GLU_TESS_WINDING_ABS_GEQ_TWO 100134 + +/*************************************************************/ + + +#ifdef __cplusplus +class GLUnurbs; +class GLUquadric; +class GLUtesselator; +#else +typedef struct GLUnurbs GLUnurbs; +typedef struct GLUquadric GLUquadric; +typedef struct GLUtesselator GLUtesselator; +#endif + +typedef GLUnurbs GLUnurbsObj; +typedef GLUquadric GLUquadricObj; +typedef GLUtesselator GLUtesselatorObj; +typedef GLUtesselator GLUtriangulatorObj; + +#define GLU_TESS_MAX_COORD 1.0e150 + +/* Internal convenience typedefs */ +typedef void (GLAPIENTRYP _GLUfuncptr)(); + +GLAPI void GLAPIENTRY gluBeginCurve (GLUnurbs* nurb); +GLAPI void GLAPIENTRY gluBeginPolygon (GLUtesselator* tess); +GLAPI void GLAPIENTRY gluBeginSurface (GLUnurbs* nurb); +GLAPI void GLAPIENTRY gluBeginTrim (GLUnurbs* nurb); +GLAPI GLint GLAPIENTRY gluBuild1DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data); +GLAPI GLint GLAPIENTRY gluBuild1DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); +GLAPI GLint GLAPIENTRY gluBuild2DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data); +GLAPI GLint GLAPIENTRY gluBuild2DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data); +GLAPI GLint GLAPIENTRY gluBuild3DMipmapLevels (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void *data); +GLAPI GLint GLAPIENTRY gluBuild3DMipmaps (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI GLboolean GLAPIENTRY gluCheckExtension (const GLubyte *extName, const GLubyte *extString); +GLAPI void GLAPIENTRY gluCylinder (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks); +GLAPI void GLAPIENTRY gluDeleteNurbsRenderer (GLUnurbs* nurb); +GLAPI void GLAPIENTRY gluDeleteQuadric (GLUquadric* quad); +GLAPI void GLAPIENTRY gluDeleteTess (GLUtesselator* tess); +GLAPI void GLAPIENTRY gluDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops); +GLAPI void GLAPIENTRY gluEndCurve (GLUnurbs* nurb); +GLAPI void GLAPIENTRY gluEndPolygon (GLUtesselator* tess); +GLAPI void GLAPIENTRY gluEndSurface (GLUnurbs* nurb); +GLAPI void GLAPIENTRY gluEndTrim (GLUnurbs* nurb); +GLAPI const GLubyte * GLAPIENTRY gluErrorString (GLenum error); +GLAPI void GLAPIENTRY gluGetNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat* data); +GLAPI const GLubyte * GLAPIENTRY gluGetString (GLenum name); +GLAPI void GLAPIENTRY gluGetTessProperty (GLUtesselator* tess, GLenum which, GLdouble* data); +GLAPI void GLAPIENTRY gluLoadSamplingMatrices (GLUnurbs* nurb, const GLfloat *model, const GLfloat *perspective, const GLint *view); +GLAPI void GLAPIENTRY gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ); +GLAPI GLUnurbs* GLAPIENTRY gluNewNurbsRenderer (void); +GLAPI GLUquadric* GLAPIENTRY gluNewQuadric (void); +GLAPI GLUtesselator* GLAPIENTRY gluNewTess (void); +GLAPI void GLAPIENTRY gluNextContour (GLUtesselator* tess, GLenum type); +GLAPI void GLAPIENTRY gluNurbsCallback (GLUnurbs* nurb, GLenum which, _GLUfuncptr CallBackFunc); +GLAPI void GLAPIENTRY gluNurbsCallbackData (GLUnurbs* nurb, GLvoid* userData); +GLAPI void GLAPIENTRY gluNurbsCallbackDataEXT (GLUnurbs* nurb, GLvoid* userData); +GLAPI void GLAPIENTRY gluNurbsCurve (GLUnurbs* nurb, GLint knotCount, GLfloat *knots, GLint stride, GLfloat *control, GLint order, GLenum type); +GLAPI void GLAPIENTRY gluNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat value); +GLAPI void GLAPIENTRY gluNurbsSurface (GLUnurbs* nurb, GLint sKnotCount, GLfloat* sKnots, GLint tKnotCount, GLfloat* tKnots, GLint sStride, GLint tStride, GLfloat* control, GLint sOrder, GLint tOrder, GLenum type); +GLAPI void GLAPIENTRY gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); +GLAPI void GLAPIENTRY gluPartialDisk (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep); +GLAPI void GLAPIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY gluPickMatrix (GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport); +GLAPI GLint GLAPIENTRY gluProject (GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* winX, GLdouble* winY, GLdouble* winZ); +GLAPI void GLAPIENTRY gluPwlCurve (GLUnurbs* nurb, GLint count, GLfloat* data, GLint stride, GLenum type); +GLAPI void GLAPIENTRY gluQuadricCallback (GLUquadric* quad, GLenum which, _GLUfuncptr CallBackFunc); +GLAPI void GLAPIENTRY gluQuadricDrawStyle (GLUquadric* quad, GLenum draw); +GLAPI void GLAPIENTRY gluQuadricNormals (GLUquadric* quad, GLenum normal); +GLAPI void GLAPIENTRY gluQuadricOrientation (GLUquadric* quad, GLenum orientation); +GLAPI void GLAPIENTRY gluQuadricTexture (GLUquadric* quad, GLboolean texture); +GLAPI GLint GLAPIENTRY gluScaleImage (GLenum format, GLsizei wIn, GLsizei hIn, GLenum typeIn, const void *dataIn, GLsizei wOut, GLsizei hOut, GLenum typeOut, GLvoid* dataOut); +GLAPI void GLAPIENTRY gluSphere (GLUquadric* quad, GLdouble radius, GLint slices, GLint stacks); +GLAPI void GLAPIENTRY gluTessBeginContour (GLUtesselator* tess); +GLAPI void GLAPIENTRY gluTessBeginPolygon (GLUtesselator* tess, GLvoid* data); +GLAPI void GLAPIENTRY gluTessCallback (GLUtesselator* tess, GLenum which, _GLUfuncptr CallBackFunc); +GLAPI void GLAPIENTRY gluTessEndContour (GLUtesselator* tess); +GLAPI void GLAPIENTRY gluTessEndPolygon (GLUtesselator* tess); +GLAPI void GLAPIENTRY gluTessNormal (GLUtesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ); +GLAPI void GLAPIENTRY gluTessProperty (GLUtesselator* tess, GLenum which, GLdouble data); +GLAPI void GLAPIENTRY gluTessVertex (GLUtesselator* tess, GLdouble *location, GLvoid* data); +GLAPI GLint GLAPIENTRY gluUnProject (GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* objX, GLdouble* objY, GLdouble* objZ); +GLAPI GLint GLAPIENTRY gluUnProject4 (GLdouble winX, GLdouble winY, GLdouble winZ, GLdouble clipW, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble nearVal, GLdouble farVal, GLdouble* objX, GLdouble* objY, GLdouble* objZ, GLdouble* objW); + +#ifdef __cplusplus +} +#endif + +#endif /* __glu_h__ */ diff --git a/reactos/lib/mesa32/include/GL/glu_mangle.h b/reactos/lib/mesa32/include/GL/glu_mangle.h new file mode 100644 index 00000000000..9c25aa864c1 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/glu_mangle.h @@ -0,0 +1,86 @@ +/* + * Mesa 3-D graphics library + * Version: 3.0 + * Copyright (C) 1995-1998 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#ifndef GLU_MANGLE_H +#define GLU_MANGLE_H + + +#define gluLookAt mgluLookAt +#define gluOrtho2D mgluOrtho2D +#define gluPerspective mgluPerspective +#define gluPickMatrix mgluPickMatrix +#define gluProject mgluProject +#define gluUnProject mgluUnProject +#define gluErrorString mgluErrorString +#define gluScaleImage mgluScaleImage +#define gluBuild1DMipmaps mgluBuild1DMipmaps +#define gluBuild2DMipmaps mgluBuild2DMipmaps +#define gluNewQuadric mgluNewQuadric +#define gluDeleteQuadric mgluDeleteQuadric +#define gluQuadricDrawStyle mgluQuadricDrawStyle +#define gluQuadricOrientation mgluQuadricOrientation +#define gluQuadricNormals mgluQuadricNormals +#define gluQuadricTexture mgluQuadricTexture +#define gluQuadricCallback mgluQuadricCallback +#define gluCylinder mgluCylinder +#define gluSphere mgluSphere +#define gluDisk mgluDisk +#define gluPartialDisk mgluPartialDisk +#define gluNewNurbsRenderer mgluNewNurbsRenderer +#define gluDeleteNurbsRenderer mgluDeleteNurbsRenderer +#define gluLoadSamplingMatrices mgluLoadSamplingMatrices +#define gluNurbsProperty mgluNurbsProperty +#define gluGetNurbsProperty mgluGetNurbsProperty +#define gluBeginCurve mgluBeginCurve +#define gluEndCurve mgluEndCurve +#define gluNurbsCurve mgluNurbsCurve +#define gluBeginSurface mgluBeginSurface +#define gluEndSurface mgluEndSurface +#define gluNurbsSurface mgluNurbsSurface +#define gluBeginTrim mgluBeginTrim +#define gluEndTrim mgluEndTrim +#define gluPwlCurve mgluPwlCurve +#define gluNurbsCallback mgluNurbsCallback +#define gluNewTess mgluNewTess +#define gluDeleteTess mgluDeleteTess +#define gluTessBeginPolygon mgluTessBeginPolygon +#define gluTessBeginContour mgluTessBeginContour +#define gluTessVertex mgluTessVertex +#define gluTessEndPolygon mgluTessEndPolygon +#define gluTessEndContour mgluTessEndContour +#define gluTessProperty mgluTessProperty +#define gluTessNormal mgluTessNormal +#define gluTessCallback mgluTessCallback +#define gluGetTessProperty mgluGetTessProperty +#define gluBeginPolygon mgluBeginPolygon +#define gluNextContour mgluNextContour +#define gluEndPolygon mgluEndPolygon +#define gluGetString mgluGetString +#define gluBuild1DMipmapLevels mgluBuild1DMipmapLevels +#define gluBuild2DMipmapLevels mgluBuild2DMipmapLevels +#define gluBuild3DMipmapLevels mgluBuild3DMipmapLevels +#define gluBuild3DMipmaps mgluBuild3DMipmaps +#define gluCheckExtension mgluCheckExtension +#define gluUnProject4 mgluUnProject4 +#define gluNurbsCallbackData mgluNurbsCallbackData +#define gluNurbsCallbackDataEXT mgluNurbsCallbackDataEXT + +#endif diff --git a/reactos/lib/mesa32/include/GL/glx.h b/reactos/lib/mesa32/include/GL/glx.h new file mode 100644 index 00000000000..b34b2ceaec8 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/glx.h @@ -0,0 +1,504 @@ +/* + * Mesa 3-D graphics library + * Version: 4.1 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef GLX_H +#define GLX_H + + +#ifdef __VMS +#include +# ifdef __cplusplus +/* VMS Xlib.h gives problems with C++. + * this avoids a bunch of trivial warnings */ +#pragma message disable nosimpint +#endif +#endif +#include +#include +#ifdef __VMS +# ifdef __cplusplus +#pragma message enable nosimpint +#endif +#endif +#include + + +#if defined(USE_MGL_NAMESPACE) +#include +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define GLX_VERSION_1_1 1 +#define GLX_VERSION_1_2 1 +#define GLX_VERSION_1_3 1 +#define GLX_VERSION_1_4 1 + +#define GLX_EXTENSION_NAME "GLX" + + + +/* + * Tokens for glXChooseVisual and glXGetConfig: + */ +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 + + +/* + * Error codes returned by glXGetConfig: + */ +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + + +/* + * GLX 1.1 and later: + */ +#define GLX_VENDOR 1 +#define GLX_VERSION 2 +#define GLX_EXTENSIONS 3 + + +/* + * GLX 1.3 and later: + */ +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_VISUAL_ID 0x800B +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_NONE 0x8000 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_SCREEN 0x800C +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 + + +/* + * GLX 1.4 and later: + */ +#define GLX_SAMPLE_BUFFERS 0x186a0 /*100000*/ +#define GLX_SAMPLES 0x186a1 /*100001*/ + + + +typedef struct __GLXcontextRec *GLXContext; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +/* GLX 1.3 and later */ +typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef XID GLXFBConfigID; +typedef XID GLXContextID; +typedef XID GLXWindow; +typedef XID GLXPbuffer; + + + +extern XVisualInfo* glXChooseVisual( Display *dpy, int screen, + int *attribList ); + +extern GLXContext glXCreateContext( Display *dpy, XVisualInfo *vis, + GLXContext shareList, Bool direct ); + +extern void glXDestroyContext( Display *dpy, GLXContext ctx ); + +extern Bool glXMakeCurrent( Display *dpy, GLXDrawable drawable, + GLXContext ctx); + +extern void glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, + unsigned long mask ); + +extern void glXSwapBuffers( Display *dpy, GLXDrawable drawable ); + +extern GLXPixmap glXCreateGLXPixmap( Display *dpy, XVisualInfo *visual, + Pixmap pixmap ); + +extern void glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ); + +extern Bool glXQueryExtension( Display *dpy, int *errorb, int *event ); + +extern Bool glXQueryVersion( Display *dpy, int *maj, int *min ); + +extern Bool glXIsDirect( Display *dpy, GLXContext ctx ); + +extern int glXGetConfig( Display *dpy, XVisualInfo *visual, + int attrib, int *value ); + +extern GLXContext glXGetCurrentContext( void ); + +extern GLXDrawable glXGetCurrentDrawable( void ); + +extern void glXWaitGL( void ); + +extern void glXWaitX( void ); + +extern void glXUseXFont( Font font, int first, int count, int list ); + + + +/* GLX 1.1 and later */ +extern const char *glXQueryExtensionsString( Display *dpy, int screen ); + +extern const char *glXQueryServerString( Display *dpy, int screen, int name ); + +extern const char *glXGetClientString( Display *dpy, int name ); + + +/* GLX 1.2 and later */ +extern Display *glXGetCurrentDisplay( void ); + + +/* GLX 1.3 and later */ +extern GLXFBConfig *glXChooseFBConfig( Display *dpy, int screen, + const int *attribList, int *nitems ); + +extern int glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config, + int attribute, int *value ); + +extern GLXFBConfig *glXGetFBConfigs( Display *dpy, int screen, + int *nelements ); + +extern XVisualInfo *glXGetVisualFromFBConfig( Display *dpy, + GLXFBConfig config ); + +extern GLXWindow glXCreateWindow( Display *dpy, GLXFBConfig config, + Window win, const int *attribList ); + +extern void glXDestroyWindow( Display *dpy, GLXWindow window ); + +extern GLXPixmap glXCreatePixmap( Display *dpy, GLXFBConfig config, + Pixmap pixmap, const int *attribList ); + +extern void glXDestroyPixmap( Display *dpy, GLXPixmap pixmap ); + +extern GLXPbuffer glXCreatePbuffer( Display *dpy, GLXFBConfig config, + const int *attribList ); + +extern void glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf ); + +extern void glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute, + unsigned int *value ); + +extern GLXContext glXCreateNewContext( Display *dpy, GLXFBConfig config, + int renderType, GLXContext shareList, + Bool direct ); + +extern Bool glXMakeContextCurrent( Display *dpy, GLXDrawable draw, + GLXDrawable read, GLXContext ctx ); + +extern GLXDrawable glXGetCurrentReadDrawable( void ); + +extern int glXQueryContext( Display *dpy, GLXContext ctx, int attribute, + int *value ); + +extern void glXSelectEvent( Display *dpy, GLXDrawable drawable, + unsigned long mask ); + +extern void glXGetSelectedEvent( Display *dpy, GLXDrawable drawable, + unsigned long *mask ); + + +/* GLX 1.4 and later */ +extern void (*glXGetProcAddress(const GLubyte *procname))( void ); + + +#ifndef GLX_GLXEXT_LEGACY + +#include + +#else + + +/* + * 28. GLX_EXT_visual_info extension + */ +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#endif /* 28. GLX_EXT_visual_info extension */ + + + +/* + * 41. GLX_SGI_video_sync + */ +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +extern int glXGetVideoSyncSGI(unsigned int *count); +extern int glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count); + +#endif /* GLX_SGI_video_sync */ + + + +/* + * 42. GLX_EXT_visual_rating + */ +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +/*#define GLX_NONE_EXT 0x8000*/ +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#endif /* GLX_EXT_visual_rating */ + + + +/* + * 47. GLX_EXT_import_context + */ +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +extern void glXFreeContextEXT(Display *dpy, GLXContext context); + +extern GLXContextID glXGetContextIDEXT(const GLXContext context); + +extern Display *glXGetCurrentDisplayEXT(void); + +extern GLXContext glXImportContextEXT(Display *dpy, GLXContextID contextID); + +extern int glXQueryContextInfoEXT(Display *dpy, GLXContext context, + int attribute,int *value); + +#endif /* GLX_EXT_import_context */ + + + +/* + * 215. GLX_MESA_copy_sub_buffer + */ +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +extern void glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable, + int x, int y, int width, int height ); + +#endif + + + +/* + * 216. GLX_MESA_pixmap_colormap + */ +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +extern GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visual, + Pixmap pixmap, Colormap cmap ); + +#endif /* GLX_MESA_pixmap_colormap */ + + + +/* + * 217. GLX_MESA_release_buffers + */ +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +extern Bool glXReleaseBuffersMESA( Display *dpy, GLXDrawable d ); + +#endif /* GLX_MESA_release_buffers */ + + + +/* + * 218. GLX_MESA_set_3dfx_mode + */ +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +extern Bool glXSet3DfxModeMESA( int mode ); + +#endif /* GLX_MESA_set_3dfx_mode */ + + + +/* + * ARB 2. GLX_ARB_get_proc_address + */ +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void (*glXGetProcAddressARB(const GLubyte *procName))(); + +#endif /* GLX_ARB_get_proc_address */ + + + +#endif /* GLX_GLXEXT_LEGACY */ + + +/** + ** The following aren't in glxext.h yet. + **/ + + +/* + * ???. GLX_NV_vertex_array_range + */ +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range + +extern void *glXAllocateMemoryNV(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); +extern void glXFreeMemoryNV(GLvoid *pointer); +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (GLvoid *pointer); + +#endif /* GLX_NV_vertex_array_range */ + + + +/* + * ???. GLX_MESA_agp_offset + */ +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +extern GLuint glXGetAGPOffsetMESA(const GLvoid *pointer); +typedef GLuint (* PFNGLXGETAGPOFFSETMESAPROC) (const GLvoid *pointer); + +#endif /* GLX_MESA_agp_offset */ + + +/* + * ARB ?. GLX_ARB_render_texture + */ +#ifndef GLX_ARB_render_texture +#define GLX_ARB_render_texture 1 + +extern Bool glXBindTexImageARB(Display *dpy, GLXPbuffer pbuffer, int buffer); +extern Bool glXReleaseTexImageARB(Display *dpy, GLXPbuffer pbuffer, int buffer); +extern Bool glXDrawableAttribARB(Display *dpy, GLXDrawable draw, const int *attribList); + +#endif /* GLX_ARB_render_texture */ + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/lib/mesa32/include/GL/glx_mangle.h b/reactos/lib/mesa32/include/GL/glx_mangle.h new file mode 100644 index 00000000000..d0b47d94e73 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/glx_mangle.h @@ -0,0 +1,55 @@ +/* + * Mesa 3-D graphics library + * Version: 4.1 + * Copyright (C) 1995-1998 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#ifndef GLX_MANGLE_H +#define GLX_MANGLE_H + +#define glXChooseVisual mglXChooseVisual +#define glXCreateContext mglXCreateContext +#define glXDestroyContext mglXDestroyContext +#define glXMakeCurrent mglXMakeCurrent +#define glXCopyContext mglXCopyContext +#define glXSwapBuffers mglXSwapBuffers +#define glXCreateGLXPixmap mglXCreateGLXPixmap +#define glXDestroyGLXPixmap mglXDestroyGLXPixmap +#define glXQueryExtension mglXQueryExtension +#define glXQueryVersion mglXQueryVersion +#define glXIsDirect mglXIsDirect +#define glXGetConfig mglXGetConfig +#define glXGetCurrentContext mglXGetCurrentContext +#define glXGetCurrentDrawable mglXGetCurrentDrawable +#define glXWaitGL mglXWaitGL +#define glXWaitX mglXWaitX +#define glXUseXFont mglXUseXFont +#define glXQueryExtensionsString mglXQueryExtensionsString +#define glXQueryServerString mglXQueryServerString +#define glXGetClientString mglXGetClientString +#define glXCreateGLXPixmapMESA mglXCreateGLXPixmapMESA +#define glXReleaseBuffersMESA mglXReleaseBuffersMESA +#define glXCopySubBufferMESA mglXCopySubBufferMESA +#define glXGetVideoSyncSGI mglXGetVideoSyncSGI +#define glXWaitVideoSyncSGI mglXWaitVideoSyncSGI + +/* GLX 1.4 */ +#define glXGetProcAddress mglXGetProcAddress + + +#endif diff --git a/reactos/lib/mesa32/include/GL/glxext.h b/reactos/lib/mesa32/include/GL/glxext.h new file mode 100644 index 00000000000..54620bd4e17 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/glxext.h @@ -0,0 +1,607 @@ +#ifndef __glxext_h_ +#define __glxext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glxext.h last updated 2002/03/22 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GLX_GLXEXT_VERSION 5 + +#ifndef GLX_VERSION_1_3 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#endif + +#ifndef GLX_VERSION_1_4 +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 +#endif + +#ifndef GLX_ARB_get_proc_address +#endif + +#ifndef GLX_ARB_multisample +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 +#endif + +#ifndef GLX_SGIS_multisample +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 +#endif + +#ifndef GLX_EXT_visual_info +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 +#endif + +#ifndef GLX_SGI_swap_control +#endif + +#ifndef GLX_SGI_video_sync +#endif + +#ifndef GLX_SGI_make_current_read +#endif + +#ifndef GLX_SGIX_video_source +#endif + +#ifndef GLX_EXT_visual_rating +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D +/* reuse GLX_NONE_EXT */ +#endif + +#ifndef GLX_EXT_import_context +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C +#endif + +#ifndef GLX_SGIX_fbconfig +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 +/* reuse GLX_SCREEN_EXT */ +#endif + +#ifndef GLX_SGIX_pbuffer +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#endif + +#ifndef GLX_SGI_cushion +#endif + +#ifndef GLX_SGIX_video_resize +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 +#endif + +#ifndef GLX_SGIX_dmbuffer +#define GLX_DIGITAL_MEDIA_PBUFFER_SGIX 0x8024 +#endif + +#ifndef GLX_SGIX_swap_group +#endif + +#ifndef GLX_SGIX_swap_barrier +#endif + +#ifndef GLX_SGIS_blended_overlay +#define GLX_BLENDED_RGBA_SGIS 0x8025 +#endif + +#ifndef GLX_SGIS_shared_multisample +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 +#endif + +#ifndef GLX_SUN_get_transparent_index +#endif + +#ifndef GLX_3DFX_multisample +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 +#endif + +#ifndef GLX_MESA_copy_sub_buffer +#endif + +#ifndef GLX_MESA_pixmap_colormap +#endif + +#ifndef GLX_MESA_release_buffers +#endif + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 +#endif + +#ifndef GLX_SGIX_visual_select_group +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 +#endif + +#ifndef GLX_OML_swap_method +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 +#endif + +#ifndef GLX_OML_sync_control +#endif + + +/*************************************************************/ + +#ifndef GLX_ARB_get_proc_address +typedef void (*__GLXextFuncPtr)(void); +#endif + +#ifndef GLX_SGIX_video_source +typedef XID GLXVideoSourceSGIX; +#endif + +#ifndef GLX_SGIX_fbconfig +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; +#endif + +#ifndef GLX_SGIX_pbuffer +typedef XID GLXPbufferSGIX; +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* i.d. of Drawable */ + int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ + int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ + unsigned int mask; /* mask indicating which buffers are affected*/ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXBufferClobberEventSGIX; +#endif + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXFBConfig * glXGetFBConfigs (Display *, int, int *); +extern GLXFBConfig * glXChooseFBConfig (Display *, int, const int *, int *); +extern int glXGetFBConfigAttrib (Display *, GLXFBConfig, int, int *); +extern XVisualInfo * glXGetVisualFromFBConfig (Display *, GLXFBConfig); +extern GLXWindow glXCreateWindow (Display *, GLXFBConfig, Window, const int *); +extern void glXDestroyWindow (Display *, GLXWindow); +extern GLXPixmap glXCreatePixmap (Display *, GLXFBConfig, Pixmap, const int *); +extern void glXDestroyPixmap (Display *, GLXPixmap); +extern GLXPbuffer glXCreatePbuffer (Display *, GLXFBConfig, const int *); +extern void glXDestroyPbuffer (Display *, GLXPbuffer); +extern void glXQueryDrawable (Display *, GLXDrawable, int, unsigned int *); +extern GLXContext glXCreateNewContext (Display *, GLXFBConfig, int, GLXContext, Bool); +extern Bool glXMakeContextCurrent (Display *, GLXDrawable, GLXDrawable, GLXContext); +extern GLXDrawable glXGetCurrentReadDrawable (void); +extern Display * glXGetCurrentDisplay (void); +extern int glXQueryContext (Display *, GLXContext, int, int *); +extern void glXSelectEvent (Display *, GLXDrawable, unsigned long); +extern void glXGetSelectedEvent (Display *, GLXDrawable, unsigned long *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXFBConfig * ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef GLXFBConfig * ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef Display * ( * PFNGLXGETCURRENTDISPLAYPROC) (void); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +#endif + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern __GLXextFuncPtr glXGetProcAddress (const GLubyte *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSPROC) (const GLubyte *procName); +#endif + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName); +#endif + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 +#endif + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 +#endif + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 +#endif + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXSwapIntervalSGI (int); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); +#endif + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXGetVideoSyncSGI (unsigned int *); +extern int glXWaitVideoSyncSGI (int, int, unsigned int *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int *count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int *count); +#endif + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXMakeCurrentReadSGI (Display *, GLXDrawable, GLXDrawable, GLXContext); +extern GLXDrawable glXGetCurrentReadDrawableSGI (void); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +#endif + +#ifdef _VL_H +#ifndef GLX_SGIX_video_source +#define GLX_SGIX_video_source 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX (Display *, int, VLServer, VLPath, int, VLNode); +extern void glXDestroyGLXVideoSourceSGIX (Display *, GLXVideoSourceSGIX); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXVideoSourceSGIX ( * PFNGLXCREATEGLXVIDEOSOURCESGIXPROC) (Display *display, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode); +typedef void ( * PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC) (Display *dpy, GLXVideoSourceSGIX glxvideosource); +#endif + +#endif /* _VL_H */ +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 +#endif + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Display * glXGetCurrentDisplayEXT (void); +extern int glXQueryContextInfoEXT (Display *, GLXContext, int, int *); +extern GLXContextID glXGetContextIDEXT (const GLXContext); +extern GLXContext glXImportContextEXT (Display *, GLXContextID); +extern void glXFreeContextEXT (Display *, GLXContext); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Display * ( * PFNGLXGETCURRENTDISPLAYEXTPROC) (void); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display *dpy, GLXContext context, int attribute, int *value); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display *dpy, GLXContextID contextID); +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display *dpy, GLXContext context); +#endif + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXGetFBConfigAttribSGIX (Display *, GLXFBConfigSGIX, int, int *); +extern GLXFBConfigSGIX * glXChooseFBConfigSGIX (Display *, int, int *, int *); +extern GLXPixmap glXCreateGLXPixmapWithConfigSGIX (Display *, GLXFBConfigSGIX, Pixmap); +extern GLXContext glXCreateContextWithConfigSGIX (Display *, GLXFBConfigSGIX, int, GLXContext, Bool); +extern XVisualInfo * glXGetVisualFromFBConfigSGIX (Display *, GLXFBConfigSGIX); +extern GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX (Display *, XVisualInfo *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); +typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display *dpy, XVisualInfo *vis); +#endif + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXPbufferSGIX glXCreateGLXPbufferSGIX (Display *, GLXFBConfigSGIX, unsigned int, unsigned int, int *); +extern void glXDestroyGLXPbufferSGIX (Display *, GLXPbufferSGIX); +extern int glXQueryGLXPbufferSGIX (Display *, GLXPbufferSGIX, int, unsigned int *); +extern void glXSelectEventSGIX (Display *, GLXDrawable, unsigned long); +extern void glXGetSelectedEventSGIX (Display *, GLXDrawable, unsigned long *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXPbufferSGIX ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf); +typedef int ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long mask); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long *mask); +#endif + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXCushionSGI (Display *, Window, float); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display *dpy, Window window, float cushion); +#endif + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXBindChannelToWindowSGIX (Display *, int, int, Window); +extern int glXChannelRectSGIX (Display *, int, int, int, int, int, int); +extern int glXQueryChannelRectSGIX (Display *, int, int, int *, int *, int *, int *); +extern int glXQueryChannelDeltasSGIX (Display *, int, int, int *, int *, int *, int *); +extern int glXChannelRectSyncSGIX (Display *, int, int, GLenum); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display *display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display *display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display *display, int screen, int channel, GLenum synctype); +#endif + +#ifdef _DM_BUFFER_H_ +#ifndef GLX_SGIX_dmbuffer +#define GLX_SGIX_dmbuffer 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXAssociateDMPbufferSGIX (Display *, GLXPbufferSGIX, DMparams *, DMbuffer); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXASSOCIATEDMPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer); +#endif + +#endif /* _DM_BUFFER_H_ */ +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXJoinSwapGroupSGIX (Display *, GLXDrawable, GLXDrawable); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); +#endif + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXBindSwapBarrierSGIX (Display *, GLXDrawable, int); +extern Bool glXQueryMaxSwapBarriersSGIX (Display *, int, int *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); +#endif + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Status glXGetTransparentIndexSUN (Display *, Window, Window, long *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display *dpy, Window overlay, Window underlay, long *pTransparentIndex); +#endif + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXCopySubBufferMESA (Display *, GLXDrawable, int, int, int, int); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height); +#endif + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXPixmap glXCreateGLXPixmapMESA (Display *, XVisualInfo *, Pixmap, Colormap); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display *dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); +#endif + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXReleaseBuffersMESA (Display *, GLXDrawable); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display *dpy, GLXDrawable drawable); +#endif + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXSet3DfxModeMESA (int); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXSET3DFXMODEMESAPROC) (int mode); +#endif + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 +#endif + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 +#endif + +#if defined(__STDC_VERSION__) +#if __STDC_VERSION__ >= 199901L +/* Include ISO C99 integer types for OML_sync_control; need a better test */ +#include + +#ifndef GLX_OML_sync_control +#define GLX_OML_sync_control 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXGetSyncValuesOML (Display *, GLXDrawable, int64_t *, int64_t *, int64_t *); +extern Bool glXGetMscRateOML (Display *, GLXDrawable, int32_t *, int32_t *); +extern int64_t glXSwapBuffersMscOML (Display *, GLXDrawable, int64_t, int64_t, int64_t); +extern Bool glXWaitForMscOML (Display *, GLXDrawable, int64_t, int64_t, int64_t, int64_t *, int64_t *, int64_t *); +extern Bool glXWaitForSbcOML (Display *, GLXDrawable, int64_t, int64_t *, int64_t *, int64_t *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t *ust, int64_t *msc, int64_t *sbc); +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display *dpy, GLXDrawable drawable, int32_t *numerator, int32_t *denominator); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_sbc, int64_t *ust, int64_t *msc, int64_t *sbc); +#endif + +#endif /* C99 version test */ +#endif /* STDC test */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/lib/mesa32/include/GL/internal/glcore.h b/reactos/lib/mesa32/include/GL/internal/glcore.h new file mode 100644 index 00000000000..7080b7ce74e --- /dev/null +++ b/reactos/lib/mesa32/include/GL/internal/glcore.h @@ -0,0 +1,471 @@ +/* $XFree86: xc/lib/GL/include/GL/internal/glcore.h,v 1.7 2001/03/25 05:32:00 tsi Exp $ */ +#ifndef __gl_core_h_ +#define __gl_core_h_ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +*/ + +#ifndef XFree86LOADER +#include +#endif + +#ifdef CAPI +#undef CAPI +#endif +#define CAPI + +#define GL_CORE_SGI 1 +#define GL_CORE_MESA 2 +#define GL_CORE_APPLE 4 + +typedef struct __GLcontextRec __GLcontext; +typedef struct __GLinterfaceRec __GLinterface; + +/* +** This file defines the interface between the GL core and the surrounding +** "operating system" that supports it (currently the GLX or WGL extensions). +** +** Members (data and function pointers) are documented as imported or +** exported according to how they are used by the core rendering functions. +** Imported members are initialized by the "operating system" and used by +** the core functions. Exported members are initialized by the core functions +** and used by the "operating system". +*/ + +/* +** Mode and limit information for a context. This information is +** kept around in the context so that values can be used during +** command execution, and for returning information about the +** context to the application. +*/ +typedef struct __GLcontextModesRec { + struct __GLcontextModesRec * next; + + GLboolean rgbMode; + GLboolean floatMode; + GLboolean colorIndexMode; + GLuint doubleBufferMode; + GLuint stereoMode; + + GLboolean haveAccumBuffer; + GLboolean haveDepthBuffer; + GLboolean haveStencilBuffer; + + GLint redBits, greenBits, blueBits, alphaBits; /* bits per comp */ + GLuint redMask, greenMask, blueMask, alphaMask; + GLint rgbBits; /* total bits for rgb */ + GLint indexBits; /* total bits for colorindex */ + + GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits; + GLint depthBits; + GLint stencilBits; + + GLint numAuxBuffers; + + GLint level; + + GLint pixmapMode; + + /* GLX */ + GLint visualID; + GLint visualType; /**< One of the GLX X visual types. (i.e., + * \c GLX_TRUE_COLOR, etc.) + */ + + /* EXT_visual_rating / GLX 1.2 */ + GLint visualRating; + + /* EXT_visual_info / GLX 1.2 */ + GLint transparentPixel; + /* colors are floats scaled to ints */ + GLint transparentRed, transparentGreen, transparentBlue, transparentAlpha; + GLint transparentIndex; + + /* ARB_multisample / SGIS_multisample */ + GLint sampleBuffers; + GLint samples; + + /* SGIX_fbconfig / GLX 1.3 */ + GLint drawableType; + GLint renderType; + GLint xRenderable; + GLint fbconfigID; + + /* SGIX_pbuffer / GLX 1.3 */ + GLint maxPbufferWidth; + GLint maxPbufferHeight; + GLint maxPbufferPixels; + GLint optimalPbufferWidth; /* Only for SGIX_pbuffer. */ + GLint optimalPbufferHeight; /* Only for SGIX_pbuffer. */ + + /* SGIX_visual_select_group */ + GLint visualSelectGroup; + + /* OML_swap_method */ + GLint swapMethod; + + GLint screen; +} __GLcontextModes; + +/************************************************************************/ + +/* +** Structure used for allocating and freeing drawable private memory. +** (like software buffers, for example). +** +** The memory allocation routines are provided by the surrounding +** "operating system" code, and they are to be used for allocating +** software buffers and things which are associated with the drawable, +** and used by any context which draws to that drawable. There are +** separate memory allocation functions for drawables and contexts +** since drawables and contexts can be created and destroyed independently +** of one another, and the "operating system" may want to use separate +** allocation arenas for each. +** +** The freePrivate function is filled in by the core routines when they +** allocates software buffers, and stick them in "private". The freePrivate +** function will destroy anything allocated to this drawable (to be called +** when the drawable is destroyed). +*/ +typedef struct __GLdrawableRegionRec __GLdrawableRegion; +typedef struct __GLdrawableBufferRec __GLdrawableBuffer; +typedef struct __GLdrawablePrivateRec __GLdrawablePrivate; + +typedef struct __GLregionRectRec { + /* lower left (inside the rectangle) */ + GLint x0, y0; + /* upper right (outside the rectangle) */ + GLint x1, y1; +} __GLregionRect; + +struct __GLdrawableRegionRec { + GLint numRects; + __GLregionRect *rects; + __GLregionRect boundingRect; +}; + +/************************************************************************/ + +/* masks for the buffers */ +#define __GL_FRONT_BUFFER_MASK 0x00000001 +#define __GL_FRONT_LEFT_BUFFER_MASK 0x00000001 +#define __GL_FRONT_RIGHT_BUFFER_MASK 0x00000002 +#define __GL_BACK_BUFFER_MASK 0x00000004 +#define __GL_BACK_LEFT_BUFFER_MASK 0x00000004 +#define __GL_BACK_RIGHT_BUFFER_MASK 0x00000008 +#define __GL_ACCUM_BUFFER_MASK 0x00000010 +#define __GL_DEPTH_BUFFER_MASK 0x00000020 +#define __GL_STENCIL_BUFFER_MASK 0x00000040 +#define __GL_AUX_BUFFER_MASK(i) (0x0000080 << (i)) + +#define __GL_ALL_BUFFER_MASK 0xffffffff + +/* what Resize routines return if resize resorted to fallback case */ +#define __GL_BUFFER_FALLBACK 0x10 + +typedef void (*__GLbufFallbackInitFn)(__GLdrawableBuffer *buf, + __GLdrawablePrivate *glPriv, GLint bits); +typedef void (*__GLbufMainInitFn)(__GLdrawableBuffer *buf, + __GLdrawablePrivate *glPriv, GLint bits, + __GLbufFallbackInitFn back); + +/* +** A drawable buffer +** +** This data structure describes the context side of a drawable. +** +** According to the spec there could be multiple contexts bound to the same +** drawable at the same time (from different threads). In order to avoid +** multiple-access conflicts, locks are used to serialize access. When a +** thread needs to access (read or write) a member of the drawable, it takes +** a lock first. Some of the entries in the drawable are treated "mostly +** constant", so we take the freedom of allowing access to them without +** taking a lock (for optimization reasons). +** +** For more details regarding locking, see buffers.h in the GL core +*/ +struct __GLdrawableBufferRec { + /* + ** Buffer dimensions + */ + GLint width, height, depth; + + /* + ** Framebuffer base address + */ + void *base; + + /* + ** Framebuffer size (in bytes) + */ + GLuint size; + + /* + ** Size (in bytes) of each element in the framebuffer + */ + GLuint elementSize; + GLuint elementSizeLog2; + + /* + ** Element skip from one scanline to the next. + ** If the buffer is part of another buffer (for example, fullscreen + ** front buffer), outerWidth is the width of that buffer. + */ + GLint outerWidth; + + /* + ** outerWidth * elementSize + */ + GLint byteWidth; + + /* + ** Allocation/deallocation is done based on this handle. A handle + ** is conceptually different from the framebuffer 'base'. + */ + void *handle; + + /* imported */ + GLboolean (*resize)(__GLdrawableBuffer *buf, + GLint x, GLint y, GLuint width, GLuint height, + __GLdrawablePrivate *glPriv, GLuint bufferMask); + void (*lock)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv); + void (*unlock)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv); + void (*fill)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv, + GLuint val, GLint x, GLint y, GLint w, GLint h); + void (*free)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv); + + /* exported */ + void (*freePrivate)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv); +#ifdef __cplusplus + void *privatePtr; +#else + void *private; +#endif + + /* private */ + void *other; /* implementation private data */ + __GLbufMainInitFn mainInit; + __GLbufFallbackInitFn fallbackInit; +}; + +/* +** The context side of the drawable private +*/ +struct __GLdrawablePrivateRec { + /* + ** Drawable Modes + */ + __GLcontextModes *modes; + + /* + ** Drawable size + */ + GLuint width, height; + + /* + ** Origin in screen coordinates of the drawable + */ + GLint xOrigin, yOrigin; +#ifdef __GL_ALIGNED_BUFFERS + /* + ** Drawable offset from screen origin + */ + GLint xOffset, yOffset; + + /* + ** Alignment restriction + */ + GLint xAlignment, yAlignment; +#endif + /* + ** Should we invert the y axis? + */ + GLint yInverted; + + /* + ** Mask specifying which buffers are renderable by the hw + */ + GLuint accelBufferMask; + + /* + ** the buffers themselves + */ + __GLdrawableBuffer frontBuffer; + __GLdrawableBuffer backBuffer; + __GLdrawableBuffer accumBuffer; + __GLdrawableBuffer depthBuffer; + __GLdrawableBuffer stencilBuffer; +#if defined(__GL_NUMBER_OF_AUX_BUFFERS) && (__GL_NUMBER_OF_AUX_BUFFERS > 0) + __GLdrawableBuffer *auxBuffer; +#endif + + __GLdrawableRegion ownershipRegion; + + /* + ** Lock for the drawable private structure + */ + void *lock; +#ifdef DEBUG + /* lock debugging info */ + int lockRefCount; + int lockLine[10]; + char *lockFile[10]; +#endif + + /* imported */ + void *(*malloc)(size_t size); + void *(*calloc)(size_t numElem, size_t elemSize); + void *(*realloc)(void *oldAddr, size_t newSize); + void (*free)(void *addr); + + GLboolean (*addSwapRect)(__GLdrawablePrivate *glPriv, + GLint x, GLint y, GLsizei width, GLsizei height); + void (*setClipRect)(__GLdrawablePrivate *glPriv, + GLint x, GLint y, GLsizei width, GLsizei height); + void (*updateClipRegion)(__GLdrawablePrivate *glPriv); + GLboolean (*resize)(__GLdrawablePrivate *glPriv); + void (*getDrawableSize)(__GLdrawablePrivate *glPriv, + GLint *x, GLint *y, GLuint *width, GLuint *height); + + void (*lockDP)(__GLdrawablePrivate *glPriv, __GLcontext *gc); + void (*unlockDP)(__GLdrawablePrivate *glPriv); + + /* exported */ +#ifdef __cplusplus + void *privatePtr; +#else + void *private; +#endif + void (*freePrivate)(__GLdrawablePrivate *); + + /* client data */ + void *other; +}; + +/* +** Macros to lock/unlock the drawable private +*/ +#if defined(DEBUG) +#define __GL_LOCK_DP(glPriv,gc) \ + (*(glPriv)->lockDP)(glPriv,gc); \ + (glPriv)->lockLine[(glPriv)->lockRefCount] = __LINE__; \ + (glPriv)->lockFile[(glPriv)->lockRefCount] = __FILE__; \ + (glPriv)->lockRefCount++ +#define __GL_UNLOCK_DP(glPriv) \ + (glPriv)->lockRefCount--; \ + (glPriv)->lockLine[(glPriv)->lockRefCount] = 0; \ + (glPriv)->lockFile[(glPriv)->lockRefCount] = NULL; \ + (*(glPriv)->unlockDP)(glPriv) +#else /* DEBUG */ +#define __GL_LOCK_DP(glPriv,gc) (*(glPriv)->lockDP)(glPriv,gc) +#define __GL_UNLOCK_DP(glPriv) (*(glPriv)->unlockDP)(glPriv) +#endif /* DEBUG */ + + +/* +** Procedures which are imported by the GL from the surrounding +** "operating system". Math functions are not considered part of the +** "operating system". +*/ +typedef struct __GLimportsRec { + /* Memory management */ + void * (*malloc)(__GLcontext *gc, size_t size); + void *(*calloc)(__GLcontext *gc, size_t numElem, size_t elemSize); + void *(*realloc)(__GLcontext *gc, void *oldAddr, size_t newSize); + void (*free)(__GLcontext *gc, void *addr); + + /* Error handling */ + void (*warning)(__GLcontext *gc, char *fmt); + void (*fatal)(__GLcontext *gc, char *fmt); + + /* other system calls */ + char *(CAPI *getenv)(__GLcontext *gc, const char *var); + int (CAPI *atoi)(__GLcontext *gc, const char *str); + int (CAPI *sprintf)(__GLcontext *gc, char *str, const char *fmt, ...); + void *(CAPI *fopen)(__GLcontext *gc, const char *path, const char *mode); + int (CAPI *fclose)(__GLcontext *gc, void *stream); + int (CAPI *fprintf)(__GLcontext *gc, void *stream, const char *fmt, ...); + + /* Drawing surface management */ + __GLdrawablePrivate *(*getDrawablePrivate)(__GLcontext *gc); + __GLdrawablePrivate *(*getReadablePrivate)(__GLcontext *gc); + + /* Operating system dependent data goes here */ + void *other; +} __GLimports; + +/************************************************************************/ + +/* +** Procedures which are exported by the GL to the surrounding "operating +** system" so that it can manage multiple GL context's. +*/ +typedef struct __GLexportsRec { + /* Context management (return GL_FALSE on failure) */ + GLboolean (*destroyContext)(__GLcontext *gc); + GLboolean (*loseCurrent)(__GLcontext *gc); + /* oldglPriv isn't used anymore, kept for backwards compatibility */ + GLboolean (*makeCurrent)(__GLcontext *gc); + GLboolean (*shareContext)(__GLcontext *gc, __GLcontext *gcShare); + GLboolean (*copyContext)(__GLcontext *dst, const __GLcontext *src, GLuint mask); + GLboolean (*forceCurrent)(__GLcontext *gc); + + /* Drawing surface notification callbacks */ + GLboolean (*notifyResize)(__GLcontext *gc); + void (*notifyDestroy)(__GLcontext *gc); + void (*notifySwapBuffers)(__GLcontext *gc); + + /* Dispatch table override control for external agents like libGLS */ + struct __GLdispatchStateRec* (*dispatchExec)(__GLcontext *gc); + void (*beginDispatchOverride)(__GLcontext *gc); + void (*endDispatchOverride)(__GLcontext *gc); +} __GLexports; + +/************************************************************************/ + +/* +** This must be the first member of a __GLcontext structure. This is the +** only part of a context that is exposed to the outside world; everything +** else is opaque. +*/ +struct __GLinterfaceRec { + __GLimports imports; + __GLexports exports; +}; + +extern __GLcontext *__glCoreCreateContext(__GLimports *, __GLcontextModes *); +extern void __glCoreNopDispatch(void); + +#endif /* __gl_core_h_ */ diff --git a/reactos/lib/mesa32/include/GL/mesa_wgl.h b/reactos/lib/mesa32/include/GL/mesa_wgl.h new file mode 100644 index 00000000000..a331bb3514b --- /dev/null +++ b/reactos/lib/mesa32/include/GL/mesa_wgl.h @@ -0,0 +1,123 @@ +/* + * Mesa 3-D graphics library + * Version: 3.1 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/* prototypes for the Mesa WGL functions */ +/* relocated here so that I could make GLUT get them properly */ + +#define _mesa_wgl_h_ + +#ifndef _mesa_wgl_h_ +#define _mesa_wgl_h_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#if !defined(OPENSTEP) && (defined(__WIN32__) || defined(__CYGWIN32__)) +# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ +# define GLAPI __declspec(dllexport) +# define WGLAPI __declspec(dllexport) +# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ +# define GLAPI __declspec(dllimport) +# define WGLAPI __declspec(dllimport) +# else /* for use with static link lib build of Win32 edition only */ +# define GLAPI extern +# define WGLAPI __declspec(dllimport) +# endif /* _STATIC_MESA support */ +# define GLAPIENTRY __stdcall +#else +/* non-Windows compilation */ +# define GLAPI extern +# define GLAPIENTRY +#endif /* WIN32 / CYGWIN32 bracket */ + + +#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) +#ifndef _GNU_H_WINDOWS32_FUNCTIONS +# ifdef UNICODE +# define wglUseFontBitmaps wglUseFontBitmapsW +# define wglUseFontOutlines wglUseFontOutlinesW +# else +# define wglUseFontBitmaps wglUseFontBitmapsA +# define wglUseFontOutlines wglUseFontOutlinesA +# endif /* !UNICODE */ +#endif /* _GNU_H_WINDOWS32_FUNCTIONS */ +typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR; +typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT; +typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR; +#endif + + +#ifdef _MSC_VER +# pragma warning( disable : 4615 ) /* pragma warning : unknown user warning type*/ +# pragma warning( push ) +# pragma warning( disable : 4273 ) /* 'function' : inconsistent DLL linkage. dllexport assumed. */ +#endif + +WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC); +WGLAPI int GLAPIENTRY wglMakeCurrent(HDC,HGLRC); +WGLAPI int GLAPIENTRY wglSetPixelFormat(HDC, int, const PIXELFORMATDESCRIPTOR *); +WGLAPI int GLAPIENTRY wglSwapBuffers(HDC hdc); +WGLAPI HDC GLAPIENTRY wglGetCurrentDC(void); +WGLAPI HGLRC GLAPIENTRY wglCreateContext(HDC); +WGLAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC,int); +WGLAPI HGLRC GLAPIENTRY wglGetCurrentContext(void); +WGLAPI PROC GLAPIENTRY wglGetProcAddress(const char*); +WGLAPI int GLAPIENTRY wglChoosePixelFormat(HDC, const PIXELFORMATDESCRIPTOR *); +WGLAPI int GLAPIENTRY wglCopyContext(HGLRC, HGLRC, unsigned int); +WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC); +WGLAPI int GLAPIENTRY wglDescribeLayerPlane(HDC, int, int, unsigned int,LPLAYERPLANEDESCRIPTOR); +WGLAPI int GLAPIENTRY wglDescribePixelFormat(HDC,int, unsigned int, LPPIXELFORMATDESCRIPTOR); +WGLAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC, int, int, int,COLORREF *); +WGLAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc); +WGLAPI int GLAPIENTRY wglMakeCurrent(HDC, HGLRC); +WGLAPI int GLAPIENTRY wglRealizeLayerPalette(HDC, int, int); +WGLAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC, int, int, int,const COLORREF *); +WGLAPI int GLAPIENTRY wglShareLists(HGLRC, HGLRC); +WGLAPI int GLAPIENTRY wglSwapLayerBuffers(HDC, unsigned int); +WGLAPI int GLAPIENTRY wglUseFontBitmapsA(HDC, unsigned long, unsigned long, unsigned long); +WGLAPI int GLAPIENTRY wglUseFontBitmapsW(HDC, unsigned long, unsigned long, unsigned long); +WGLAPI int GLAPIENTRY wglUseFontOutlinesA(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT); +WGLAPI int GLAPIENTRY wglUseFontOutlinesW(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT); +WGLAPI int GLAPIENTRY SwapBuffers(HDC); +WGLAPI int GLAPIENTRY ChoosePixelFormat(HDC,const PIXELFORMATDESCRIPTOR *); +WGLAPI int GLAPIENTRY DescribePixelFormat(HDC,int,unsigned int,LPPIXELFORMATDESCRIPTOR); +WGLAPI int GLAPIENTRY GetPixelFormat(HDC); +WGLAPI int GLAPIENTRY SetPixelFormat(HDC,int,const PIXELFORMATDESCRIPTOR *); + +#ifdef _MSC_VER +# pragma warning( pop ) +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* _mesa_wgl_h_ */ diff --git a/reactos/lib/mesa32/include/GL/mglmesa.h b/reactos/lib/mesa32/include/GL/mglmesa.h new file mode 100644 index 00000000000..0f9f7895714 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/mglmesa.h @@ -0,0 +1,79 @@ +/**************************************************************************** +* +* Mesa bindings for SciTech MGL +* +* Copyright (C) 1996 SciTech Software. +* All rights reserved. +* +* Filename: mglmesa.h +* Version: Revision: 1.1.1.1 +* +* Language: ANSI C +* Environment: Any +* +* Description: Header file for the Mesa/OpenGL interface bindings for the +* SciTech MGL graphics library. Uses the MGL internal +* device context structures to get direct access to the +* high performance MGL rasterization functions for maximum +* performance. Utilizes the VESA VBE/AF Accelerator Functions +* via the MGL's accelerated device driver functions, as well +* as basic DirectDraw accelerated functions provided by the +* MGL. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Library General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library 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 +* Library General Public License for more details. +* +* You should have received a copy of the GNU Library General Public +* License along with this library; if not, write to the Free +* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +* +* +****************************************************************************/ + +#ifndef __MGLMESA_H +#define __MGLMESA_H + +#include "mgraph.h" + +/*------------------------- Function Prototypes ---------------------------*/ + +#ifdef __cplusplus +extern "C" { /* Use "C" linkage when in C++ mode */ +#endif + +#ifndef __WINDOWS__ +#define GLAPIENTRY +#endif + +#ifdef __WINDOWS__ +bool GLAPIENTRY MGLMesaInitDLL(MGLCallbacks *cb,char *version); +#endif +void GLAPIENTRY MGLMesaChooseVisual(MGLDC *dc,MGLVisual *visual); +bool GLAPIENTRY MGLMesaSetVisual(MGLDC *dc,MGLVisual *visual); +bool GLAPIENTRY MGLMesaCreateContext(MGLDC *dc,bool forceMemDC); +void GLAPIENTRY MGLMesaDestroyContext(MGLDC *dc); +void GLAPIENTRY MGLMesaMakeCurrent(MGLDC *dc); +void GLAPIENTRY MGLMesaSwapBuffers(MGLDC *dc,bool waitVRT); + +/* Palette manipulation support. The reason we provide palette manipulation + * routines is so that when rendering in double buffered modes with a + * software backbuffer, the palette for the backbuffer is kept consistent + * with the hardware front buffer. + */ + +void GLAPIENTRY MGLMesaSetPaletteEntry(MGLDC *dc,int entry,uchar red,uchar green,uchar blue); +void GLAPIENTRY MGLMesaSetPalette(MGLDC *dc,palette_t *pal,int numColors,int startIndex); +void GLAPIENTRY MGLMesaRealizePalette(MGLDC *dc,int numColors,int startIndex,int waitVRT); + +#ifdef __cplusplus +} /* End of "C" linkage for C++ */ +#endif /* __cplusplus */ + +#endif /* __MGLMESA_H */ diff --git a/reactos/lib/mesa32/include/GL/osmesa.h b/reactos/lib/mesa32/include/GL/osmesa.h new file mode 100644 index 00000000000..cf892b91c93 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/osmesa.h @@ -0,0 +1,274 @@ +/* + * Mesa 3-D graphics library + * Version: 4.1 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/* + * Mesa Off-Screen rendering interface. + * + * This is an operating system and window system independent interface to + * Mesa which allows one to render images into a client-supplied buffer in + * main memory. Such images may manipulated or saved in whatever way the + * client wants. + * + * These are the API functions: + * OSMesaCreateContext - create a new Off-Screen Mesa rendering context + * OSMesaMakeCurrent - bind an OSMesaContext to a client's image buffer + * and make the specified context the current one. + * OSMesaDestroyContext - destroy an OSMesaContext + * OSMesaGetCurrentContext - return thread's current context ID + * OSMesaPixelStore - controls how pixels are stored in image buffer + * OSMesaGetIntegerv - return OSMesa state parameters + * + * + * The limits on the width and height of an image buffer are MAX_WIDTH and + * MAX_HEIGHT as defined in Mesa/src/config.h. Defaults are 1280 and 1024. + * You can increase them as needed but beware that many temporary arrays in + * Mesa are dimensioned by MAX_WIDTH or MAX_HEIGHT. + */ + + +#ifndef OSMESA_H +#define OSMESA_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +#include + + +#define OSMESA_MAJOR_VERSION 4 +#define OSMESA_MINOR_VERSION 1 +#define OSMESA_PATCH_VERSION 0 + + + +/* + * Values for the format parameter of OSMesaCreateContext() + * New in version 2.0. + */ +#define OSMESA_COLOR_INDEX GL_COLOR_INDEX +#define OSMESA_RGBA GL_RGBA +#define OSMESA_BGRA 0x1 +#define OSMESA_ARGB 0x2 +#define OSMESA_RGB GL_RGB +#define OSMESA_BGR 0x4 +#define OSMESA_RGB_565 0x5 + + +/* + * OSMesaPixelStore() parameters: + * New in version 2.0. + */ +#define OSMESA_ROW_LENGTH 0x10 +#define OSMESA_Y_UP 0x11 + + +/* + * Accepted by OSMesaGetIntegerv: + */ +#define OSMESA_WIDTH 0x20 +#define OSMESA_HEIGHT 0x21 +#define OSMESA_FORMAT 0x22 +#define OSMESA_TYPE 0x23 +#define OSMESA_MAX_WIDTH 0x24 /* new in 4.0 */ +#define OSMESA_MAX_HEIGHT 0x25 /* new in 4.0 */ + + +typedef struct osmesa_context *OSMesaContext; + + +#if defined(__BEOS__) || defined(__QUICKDRAW__) +#pragma export on +#endif + + +/* + * Create an Off-Screen Mesa rendering context. The only attribute needed is + * an RGBA vs Color-Index mode flag. + * + * Input: format - one of OSMESA_COLOR_INDEX, OSMESA_RGBA, OSMESA_BGRA, + * OSMESA_ARGB, OSMESA_RGB, or OSMESA_BGR. + * sharelist - specifies another OSMesaContext with which to share + * display lists. NULL indicates no sharing. + * Return: an OSMesaContext or 0 if error + */ +GLAPI OSMesaContext GLAPIENTRY +OSMesaCreateContext( GLenum format, OSMesaContext sharelist ); + + + +/* + * Create an Off-Screen Mesa rendering context and specify desired + * size of depth buffer, stencil buffer and accumulation buffer. + * If you specify zero for depthBits, stencilBits, accumBits you + * can save some memory. + * + * New in Mesa 3.5 + */ +GLAPI OSMesaContext GLAPIENTRY +OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, + GLint accumBits, OSMesaContext sharelist); + + +/* + * Destroy an Off-Screen Mesa rendering context. + * + * Input: ctx - the context to destroy + */ +GLAPI void GLAPIENTRY +OSMesaDestroyContext( OSMesaContext ctx ); + + + +/* + * Bind an OSMesaContext to an image buffer. The image buffer is just a + * block of memory which the client provides. Its size must be at least + * as large as width*height*sizeof(type). Its address should be a multiple + * of 4 if using RGBA mode. + * + * Image data is stored in the order of glDrawPixels: row-major order + * with the lower-left image pixel stored in the first array position + * (ie. bottom-to-top). + * + * Since the only type initially supported is GL_UNSIGNED_BYTE, if the + * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA + * value. If the context is in color indexed mode, each pixel will be + * stored as a 1-byte value. + * + * If the context's viewport hasn't been initialized yet, it will now be + * initialized to (0,0,width,height). + * + * Input: ctx - the rendering context + * buffer - the image buffer memory + * type - data type for pixel components, only GL_UNSIGNED_BYTE + * supported now + * width, height - size of image buffer in pixels, at least 1 + * Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx, + * invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1, + * width>internal limit or height>internal limit. + */ +GLAPI GLboolean GLAPIENTRY +OSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type, + GLsizei width, GLsizei height ); + + + + +/* + * Return the current Off-Screen Mesa rendering context handle. + */ +GLAPI OSMesaContext GLAPIENTRY +OSMesaGetCurrentContext( void ); + + + +/* + * Set pixel store/packing parameters for the current context. + * This is similar to glPixelStore. + * Input: pname - OSMESA_ROW_LENGTH + * specify actual pixels per row in image buffer + * 0 = same as image width (default) + * OSMESA_Y_UP + * zero = Y coordinates increase downward + * non-zero = Y coordinates increase upward (default) + * value - the value for the parameter pname + * + * New in version 2.0. + */ +GLAPI void GLAPIENTRY +OSMesaPixelStore( GLint pname, GLint value ); + + + +/* + * Return an integer value like glGetIntegerv. + * Input: pname - + * OSMESA_WIDTH return current image width + * OSMESA_HEIGHT return current image height + * OSMESA_FORMAT return image format + * OSMESA_TYPE return color component data type + * OSMESA_ROW_LENGTH return row length in pixels + * OSMESA_Y_UP returns 1 or 0 to indicate Y axis direction + * value - pointer to integer in which to return result. + */ +GLAPI void GLAPIENTRY +OSMesaGetIntegerv( GLint pname, GLint *value ); + + + +/* + * Return the depth buffer associated with an OSMesa context. + * Input: c - the OSMesa context + * Output: width, height - size of buffer in pixels + * bytesPerValue - bytes per depth value (2 or 4) + * buffer - pointer to depth buffer values + * Return: GL_TRUE or GL_FALSE to indicate success or failure. + * + * New in Mesa 2.4. + */ +GLAPI GLboolean GLAPIENTRY +OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, + GLint *bytesPerValue, void **buffer ); + + + +/* + * Return the color buffer associated with an OSMesa context. + * Input: c - the OSMesa context + * Output: width, height - size of buffer in pixels + * format - buffer format (OSMESA_FORMAT) + * buffer - pointer to depth buffer values + * Return: GL_TRUE or GL_FALSE to indicate success or failure. + * + * New in Mesa 3.3. + */ +GLAPI GLboolean GLAPIENTRY +OSMesaGetColorBuffer( OSMesaContext c, GLint *width, GLint *height, + GLint *format, void **buffer ); + + + +/* + * Return pointer to the named function. + * + * New in Mesa 4.1 + */ +GLAPI void * GLAPIENTRY +OSMesaGetProcAddress( const char *funcName ); + + +#if defined(__BEOS__) || defined(__QUICKDRAW__) +#pragma export off +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/reactos/lib/mesa32/include/GL/svgamesa.h b/reactos/lib/mesa32/include/GL/svgamesa.h new file mode 100644 index 00000000000..67c0e4c5c65 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/svgamesa.h @@ -0,0 +1,97 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * Copyright (C) 1995-2001 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* + * SVGA/Mesa interface for Linux. + */ + + +/* + * Intro to using the VGA/Mesa interface + * + * 1. #include the file + * 2. Call vga_init() to initialize the SVGA library. + * 3. Call vga_setmode() to specify the screen size and color depth. + * 4. Call SVGAMesaCreateContext() to setup a Mesa context. If using 8-bit + * color Mesa assumes color index mode, if using 16-bit or deeper color + * Mesa assumes RGB mode. + * 5. Call SVGAMesaMakeCurrent() to activate the Mesa context. + * 6. You can now use the Mesa API functions. + * 7. Before exiting, call SVGAMesaDestroyContext() then vga_setmode(TEXT) + * to restore the original text screen. + * + * Notes + * 1. You must run your executable as root (or use the set UID-bit) because + * the SVGA library requires it. + * 2. The SVGA driver is not fully implemented yet. See svgamesa.c for what + * has to be done yet. + */ + + +#ifndef SVGAMESA_H +#define SVGAMESA_H + + +#define SVGAMESA_MAJOR_VERSION 4 +#define SVGAMESA_MINOR_VERSION 0 + + +#ifdef __cplusplus +extern "C" { +#endif + + +#include "GL/gl.h" + + + +/* + * This is the SVGAMesa context 'handle': + */ +typedef struct svgamesa_context *SVGAMesaContext; + + + +/* + * doubleBuffer flag new in version 2.4 + */ +extern int SVGAMesaInit( int GraphMode ); + +extern int SVGAMesaClose( void ); + +extern SVGAMesaContext SVGAMesaCreateContext( GLboolean doubleBuffer ); + +extern void SVGAMesaDestroyContext( SVGAMesaContext ctx ); + +extern void SVGAMesaMakeCurrent( SVGAMesaContext ctx ); + +extern void SVGAMesaSwapBuffers( void ); + +extern void SVGAMesaSetCI(int ndx, GLubyte red, GLubyte green, GLubyte blue); + +extern SVGAMesaContext SVGAMesaGetCurrentContext( void ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/reactos/lib/mesa32/include/GL/uglglutshapes.h b/reactos/lib/mesa32/include/GL/uglglutshapes.h new file mode 100644 index 00000000000..28192de2d52 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/uglglutshapes.h @@ -0,0 +1,45 @@ +/* uglglutshapes.h - Public header GLUT Shapes */ + +/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */ + +/* This program is freely distributable without licensing fees and is + provided without guarantee or warrantee expressed or implied. This + program is -not- in the public domain. */ + +#ifndef GLUTSHAPES_H +#define GLUTSHAPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void glutWireSphere (GLdouble radius, GLint slices, GLint stacks); +void glutSolidSphere (GLdouble radius, GLint slices, GLint stacks); +void glutWireCone (GLdouble base, GLdouble height, + GLint slices, GLint stacks); +void glutSolidCone (GLdouble base, GLdouble height, + GLint slices, GLint stacks); +void glutWireCube (GLdouble size); +void glutSolidCube (GLdouble size); +void glutWireTorus (GLdouble innerRadius, GLdouble outerRadius, + GLint sides, GLint rings); +void glutSolidTorus (GLdouble innerRadius, GLdouble outerRadius, + GLint sides, GLint rings); +void glutWireDodecahedron (void); +void glutSolidDodecahedron (void); +void glutWireOctahedron (void); +void glutSolidOctahedron (void); +void glutWireTetrahedron (void); +void glutSolidTetrahedron (void); +void glutWireIcosahedron (void); +void glutSolidIcosahedron (void); +void glutWireTeapot (GLdouble size); +void glutSolidTeapot (GLdouble size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/lib/mesa32/include/GL/uglmesa.h b/reactos/lib/mesa32/include/GL/uglmesa.h new file mode 100644 index 00000000000..7ef5843504e --- /dev/null +++ b/reactos/lib/mesa32/include/GL/uglmesa.h @@ -0,0 +1,155 @@ +/* uglmesa.h - Public header UGL/Mesa */ + +/* Copyright (C) 2001 by Wind River Systems, Inc */ + +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * The MIT License + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * Author: + * Stephane Raimbault + */ + +#ifndef UGLMESA_H +#define UGLMESA_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define UGL_MESA_MAJOR_VERSION 4 +#define UGL_MESA_MINOR_VERSION 0 + +#include +#include + +/* + * Values for display mode of uglMesaCreateContext () + */ + +/* + * With these mask values, it's possible to test double buffer mode + * with UGL_MESA_DOUBLE mask + * + * SINGLE 0000 0001 + * DOUBLE 0000 0110 + * - SOFT 0000 0010 + * - HARD 0000 0100 + * WINDML 0001 0000 + * + * + */ +#define UGL_MESA_SINGLE 0x01 +#define UGL_MESA_DOUBLE 0x06 +#define UGL_MESA_DOUBLE_SOFTWARE 0x02 +#define UGL_MESA_DOUBLE_HARDWARE 0x04 + +#define UGL_MESA_WINDML_EXCLUSIVE 0x10 + +#define UGL_MESA_FULLSCREEN_WIDTH 0x0 +#define UGL_MESA_FULLSCREEN_HEIGHT 0x0 + +/* + * uglMesaPixelStore() parameters: + */ + +#define UGL_MESA_ROW_LENGTH 0x20 +#define UGL_MESA_Y_UP 0x21 + +/* + * Accepted by uglMesaGetIntegerv: + */ + +#define UGL_MESA_LEFT_X 0x01 +#define UGL_MESA_TOP_Y 0x02 +#define UGL_MESA_WIDTH 0x03 +#define UGL_MESA_HEIGHT 0x04 +#define UGL_MESA_DISPLAY_WIDTH 0x05 +#define UGL_MESA_DISPLAY_HEIGHT 0x06 +#define UGL_MESA_COLOR_FORMAT 0x07 +#define UGL_MESA_COLOR_MODEL 0x08 +#define UGL_MESA_PIXEL_FORMAT 0x09 +#define UGL_MESA_TYPE 0x0A +#define UGL_MESA_RGB 0x0B +#define UGL_MESA_COLOR_INDEXED 0x0C +#define UGL_MESA_SINGLE_BUFFER 0x0D +#define UGL_MESA_DOUBLE_BUFFER 0x0E +#define UGL_MESA_DOUBLE_BUFFER_SOFTWARE 0x0F +#define UGL_MESA_DOUBLE_BUFFER_HARDWARE 0x10 + +/* + * typedefs + */ + +typedef struct uglMesaContext * UGL_MESA_CONTEXT; + +UGL_MESA_CONTEXT uglMesaCreateNewContext (GLenum mode, + UGL_MESA_CONTEXT share_list); + +UGL_MESA_CONTEXT uglMesaCreateNewContextExt (GLenum mode, + GLint depth_bits, + GLint stencil_bits, + GLint accum_red_bits, + GLint accum_green_bits, + GLint accum_blue_bits, + GLint accum_alpha_bits, + UGL_MESA_CONTEXT share_list); + +GLboolean uglMesaMakeCurrentContext (UGL_MESA_CONTEXT umc, + GLsizei left, GLsizei top, + GLsizei width, GLsizei height); + +GLboolean uglMesaMoveWindow (GLsizei dx, GLsizei dy); + +GLboolean uglMesaMoveToWindow (GLsizei left, GLsizei top); + +GLboolean uglMesaResizeWindow (GLsizei dw, GLsizei dh); + +GLboolean uglMesaResizeToWindow (GLsizei width, GLsizei height); + +void uglMesaDestroyContext (void); + +UGL_MESA_CONTEXT uglMesaGetCurrentContext (void); + +void uglMesaSwapBuffers (void); + +void uglMesaPixelStore (GLint pname, GLint value); + +void uglMesaGetIntegerv (GLint pname, GLint *value); + +GLboolean uglMesaGetDepthBuffer (GLint *width, GLint *height, + GLint *bytesPerValue, void **buffer); + +GLboolean uglMesaGetColorBuffer (GLint *width, GLint *height, + GLint *format, void **buffer); + +GLboolean uglMesaSetColor (GLubyte index, GLfloat red, + GLfloat green, GLfloat blue); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/reactos/lib/mesa32/include/GL/vms_x_fix.h b/reactos/lib/mesa32/include/GL/vms_x_fix.h new file mode 100644 index 00000000000..db754f65563 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/vms_x_fix.h @@ -0,0 +1,880 @@ +/*************************************************************************** + * * + * Repair definitions of Xlib when compileing with /name=(as_is) on VMS * + * * + * Author : Jouk Jansen (joukj@hrem.stm.tudelft.nl) * + * * + * Last revision : 22 August 2000 * + * * + ***************************************************************************/ + +#ifndef VMS_X_FIX +#define VMS_X_FIX + +#define _XRegisterFilterByType _XREGISTERFILTERBYTYPE +#define XAllocClassHint XALLOCCLASSHINT +#define XAllocColor XALLOCCOLOR +#define XAllocColorCells XALLOCCOLORCELLS +#define XAllocSizeHints XALLOCSIZEHINTS +#define XAllocWMHints XALLOCWMHINTS +#define XAutoRepeatOff XAUTOREPEATOFF +#define XAutoRepeatOn XAUTOREPEATON +#define XBaseFontNameListOfFontSet XBASEFONTNAMELISTOFFONTSET +#define XBell XBELL +#define XBitmapPad XBITMAPPAD +#define XChangeActivePointerGrab XCHANGEACTIVEPOINTERGRAB +#define XChangeGC XCHANGEGC +#define XChangeProperty XCHANGEPROPERTY +#define XChangeWindowAttributes XCHANGEWINDOWATTRIBUTES +#define XCheckIfEvent XCHECKIFEVENT +#define XCheckMaskEvent XCHECKMASKEVENT +#define XCheckTypedWindowEvent XCHECKTYPEDWINDOWEVENT +#define XCheckWindowEvent XCHECKWINDOWEVENT +#define XClearArea XCLEARAREA +#define XClearWindow XCLEARWINDOW +#define XClipBox XCLIPBOX +#define XCloseDisplay XCLOSEDISPLAY +#define XCloseIM XCLOSEIM +#define XConfigureWindow XCONFIGUREWINDOW +#define XConvertSelection XCONVERTSELECTION +#define XCopyArea XCOPYAREA +#define XCopyGC XCOPYGC +#define XCopyPlane XCOPYPLANE +#define XCreateBitmapFromData XCREATEBITMAPFROMDATA +#define XCreateColormap XCREATECOLORMAP +#define XCreateFontCursor XCREATEFONTCURSOR +#define XCreateFontSet XCREATEFONTSET +#define XCreateGC XCREATEGC +#define XCreateIC XCREATEIC +#define XCreateImage XCREATEIMAGE +#define XCreatePixmap XCREATEPIXMAP +#define XCreatePixmapCursor XCREATEPIXMAPCURSOR +#define XCreatePixmapFromBitmapData XCREATEPIXMAPFROMBITMAPDATA +#define XCreateRegion XCREATEREGION +#define XCreateSimpleWindow XCREATESIMPLEWINDOW +#define XCreateWindow XCREATEWINDOW +#define XDefaultScreenOfDisplay XDEFAULTSCREENOFDISPLAY +#define XDefineCursor XDEFINECURSOR +#define XDeleteProperty XDELETEPROPERTY +#define XDestroyIC XDESTROYIC +#define XDestroyRegion XDESTROYREGION +#define XDestroyWindow XDESTROYWINDOW +#define XDisplayName XDISPLAYNAME +#define XDisplayOfScreen XDISPLAYOFSCREEN +#define XDrawArc XDRAWARC +#define XDrawImageString XDRAWIMAGESTRING +#define XDrawImageString16 XDRAWIMAGESTRING16 +#define XDrawLine XDRAWLINE +#define XDrawLines XDRAWLINES +#define XDrawPoint XDRAWPOINT +#define XDrawPoints XDRAWPOINTS +#define XDrawRectangle XDRAWRECTANGLE +#define XDrawSegments XDRAWSEGMENTS +#define XDrawString XDRAWSTRING +#define XDrawString16 XDRAWSTRING16 +#define XEmptyRegion XEMPTYREGION +#define XEqualRegion XEQUALREGION +#define XEventsQueued XEVENTSQUEUED +#define XExtentsOfFontSet XEXTENTSOFFONTSET +#define XFillArc XFILLARC +#define XFillPolygon XFILLPOLYGON +#define XFillRectangle XFILLRECTANGLE +#define XFillRectangles XFILLRECTANGLES +#define XFilterEvent XFILTEREVENT +#define XFlush XFLUSH +#define XFontsOfFontSet XFONTSOFFONTSET +#define XFree XFREE +#define XFreeColormap XFREECOLORMAP +#define XFreeColors XFREECOLORS +#define XFreeCursor XFREECURSOR +#define XFreeFont XFREEFONT +#define XFreeFontInfo XFREEFONTINFO +#define XFreeFontNames XFREEFONTNAMES +#define XFreeFontSet XFREEFONTSET +#define XFreeGC XFREEGC +#define XFreeModifiermap XFREEMODIFIERMAP +#define XFreePixmap XFREEPIXMAP +#define XFreeStringList XFREESTRINGLIST +#define XGetAtomName XGETATOMNAME +#define XGetDefault XGETDEFAULT +#define XGetErrorDatabaseText XGETERRORDATABASETEXT +#define XGetErrorText XGETERRORTEXT +#define XGetFontProperty XGETFONTPROPERTY +#define XGetGCValues XGETGCVALUES +#define XGetGeometry XGETGEOMETRY +#define XGetICValues XGETICVALUES +#define XGetIMValues XGETIMVALUES +#define XGetImage XGETIMAGE +#define XGetKeyboardControl XGETKEYBOARDCONTROL +#define XGetModifierMapping XGETMODIFIERMAPPING +#define XGetMotionEvents XGETMOTIONEVENTS +#define XGetNormalHints XGETNORMALHINTS +#define XGetSelectionOwner XGETSELECTIONOWNER +#define XGetSubImage XGETSUBIMAGE +#define XGetVisualInfo XGETVISUALINFO +#define XGetWMColormapWindows XGETWMCOLORMAPWINDOWS +#define XGetWMHints XGETWMHINTS +#define XGetWMName XGETWMNAME +#define XGetWMNormalHints XGETWMNORMALHINTS +#define XGetWindowAttributes XGETWINDOWATTRIBUTES +#define XGetWindowProperty XGETWINDOWPROPERTY +#define XGrabKeyboard XGRABKEYBOARD +#define XGrabPointer XGRABPOINTER +#define XGrabServer XGRABSERVER +#define XHeightOfScreen XHEIGHTOFSCREEN +#define XIfEvent XIFEVENT +#define XInternAtom XINTERNATOM +#define XIntersectRegion XINTERSECTREGION +#define XKeycodeToKeysym XKEYCODETOKEYSYM +#define XKeysymToKeycode XKEYSYMTOKEYCODE +#define XKeysymToString XKEYSYMTOSTRING +#define XListFonts XLISTFONTS +#define XListFontsWithInfo XLISTFONTSWITHINFO +#define XListPixmapFormats XLISTPIXMAPFORMATS +#define XListProperties XLISTPROPERTIES +#define XLoadQueryFont XLOADQUERYFONT +#define XLookupString XLOOKUPSTRING +#define XLowerWindow XLOWERWINDOW +#define XMapRaised XMAPRAISED +#define XMapWindow XMAPWINDOW +#define XMatchVisualInfo XMATCHVISUALINFO +#define XMoveResizeWindow XMOVERESIZEWINDOW +#define XMoveWindow XMOVEWINDOW +#define XNextEvent XNEXTEVENT +#define XOffsetRegion XOFFSETREGION +#define XOpenDisplay XOPENDISPLAY +#define XOpenIM XOPENIM +#define XParseColor XPARSECOLOR +#define XParseGeometry XPARSEGEOMETRY +#define XPeekEvent XPEEKEVENT +#define XPending XPENDING +#define XPointInRegion XPOINTINREGION +#define XPolygonRegion XPOLYGONREGION +#define XPutBackEvent XPUTBACKEVENT +#define XPutImage XPUTIMAGE +#define XQueryColor XQUERYCOLOR +#define XQueryColors XQUERYCOLORS +#define XQueryExtension XQUERYEXTENSION +#define XQueryPointer XQUERYPOINTER +#define XQueryTree XQUERYTREE +#define XRaiseWindow XRAISEWINDOW +#define XReconfigureWMWindow XRECONFIGUREWMWINDOW +#define XRectInRegion XRECTINREGION +#define XRefreshKeyboardMapping XREFRESHKEYBOARDMAPPING +#define XReparentWindow XREPARENTWINDOW +#define XResizeWindow XRESIZEWINDOW +#define XRestackWindows XRESTACKWINDOWS +#define XRootWindowOfScreen XROOTWINDOWOFSCREEN +#define XScreenNumberOfScreen XSCREENNUMBEROFSCREEN +#define XSelectAsyncEvent XSELECTASYNCEVENT +#define XSelectAsyncInput XSELECTASYNCINPUT +#define XSelectInput XSELECTINPUT +#define XSendEvent XSENDEVENT +#define XServerVendor XSERVERVENDOR +#define XSetBackground XSETBACKGROUND +#define XSetClassHint XSETCLASSHINT +#define XSetClipMask XSETCLIPMASK +#define XSetClipOrigin XSETCLIPORIGIN +#define XSetClipRectangles XSETCLIPRECTANGLES +#define XSetCloseDownMode XSETCLOSEDOWNMODE +#define XSetCommand XSETCOMMAND +#define XSetDashes XSETDASHES +#define XSetErrorHandler XSETERRORHANDLER +#define XSetFillStyle XSETFILLSTYLE +#define XSetFont XSETFONT +#define XSetForeground XSETFOREGROUND +#define XSetFunction XSETFUNCTION +#define XSetGraphicsExposures XSETGRAPHICSEXPOSURES +#define XSetICFocus XSETICFOCUS +#define XSetICValues XSETICVALUES +#define XSetIOErrorHandler XSETIOERRORHANDLER +#define XSetInputFocus XSETINPUTFOCUS +#define XSetLineAttributes XSETLINEATTRIBUTES +#define XSetLocaleModifiers XSETLOCALEMODIFIERS +#define XSetNormalHints XSETNORMALHINTS +#define XSetRegion XSETREGION +#define XSetSelectionOwner XSETSELECTIONOWNER +#define XSetStipple XSETSTIPPLE +#define XSetSubwindowMode XSETSUBWINDOWMODE +#define XSetTSOrigin XSETTSORIGIN +#define XSetTile XSETTILE +#define XSetTransientForHint XSETTRANSIENTFORHINT +#define XSetWMColormapWindows XSETWMCOLORMAPWINDOWS +#define XSetWMHints XSETWMHINTS +#define XSetWMIconName XSETWMICONNAME +#define XSetWMName XSETWMNAME +#define XSetWMNormalHints XSETWMNORMALHINTS +#define XSetWMProperties XSETWMPROPERTIES +#define XSetWMProtocols XSETWMPROTOCOLS +#define XSetWindowBackground XSETWINDOWBACKGROUND +#define XSetWindowBackgroundPixmap XSETWINDOWBACKGROUNDPIXMAP +#define XSetWindowColormap XSETWINDOWCOLORMAP +#define XShapeCombineMask XSHAPECOMBINEMASK +#define XShapeCombineRectangles XSHAPECOMBINERECTANGLES +#define XShapeGetRectangles XSHAPEGETRECTANGLES +#define XShrinkRegion XSHRINKREGION +#define XStoreColor XSTORECOLOR +#define XStoreColors XSTORECOLORS +#define XStoreName XSTORENAME +#define XStringToKeysym XSTRINGTOKEYSYM +#define XSubtractRegion XSUBTRACTREGION +#define XSupportsLocale XSUPPORTSLOCALE +#define XSync XSYNC +#define XSynchronize XSYNCHRONIZE +#define XTextExtents XTEXTEXTENTS +#define XTextExtents16 XTEXTEXTENTS16 +#define XTextWidth XTEXTWIDTH +#define XTextWidth16 XTEXTWIDTH16 +#define XTranslateCoordinates XTRANSLATECOORDINATES +#define XUndefineCursor XUNDEFINECURSOR +#define XUngrabKeyboard XUNGRABKEYBOARD +#define XUngrabPointer XUNGRABPOINTER +#define XUngrabServer XUNGRABSERVER +#define XUnionRectWithRegion XUNIONRECTWITHREGION +#define XUnionRegion XUNIONREGION +#define XUnmapWindow XUNMAPWINDOW +#define _XUnregisterFilter _XUNREGISTERFILTER +#define XUnsetICFocus XUNSETICFOCUS +#define XVaCreateNestedList XVACREATENESTEDLIST +#define XVisualIDFromVisual XVISUALIDFROMVISUAL +#define XWidthOfScreen XWIDTHOFSCREEN +#define XWindowEvent XWINDOWEVENT +#define XWithdrawWindow XWITHDRAWWINDOW +#define XXorRegion XXORREGION +#define XmAddProtocolCallback XMADDPROTOCOLCALLBACK +#define XmAddProtocols XMADDPROTOCOLS +#define XmChangeColor XMCHANGECOLOR +#define XmClipboardCopy XMCLIPBOARDCOPY +#define XmClipboardEndCopy XMCLIPBOARDENDCOPY +#define XmClipboardInquireLength XMCLIPBOARDINQUIRELENGTH +#define XmClipboardLock XMCLIPBOARDLOCK +#define XmClipboardRetrieve XMCLIPBOARDRETRIEVE +#define XmClipboardStartCopy XMCLIPBOARDSTARTCOPY +#define XmClipboardUnlock XMCLIPBOARDUNLOCK +#define XmCreateArrowButton XMCREATEARROWBUTTON +#define XmCreateArrowButtonGadget XMCREATEARROWBUTTONGADGET +#define XmCreateCascadeButton XMCREATECASCADEBUTTON +#define XmCreateDialogShell XMCREATEDIALOGSHELL +#define XmCreateDragIcon XMCREATEDRAGICON +#define XmCreateDrawingArea XMCREATEDRAWINGAREA +#define XmCreateDrawnButton XMCREATEDRAWNBUTTON +#define XmCreateFileSelectionBox XMCREATEFILESELECTIONBOX +#define XmCreateFileSelectionDialog XMCREATEFILESELECTIONDIALOG +#define XmCreateForm XMCREATEFORM +#define XmCreateFormDialog XMCREATEFORMDIALOG +#define XmCreateFrame XMCREATEFRAME +#define XmCreateInformationDialog XMCREATEINFORMATIONDIALOG +#define XmCreateLabelGadget XMCREATELABELGADGET +#define XmCreateMainWindow XMCREATEMAINWINDOW +#define XmCreateMenuBar XMCREATEMENUBAR +#define XmCreateMessageBox XMCREATEMESSAGEBOX +#define XmCreateMessageDialog XMCREATEMESSAGEDIALOG +#define XmCreateOptionMenu XMCREATEOPTIONMENU +#define XmCreatePanedWindow XMCREATEPANEDWINDOW +#define XmCreatePopupMenu XMCREATEPOPUPMENU +#define XmCreatePromptDialog XMCREATEPROMPTDIALOG +#define XmCreatePulldownMenu XMCREATEPULLDOWNMENU +#define XmCreatePushButton XMCREATEPUSHBUTTON +#define XmCreatePushButtonGadget XMCREATEPUSHBUTTONGADGET +#define XmCreateQuestionDialog XMCREATEQUESTIONDIALOG +#define XmCreateRadioBox XMCREATERADIOBOX +#define XmCreateRowColumn XMCREATEROWCOLUMN +#define XmCreateScale XMCREATESCALE +#define XmCreateScrollBar XMCREATESCROLLBAR +#define XmCreateScrolledList XMCREATESCROLLEDLIST +#define XmCreateScrolledText XMCREATESCROLLEDTEXT +#define XmCreateScrolledWindow XMCREATESCROLLEDWINDOW +#define XmCreateSelectionDialog XMCREATESELECTIONDIALOG +#define XmCreateSeparator XMCREATESEPARATOR +#define XmCreateSeparatorGadget XMCREATESEPARATORGADGET +#define XmCreateTemplateDialog XMCREATETEMPLATEDIALOG +#define XmCreateText XMCREATETEXT +#define XmCreateTextField XMCREATETEXTFIELD +#define XmCreateToggleButton XMCREATETOGGLEBUTTON +#define XmCreateToggleButtonGadget XMCREATETOGGLEBUTTONGADGET +#define XmDragStart XMDRAGSTART +#define XmDropSiteRegister XMDROPSITEREGISTER +#define XmDropSiteUnregister XMDROPSITEUNREGISTER +#define XmDropSiteUpdate XMDROPSITEUPDATE +#define XmDropTransferStart XMDROPTRANSFERSTART +#define XmFileSelectionBoxGetChild XMFILESELECTIONBOXGETCHILD +#define XmFileSelectionDoSearch XMFILESELECTIONDOSEARCH +#define XmFontListAppendEntry XMFONTLISTAPPENDENTRY +#define XmFontListCopy XMFONTLISTCOPY +#define XmFontListCreate XMFONTLISTCREATE +#define XmFontListEntryCreate XMFONTLISTENTRYCREATE +#define XmFontListEntryFree XMFONTLISTENTRYFREE +#define XmFontListEntryGetFont XMFONTLISTENTRYGETFONT +#define XmFontListEntryGetTag XMFONTLISTENTRYGETTAG +#define XmFontListEntryLoad XMFONTLISTENTRYLOAD +#define XmFontListFree XMFONTLISTFREE +#define XmFontListFreeFontContext XMFONTLISTFREEFONTCONTEXT +#define XmFontListGetNextFont XMFONTLISTGETNEXTFONT +#define XmFontListInitFontContext XMFONTLISTINITFONTCONTEXT +#define XmFontListNextEntry XMFONTLISTNEXTENTRY +#define XmGetColors XMGETCOLORS +#define XmGetFocusWidget XMGETFOCUSWIDGET +#define XmGetMenuCursor XMGETMENUCURSOR +#define XmGetPixmapByDepth XMGETPIXMAPBYDEPTH +#define XmGetTearOffControl XMGETTEAROFFCONTROL +#define XmGetXmDisplay XMGETXMDISPLAY +#define XmImMbLookupString XMIMMBLOOKUPSTRING +#define XmImRegister XMIMREGISTER +#define XmImSetFocusValues XMIMSETFOCUSVALUES +#define XmImSetValues XMIMSETVALUES +#define XmImUnregister XMIMUNREGISTER +#define XmImUnsetFocus XMIMUNSETFOCUS +#define XmInternAtom XMINTERNATOM +#define XmIsMotifWMRunning XMISMOTIFWMRUNNING +#define XmListAddItem XMLISTADDITEM +#define XmListAddItemUnselected XMLISTADDITEMUNSELECTED +#define XmListAddItemsUnselected XMLISTADDITEMSUNSELECTED +#define XmListDeleteAllItems XMLISTDELETEALLITEMS +#define XmListDeleteItemsPos XMLISTDELETEITEMSPOS +#define XmListDeletePos XMLISTDELETEPOS +#define XmListDeselectAllItems XMLISTDESELECTALLITEMS +#define XmListDeselectPos XMLISTDESELECTPOS +#define XmListGetKbdItemPos XMLISTGETKBDITEMPOS +#define XmListGetMatchPos XMLISTGETMATCHPOS +#define XmListGetSelectedPos XMLISTGETSELECTEDPOS +#define XmListPosSelected XMLISTPOSSELECTED +#define XmListSelectItem XMLISTSELECTITEM +#define XmListSelectPos XMLISTSELECTPOS +#define XmListSetBottomPos XMLISTSETBOTTOMPOS +#define XmListSetItem XMLISTSETITEM +#define XmListSetKbdItemPos XMLISTSETKBDITEMPOS +#define XmListSetPos XMLISTSETPOS +#define XmMainWindowSetAreas XMMAINWINDOWSETAREAS +#define XmMenuPosition XMMENUPOSITION +#define XmMessageBoxGetChild XMMESSAGEBOXGETCHILD +#define XmOptionButtonGadget XMOPTIONBUTTONGADGET +#define XmOptionLabelGadget XMOPTIONLABELGADGET +#define XmProcessTraversal XMPROCESSTRAVERSAL +#define XmQmotif XMQMOTIF +#define XmRemoveProtocolCallback XMREMOVEPROTOCOLCALLBACK +#define XmRepTypeGetId XMREPTYPEGETID +#define XmRepTypeGetRecord XMREPTYPEGETRECORD +#define XmRepTypeRegister XMREPTYPEREGISTER +#define XmRepTypeValidValue XMREPTYPEVALIDVALUE +#define XmScrollBarSetValues XMSCROLLBARSETVALUES +#define XmScrolledWindowSetAreas XMSCROLLEDWINDOWSETAREAS +#define XmSelectionBoxGetChild XMSELECTIONBOXGETCHILD +#define XmStringByteCompare XMSTRINGBYTECOMPARE +#define XmStringCompare XMSTRINGCOMPARE +#define XmStringConcat XMSTRINGCONCAT +#define XmStringCopy XMSTRINGCOPY +#define XmStringCreate XMSTRINGCREATE +#define XmStringCreateLocalized XMSTRINGCREATELOCALIZED +#define XmStringCreateLtoR XMSTRINGCREATELTOR +#define XmStringCreateSimple XMSTRINGCREATESIMPLE +#define XmStringDraw XMSTRINGDRAW +#define XmStringDrawUnderline XMSTRINGDRAWUNDERLINE +#define XmStringExtent XMSTRINGEXTENT +#define XmStringFree XMSTRINGFREE +#define XmStringFreeContext XMSTRINGFREECONTEXT +#define XmStringGetLtoR XMSTRINGGETLTOR +#define XmStringGetNextComponent XMSTRINGGETNEXTCOMPONENT +#define XmStringGetNextSegment XMSTRINGGETNEXTSEGMENT +#define XmStringInitContext XMSTRINGINITCONTEXT +#define XmStringLength XMSTRINGLENGTH +#define XmStringLtoRCreate XMSTRINGLTORCREATE +#define XmStringNConcat XMSTRINGNCONCAT +#define XmStringSegmentCreate XMSTRINGSEGMENTCREATE +#define XmStringWidth XMSTRINGWIDTH +#define XmTextClearSelection XMTEXTCLEARSELECTION +#define XmTextFieldGetEditable XMTEXTFIELDGETEDITABLE +#define XmTextFieldGetInsertionPosition XMTEXTFIELDGETINSERTIONPOSITION +#define XmTextFieldGetLastPosition XMTEXTFIELDGETLASTPOSITION +#define XmTextFieldGetSelection XMTEXTFIELDGETSELECTION +#define XmTextFieldGetString XMTEXTFIELDGETSTRING +#define XmTextFieldInsert XMTEXTFIELDINSERT +#define XmTextFieldRemove XMTEXTFIELDREMOVE +#define XmTextFieldSetSelection XMTEXTFIELDSETSELECTION +#define XmTextFieldSetString XMTEXTFIELDSETSTRING +#define XmTextGetCursorPosition XMTEXTGETCURSORPOSITION +#define XmTextGetInsertionPosition XMTEXTGETINSERTIONPOSITION +#define XmTextGetLastPosition XMTEXTGETLASTPOSITION +#define XmTextGetMaxLength XMTEXTGETMAXLENGTH +#define XmTextGetSelection XMTEXTGETSELECTION +#define XmTextGetSelectionPosition XMTEXTGETSELECTIONPOSITION +#define XmTextGetString XMTEXTGETSTRING +#define XmTextInsert XMTEXTINSERT +#define XmTextRemove XMTEXTREMOVE +#define XmTextReplace XMTEXTREPLACE +#define XmTextSetCursorPosition XMTEXTSETCURSORPOSITION +#define XmTextSetHighlight XMTEXTSETHIGHLIGHT +#define XmTextSetInsertionPosition XMTEXTSETINSERTIONPOSITION +#define XmTextSetSelection XMTEXTSETSELECTION +#define XmTextSetString XMTEXTSETSTRING +#define XmToggleButtonGadgetGetState XMTOGGLEBUTTONGADGETGETSTATE +#define XmToggleButtonGadgetSetState XMTOGGLEBUTTONGADGETSETSTATE +#define XmToggleButtonGetState XMTOGGLEBUTTONGETSTATE +#define XmToggleButtonSetState XMTOGGLEBUTTONSETSTATE +#define XmUpdateDisplay XMUPDATEDISPLAY +#define XmVaCreateSimpleRadioBox XMVACREATESIMPLERADIOBOX +#define XmbDrawString XMBDRAWSTRING +#define XmbLookupString XMBLOOKUPSTRING +#define XmbResetIC XMBRESETIC +#define XmbSetWMProperties XMBSETWMPROPERTIES +#define XmbTextEscapement XMBTEXTESCAPEMENT +#define XmbTextExtents XMBTEXTEXTENTS +#define XmbTextListToTextProperty XMBTEXTLISTTOTEXTPROPERTY +#define XmbTextPropertyToTextList XMBTEXTPROPERTYTOTEXTLIST +#define XmuClientWindow XMUCLIENTWINDOW +#define XmuPrintDefaultErrorMessage XMUPRINTDEFAULTERRORMESSAGE +#define XrmGetDatabase XRMGETDATABASE +#define XrmGetResource XRMGETRESOURCE +#define XrmPutStringResource XRMPUTSTRINGRESOURCE +#define XrmQuarkToString XRMQUARKTOSTRING +#define XrmStringToQuark XRMSTRINGTOQUARK +#define XtAddCallback XTADDCALLBACK +#define XtAddCallbacks XTADDCALLBACKS +#define XtAddEventHandler XTADDEVENTHANDLER +#define XtAddGrab XTADDGRAB +#define XtAllocateGC XTALLOCATEGC +#define XtAppAddActions XTAPPADDACTIONS +#define XtAppAddInput XTAPPADDINPUT +#define XtAppAddTimeOut XTAPPADDTIMEOUT +#define XtAppCreateShell XTAPPCREATESHELL +#define XtAppInitialize XTAPPINITIALIZE +#define XtAppNextEvent XTAPPNEXTEVENT +#define XtAppPeekEvent XTAPPPEEKEVENT +#define XtAppPending XTAPPPENDING +#define XtAppProcessEvent XTAPPPROCESSEVENT +#define XtAppSetErrorHandler XTAPPSETERRORHANDLER +#define XtAppSetFallbackResources XTAPPSETFALLBACKRESOURCES +#define XtAppSetWarningHandler XTAPPSETWARNINGHANDLER +#define XtAppSetWarningMsgHandler XTAPPSETWARNINGMSGHANDLER +#define XtAppWarning XTAPPWARNING +#define XtCallActionProc XTCALLACTIONPROC +#define XtCallCallbackList XTCALLCALLBACKLIST +#define XtCallCallbacks XTCALLCALLBACKS +#define XtConfigureWidget XTCONFIGUREWIDGET +#define XtConvertAndStore XTCONVERTANDSTORE +#define XtCreateApplicationContext XTCREATEAPPLICATIONCONTEXT +#define XtCreateManagedWidget XTCREATEMANAGEDWIDGET +#define XtCreatePopupShell XTCREATEPOPUPSHELL +#define XtCreateWidget XTCREATEWIDGET +#define XtDatabase XTDATABASE +#define XtDestroyWidget XTDESTROYWIDGET +#define XtDisownSelection XTDISOWNSELECTION +#define XtDispatchEvent XTDISPATCHEVENT +#define XtDisplayOfObject XTDISPLAYOFOBJECT +#define XtDisplayStringConvWarning XTDISPLAYSTRINGCONVWARNING +#define XtDisplayToApplicationContext XTDISPLAYTOAPPLICATIONCONTEXT +#define XtAppAddWorkProc XTAPPADDWORKPROC +#define XtRemoveWorkProc XTREMOVEWORKPROC +#define XtFree XTFREE +#define XtGetActionKeysym XTGETACTIONKEYSYM +#define XtGetActionList XTGETACTIONLIST +#define XtGetApplicationNameAndClass XTGETAPPLICATIONNAMEANDCLASS +#define XtGetApplicationResources XTGETAPPLICATIONRESOURCES +#define XtGetGC XTGETGC +#define XtGetMultiClickTime XTGETMULTICLICKTIME +#define XtGetSelectionValue XTGETSELECTIONVALUE +#define XtGetSelectionValues XTGETSELECTIONVALUES +#define XtGetSubresources XTGETSUBRESOURCES +#define XtGetValues XTGETVALUES +#define XtGrabKeyboard XTGRABKEYBOARD +#define XtGrabPointer XTGRABPOINTER +#define XtHasCallbacks XTHASCALLBACKS +#define XtInitializeWidgetClass XTINITIALIZEWIDGETCLASS +#define XtInsertEventHandler XTINSERTEVENTHANDLER +#define XtIsManaged XTISMANAGED +#define XtIsObject XTISOBJECT +#define XtIsSensitive XTISSENSITIVE +#define XtIsSubclass XTISSUBCLASS +#define XtLastTimestampProcessed XTLASTTIMESTAMPPROCESSED +#define XtMakeGeometryRequest XTMAKEGEOMETRYREQUEST +#define XtMakeResizeRequest XTMAKERESIZEREQUEST +#define XtMalloc XTMALLOC +#define XtManageChild XTMANAGECHILD +#define XtManageChildren XTMANAGECHILDREN +#define XtMergeArgLists XTMERGEARGLISTS +#define XtMoveWidget XTMOVEWIDGET +#define XtName XTNAME +#define XtNameToWidget XTNAMETOWIDGET +#define XtOpenDisplay XTOPENDISPLAY +#define XtOverrideTranslations XTOVERRIDETRANSLATIONS +#define XtOwnSelection XTOWNSELECTION +#define XtParseTranslationTable XTPARSETRANSLATIONTABLE +#define XtPopdown XTPOPDOWN +#define XtPopup XTPOPUP +#define XtQueryGeometry XTQUERYGEOMETRY +#define XtRealizeWidget XTREALIZEWIDGET +#define XtRealloc XTREALLOC +#define XtReleaseGC XTRELEASEGC +#define XtRemoveAllCallbacks XTREMOVEALLCALLBACKS +#define XtRemoveCallback XTREMOVECALLBACK +#define XtRemoveEventHandler XTREMOVEEVENTHANDLER +#define XtRemoveGrab XTREMOVEGRAB +#define XtRemoveInput XTREMOVEINPUT +#define XtRemoveTimeOut XTREMOVETIMEOUT +#define XtResizeWidget XTRESIZEWIDGET +#define XtResolvePathname XTRESOLVEPATHNAME +#define XtSetKeyboardFocus XTSETKEYBOARDFOCUS +#define XtSetMappedWhenManaged XTSETMAPPEDWHENMANAGED +#define XtSetSensitive XTSETSENSITIVE +#define XtSetTypeConverter XTSETTYPECONVERTER +#define XtSetValues XTSETVALUES +#define XtShellStrings XTSHELLSTRINGS +#define XtStrings XTSTRINGS +#define XtToolkitInitialize XTTOOLKITINITIALIZE +#define XtTranslateCoords XTTRANSLATECOORDS +#define XtTranslateKeycode XTTRANSLATEKEYCODE +#define XtUngrabKeyboard XTUNGRABKEYBOARD +#define XtUngrabPointer XTUNGRABPOINTER +#define XtUnmanageChild XTUNMANAGECHILD +#define XtUnmanageChildren XTUNMANAGECHILDREN +#define XtUnrealizeWidget XTUNREALIZEWIDGET +#define XtVaCreateManagedWidget XTVACREATEMANAGEDWIDGET +#define XtVaCreateWidget XTVACREATEWIDGET +#define XtVaGetValues XTVAGETVALUES +#define XtVaSetValues XTVASETVALUES +#define XtWarning XTWARNING +#define XtWidgetToApplicationContext XTWIDGETTOAPPLICATIONCONTEXT +#define XtWindowOfObject XTWINDOWOFOBJECT +#define XtWindowToWidget XTWINDOWTOWIDGET +#define XwcDrawString XWCDRAWSTRING +#define XwcFreeStringList XWCFREESTRINGLIST +#define XwcTextEscapement XWCTEXTESCAPEMENT +#define XwcTextExtents XWCTEXTEXTENTS +#define XwcTextListToTextProperty XWCTEXTLISTTOTEXTPROPERTY +#define XwcTextPropertyToTextList XWCTEXTPROPERTYTOTEXTLIST +#define _XmBottomShadowColorDefault _XMBOTTOMSHADOWCOLORDEFAULT +#define _XmClearBorder _XMCLEARBORDER +#define _XmConfigureObject _XMCONFIGUREOBJECT +#define _XmDestroyParentCallback _XMDESTROYPARENTCALLBACK +#define _XmDrawArrow _XMDRAWARROW +#define _XmDrawShadows _XMDRAWSHADOWS +#define _XmFontListGetDefaultFont _XMFONTLISTGETDEFAULTFONT +#define _XmFromHorizontalPixels _XMFROMHORIZONTALPIXELS +#define _XmFromVerticalPixels _XMFROMVERTICALPIXELS +#define _XmGetClassExtensionPtr _XMGETCLASSEXTENSIONPTR +#define _XmGetDefaultFontList _XMGETDEFAULTFONTLIST +#define _XmGetTextualDragIcon _XMGETTEXTUALDRAGICON +#define _XmGetWidgetExtData _XMGETWIDGETEXTDATA +#define _XmGrabKeyboard _XMGRABKEYBOARD +#define _XmGrabPointer _XMGRABPOINTER +#define _XmInheritClass _XMINHERITCLASS +#define _XmInputInGadget _XMINPUTINGADGET +#define _XmMakeGeometryRequest _XMMAKEGEOMETRYREQUEST +#define _XmMenuPopDown _XMMENUPOPDOWN +#define _XmMoveObject _XMMOVEOBJECT +#define _XmNavigChangeManaged _XMNAVIGCHANGEMANAGED +#define _XmOSBuildFileList _XMOSBUILDFILELIST +#define _XmOSFileCompare _XMOSFILECOMPARE +#define _XmOSFindPatternPart _XMOSFINDPATTERNPART +#define _XmOSQualifyFileSpec _XMOSQUALIFYFILESPEC +#define _XmPostPopupMenu _XMPOSTPOPUPMENU +#define _XmPrimitiveEnter _XMPRIMITIVEENTER +#define _XmPrimitiveLeave _XMPRIMITIVELEAVE +#define _XmRedisplayGadgets _XMREDISPLAYGADGETS +#define _XmShellIsExclusive _XMSHELLISEXCLUSIVE +#define _XmStringDraw _XMSTRINGDRAW +#define _XmStringGetTextConcat _XMSTRINGGETTEXTCONCAT +#define _XmStrings _XMSTRINGS +#define _XmToHorizontalPixels _XMTOHORIZONTALPIXELS +#define _XmToVerticalPixels _XMTOVERTICALPIXELS +#define _XmTopShadowColorDefault _XMTOPSHADOWCOLORDEFAULT +#define _Xm_fastPtr _XM_FASTPTR +#define _XtCheckSubclassFlag _XTCHECKSUBCLASSFLAG +#define _XtInherit _XTINHERIT +#define _XtInheritTranslations _XTINHERITTRANSLATIONS +#define applicationShellWidgetClass APPLICATIONSHELLWIDGETCLASS +#define compositeWidgetClass COMPOSITEWIDGETCLASS +#define overrideShellWidgetClass OVERRIDESHELLWIDGETCLASS +#define shellWidgetClass SHELLWIDGETCLASS +#define topLevelShellClassRec TOPLEVELSHELLCLASSREC +#define topLevelShellWidgetClass TOPLEVELSHELLWIDGETCLASS +#define transientShellWidgetClass TRANSIENTSHELLWIDGETCLASS +#define vendorShellClassRec VENDORSHELLCLASSREC +#define vendorShellWidgetClass VENDORSHELLWIDGETCLASS +#define wmShellWidgetClass WMSHELLWIDGETCLASS +#define xmArrowButtonWidgetClass XMARROWBUTTONWIDGETCLASS +#define xmCascadeButtonClassRec XMCASCADEBUTTONCLASSREC +#define xmCascadeButtonGadgetClass XMCASCADEBUTTONGADGETCLASS +#define xmCascadeButtonWidgetClass XMCASCADEBUTTONWIDGETCLASS +#define xmDialogShellWidgetClass XMDIALOGSHELLWIDGETCLASS +#define xmDrawingAreaWidgetClass XMDRAWINGAREAWIDGETCLASS +#define xmDrawnButtonWidgetClass XMDRAWNBUTTONWIDGETCLASS +#define xmFileSelectionBoxWidgetClass XMFILESELECTIONBOXWIDGETCLASS +#define xmFormWidgetClass XMFORMWIDGETCLASS +#define xmFrameWidgetClass XMFRAMEWIDGETCLASS +#define xmGadgetClass XMGADGETCLASS +#define xmLabelGadgetClass XMLABELGADGETCLASS +#define xmLabelWidgetClass XMLABELWIDGETCLASS +#define xmListWidgetClass XMLISTWIDGETCLASS +#define xmMainWindowWidgetClass XMMAINWINDOWWIDGETCLASS +#define xmManagerClassRec XMMANAGERCLASSREC +#define xmManagerWidgetClass XMMANAGERWIDGETCLASS +#define xmMenuShellWidgetClass XMMENUSHELLWIDGETCLASS +#define xmMessageBoxWidgetClass XMMESSAGEBOXWIDGETCLASS +#define xmPrimitiveClassRec XMPRIMITIVECLASSREC +#define xmPrimitiveWidgetClass XMPRIMITIVEWIDGETCLASS +#define xmPushButtonClassRec XMPUSHBUTTONCLASSREC +#define xmPushButtonGadgetClass XMPUSHBUTTONGADGETCLASS +#define xmPushButtonWidgetClass XMPUSHBUTTONWIDGETCLASS +#define xmRowColumnWidgetClass XMROWCOLUMNWIDGETCLASS +#define xmSashWidgetClass XMSASHWIDGETCLASS +#define xmScrollBarWidgetClass XMSCROLLBARWIDGETCLASS +#define xmScrolledWindowClassRec XMSCROLLEDWINDOWCLASSREC +#define xmScrolledWindowWidgetClass XMSCROLLEDWINDOWWIDGETCLASS +#define xmSeparatorGadgetClass XMSEPARATORGADGETCLASS +#define xmSeparatorWidgetClass XMSEPARATORWIDGETCLASS +#define xmTextFieldWidgetClass XMTEXTFIELDWIDGETCLASS +#define xmTextWidgetClass XMTEXTWIDGETCLASS +#define xmToggleButtonGadgetClass XMTOGGLEBUTTONGADGETCLASS +#define xmToggleButtonWidgetClass XMTOGGLEBUTTONWIDGETCLASS +#define XtRegisterDrawable _XTREGISTERWINDOW +#define XtUnregisterDrawable _XTUNREGISTERWINDOW +#define XQueryFont XQUERYFONT +#define XSetPlaneMask XSETPLANEMASK +#define XChangeKeyboardControl XCHANGEKEYBOARDCONTROL +#define XDestroySubwindows XDESTROYSUBWINDOWS +#define XFreeDeviceList XFREEDEVICELIST +#define XFreeDeviceState XFREEDEVICESTATE +#define XGetExtensionVersion XGETEXTENSIONVERSION +#define XGetRGBColormaps XGETRGBCOLORMAPS +#define XIconifyWindow XICONIFYWINDOW +#define XInstallColormap XINSTALLCOLORMAP +#define XListInputDevices XLISTINPUTDEVICES +#define XLookupKeysym XLOOKUPKEYSYM +#define XOpenDevice XOPENDEVICE +#define XQueryDeviceState XQUERYDEVICESTATE +#define XSelectExtensionEvent XSELECTEXTENSIONEVENT +#define XWarpPointer XWARPPOINTER +#define XmuLookupStandardColormap XMULOOKUPSTANDARDCOLORMAP +#define XAllocNamedColor XALLOCNAMEDCOLOR +#define XBlackPixelOfScreen XBLACKPIXELOFSCREEN +#define XDefaultColormap XDEFAULTCOLORMAP +#define XDefaultColormapOfScreen XDEFAULTCOLORMAPOFSCREEN +#define XDefaultDepth XDEFAULTDEPTH +#define XDefaultScreen XDEFAULTSCREEN +#define XDefaultVisual XDEFAULTVISUAL +#define XSetIconName XSETICONNAME +#define XtInitialize XTINITIALIZE +#define XtMainLoop XTMAINLOOP +#define DtSaverGetWindows DTSAVERGETWINDOWS +#define XAddHosts XADDHOSTS +#define XDisableAccessControl XDISABLEACCESSCONTROL +#define XEnableAccessControl XENABLEACCESSCONTROL +#define XFillArcs XFILLARCS +#define XForceScreenSaver XFORCESCREENSAVER +#define XGetScreenSaver XGETSCREENSAVER +#define XListHosts XLISTHOSTS +#define XReadBitmapFile XREADBITMAPFILE +#define XRemoveHosts XREMOVEHOSTS +#define XResetScreenSaver XRESETSCREENSAVER +#define XResourceManagerString XRESOURCEMANAGERSTRING +#define XSetScreenSaver XSETSCREENSAVER +#define XStringListToTextProperty XSTRINGLISTTOTEXTPROPERTY +#define XrmDestroyDatabase XRMDESTROYDATABASE +#define XrmGetFileDatabase XRMGETFILEDATABASE +#define XrmGetStringDatabase XRMGETSTRINGDATABASE +#define XrmInitialize XRMINITIALIZE +#define XrmMergeDatabases XRMMERGEDATABASES +#define XrmParseCommand XRMPARSECOMMAND +#define XrmPutLineResource XRMPUTLINERESOURCE +#define XrmQPutStringResource XRMQPUTSTRINGRESOURCE +#define XrmStringToBindingQuarkList XRMSTRINGTOBINDINGQUARKLIST +#define XrmStringToQuark XRMSTRINGTOQUARK +#define XmCreateLabel XMCREATELABEL + +#ifdef __cplusplus +extern "C" { +#endif +extern void XtFree(char*); +#ifdef __cplusplus +} +#endif + +#define pthread_attr_create PTHREAD_ATTR_CREATE +#define pthread_attr_delete PTHREAD_ATTR_DELETE +#define pthread_attr_destroy PTHREAD_ATTR_DESTROY +#define pthread_attr_getdetach_np PTHREAD_ATTR_GETDETACH_NP +#define pthread_attr_getguardsize_np PTHREAD_ATTR_GETGUARDSIZE_NP +#define pthread_attr_getinheritsched PTHREAD_ATTR_GETINHERITSCHED +#define pthread_attr_getprio PTHREAD_ATTR_GETPRIO +#define pthread_attr_getsched PTHREAD_ATTR_GETSCHED +#define pthread_attr_getschedparam PTHREAD_ATTR_GETSCHEDPARAM +#define pthread_attr_getstacksize PTHREAD_ATTR_GETSTACKSIZE +#define pthread_attr_init PTHREAD_ATTR_INIT +#define pthread_attr_setdetach_np PTHREAD_ATTR_SETDETACH_NP +#define pthread_attr_setdetachstate PTHREAD_ATTR_SETDETACHSTATE +#define pthread_attr_setguardsize_np PTHREAD_ATTR_SETGUARDSIZE_NP +#define pthread_attr_setinheritsched PTHREAD_ATTR_SETINHERITSCHED +#define pthread_attr_setprio PTHREAD_ATTR_SETPRIO +#define pthread_attr_setsched PTHREAD_ATTR_SETSCHED +#define pthread_attr_setschedparam PTHREAD_ATTR_SETSCHEDPARAM +#define pthread_attr_setschedpolicy PTHREAD_ATTR_SETSCHEDPOLICY +#define pthread_attr_setstacksize PTHREAD_ATTR_SETSTACKSIZE +#define pthread_cancel PTHREAD_CANCEL +#define pthread_cancel_e PTHREAD_CANCEL_E +#define pthread_cond_broadcast PTHREAD_COND_BROADCAST +#define pthread_cond_destroy PTHREAD_COND_DESTROY +#define pthread_cond_init PTHREAD_COND_INIT +#define pthread_cond_sig_preempt_int_np PTHREAD_COND_SIG_PREEMPT_INT_NP +#define pthread_cond_signal PTHREAD_COND_SIGNAL +#define pthread_cond_signal_int_np PTHREAD_COND_SIGNAL_INT_NP +#define pthread_cond_timedwait PTHREAD_COND_TIMEDWAIT +#define pthread_cond_wait PTHREAD_COND_WAIT +#define pthread_condattr_create PTHREAD_CONDATTR_CREATE +#define pthread_condattr_delete PTHREAD_CONDATTR_DELETE +#define pthread_condattr_init PTHREAD_CONDATTR_INIT +#define pthread_create PTHREAD_CREATE +#define pthread_delay_np PTHREAD_DELAY_NP +#define pthread_detach PTHREAD_DETACH +#define pthread_equal PTHREAD_EQUAL +#define pthread_exc_fetch_fp_np PTHREAD_EXC_FETCH_FP_NP +#define pthread_exc_handler_np PTHREAD_EXC_HANDLER_NP +#define pthread_exc_pop_ctx_np PTHREAD_EXC_POP_CTX_NP +#define pthread_exc_push_ctx_np PTHREAD_EXC_PUSH_CTX_NP +#define pthread_exc_savecontext_np PTHREAD_EXC_SAVECONTEXT_NP +#define pthread_exit PTHREAD_EXIT +#define pthread_get_expiration_np PTHREAD_GET_EXPIRATION_NP +#define pthread_getprio PTHREAD_GETPRIO +#define pthread_getschedparam PTHREAD_GETSCHEDPARAM +#define pthread_getscheduler PTHREAD_GETSCHEDULER +#define pthread_getspecific PTHREAD_GETSPECIFIC +#define pthread_getunique_np PTHREAD_GETUNIQUE_NP +#define pthread_join PTHREAD_JOIN +#define pthread_join32 PTHREAD_JOIN32 +#define pthread_keycreate PTHREAD_KEYCREATE +#define pthread_key_create PTHREAD_KEY_CREATE +#define pthread_kill PTHREAD_KILL +#define pthread_lock_global_np PTHREAD_LOCK_GLOBAL_NP +#define pthread_mutex_destroy PTHREAD_MUTEX_DESTROY +#define pthread_mutex_init PTHREAD_MUTEX_INIT +#define pthread_mutex_lock PTHREAD_MUTEX_LOCK +#define pthread_mutex_trylock PTHREAD_MUTEX_TRYLOCK +#define pthread_mutex_unlock PTHREAD_MUTEX_UNLOCK +#define pthread_mutexattr_create PTHREAD_MUTEXATTR_CREATE +#define pthread_mutexattr_delete PTHREAD_MUTEXATTR_DELETE +#define pthread_mutexattr_destroy PTHREAD_MUTEXATTR_DESTROY +#define pthread_mutexattr_getkind_np PTHREAD_MUTEXATTR_GETKIND_NP +#define pthread_mutexattr_init PTHREAD_MUTEXATTR_INIT +#define pthread_mutexattr_setkind_np PTHREAD_MUTEXATTR_SETKIND_NP +#define pthread_mutexattr_settype_np PTHREAD_MUTEXATTR_SETTYPE_NP +#define pthread_once PTHREAD_ONCE +#define pthread_resume_np PTHREAD_RESUME_NP +#define pthread_self PTHREAD_SELF +#define pthread_setasynccancel PTHREAD_SETASYNCCANCEL +#define pthread_setcancel PTHREAD_SETCANCEL +#define pthread_setcancelstate PTHREAD_SETCANCELSTATE +#define pthread_setprio PTHREAD_SETPRIO +#define pthread_setschedparam PTHREAD_SETSCHEDPARAM +#define pthread_setscheduler PTHREAD_SETSCHEDULER +#define pthread_setspecific PTHREAD_SETSPECIFIC +#define pthread_suspend_np PTHREAD_SUSPEND_NP +#define pthread_testcancel PTHREAD_TESTCANCEL +#define pthread_unlock_global_np PTHREAD_UNLOCK_GLOBAL_NP +#define pthread_yield PTHREAD_YIELD +#define pthread_yield_np PTHREAD_YIELD_NP +#define XDefaultRootWindow XDEFAULTROOTWINDOW +#define XDisplayCells XDISPLAYCELLS +#define XMaxRequestSize XMAXREQUESTSIZE +#define XScreenOfDisplay XSCREENOFDISPLAY +#define XSetFillRule XSETFILLRULE +#define XmActivateProtocol XMACTIVATEPROTOCOL +#define XmCreateBulletinBoardDialog XMCREATEBULLETINBOARDDIALOG +#define XmCreateErrorDialog XMCREATEERRORDIALOG +#define XmCreateWarningDialog XMCREATEWARNINGDIALOG +#define XmCvtCTToXmString XMCVTCTTOXMSTRING +#define XmDestroyPixmap XMDESTROYPIXMAP +#define XmGetPixmap XMGETPIXMAP +#define XmInstallImage XMINSTALLIMAGE +#define XmListAddItems XMLISTADDITEMS +#define XmListDeleteItem XMLISTDELETEITEM +#define XmListItemExists XMLISTITEMEXISTS +#define XmListItemPos XMLISTITEMPOS +#define XmListReplaceItems XMLISTREPLACEITEMS +#define XmListReplaceItemsPos XMLISTREPLACEITEMSPOS +#define XmRemoveProtocols XMREMOVEPROTOCOLS +#define XmRemoveTabGroup XMREMOVETABGROUP +#define XmSetColorCalculation XMSETCOLORCALCULATION +#define XmTextCopy XMTEXTCOPY +#define XmTextCut XMTEXTCUT +#define XmTextFieldClearSelection XMTEXTFIELDCLEARSELECTION +#define XmTextFieldCopy XMTEXTFIELDCOPY +#define XmTextFieldCut XMTEXTFIELDCUT +#define XmTextFieldGetMaxLength XMTEXTFIELDGETMAXLENGTH +#define XmTextFieldGetSelectionPosition XMTEXTFIELDGETSELECTIONPOSITION +#define XmTextFieldPaste XMTEXTFIELDPASTE +#define XmTextFieldReplace XMTEXTFIELDREPLACE +#define XmTextFieldSetAddMode XMTEXTFIELDSETADDMODE +#define XmTextFieldSetHighlight XMTEXTFIELDSETHIGHLIGHT +#define XmTextFieldSetInsertionPosition XMTEXTFIELDSETINSERTIONPOSITION +#define XmTextFieldSetMaxLength XMTEXTFIELDSETMAXLENGTH +#define XmTextFieldShowPosition XMTEXTFIELDSHOWPOSITION +#define XmTextGetEditable XMTEXTGETEDITABLE +#define XmTextPaste XMTEXTPASTE +#define XmTextPosToXY XMTEXTPOSTOXY +#define XmTextSetEditable XMTEXTSETEDITABLE +#define XmTextShowPosition XMTEXTSHOWPOSITION +#define XmUninstallImage XMUNINSTALLIMAGE +#define XmuCvtStringToBitmap XMUCVTSTRINGTOBITMAP +#define XrmPutFileDatabase XRMPUTFILEDATABASE +#define XtAddConverter XTADDCONVERTER +#define XtError XTERROR +#define XtVaCreatePopupShell XTVACREATEPOPUPSHELL +#define pthread_attr_getschedpolicy PTHREAD_ATTR_GETSCHEDPOLICY +#define pthread_key_delete PTHREAD_KEY_DELETE +#define xmBulletinBoardWidgetClass XMBULLETINBOARDWIDGETCLASS +#define xmScaleWidgetClass XMSCALEWIDGETCLASS +#define XtDisplay XTDISPLAY +#define XtScreen XTSCREEN +#define XAllocIconSize XALLOCICONSIZE +#define XAllocStandardColormap XALLOCSTANDARDCOLORMAP +#define XAllowEvents XALLOWEVENTS +#define XBlackPixel XBLACKPIXEL +#define XCopyColormapAndFree XCOPYCOLORMAPANDFREE +#define XDefaultGC XDEFAULTGC +#define XDisplayHeight XDISPLAYHEIGHT +#define XDisplayWidth XDISPLAYWIDTH +#define XGetCommand XGETCOMMAND +#define XGetIconSizes XGETICONSIZES +#define XKillClient XKILLCLIENT +#define XListInstalledColormaps XLISTINSTALLEDCOLORMAPS +#define XRootWindow XROOTWINDOW +#define XWMGeometry XWMGEOMETRY +#define XWhitePixel XWHITEPIXEL +#define XrmCombineDatabase XRMCOMBINEDATABASE +#define XrmCombineFileDatabase XRMCOMBINEFILEDATABASE +#define XSetStandardProperties XSETSTANDARDPROPERTIES +#define XSetState XSETSTATE +#define XDrawRectangles XDRAWRECTANGLES +#define XGrabButton XGRABBUTTON +#define XLookupColor XLOOKUPCOLOR +#define XMapSubwindows XMAPSUBWINDOWS +#define XRecolorCursor XRECOLORCURSOR +#define XStoreBytes XSTOREBYTES +#define XUngrabButton XUNGRABBUTTON +#define XUninstallColormap XUNINSTALLCOLORMAP +#define lib$wait LIB$WAIT +#define lib$find_file LIB$FIND_FILE +#define lib$find_file_end LIB$FIND_FILE_END +#define lib$set_symbol LIB$SET_SYMBOL +#define lib$sfree1_dd LIB$SFREE1_DD +#define lib$spawn LIB$SPAWN +#define sys$assign SYS$ASSIGN +#define sys$crembx SYS$CREMBX +#define sys$dassgn SYS$DASSGN +#define sys$dclexh SYS$DCLEXH +#define sys$getdviw SYS$GETDVIW +#define sys$getsyiw SYS$GETSYIW +#define sys$qio SYS$QIO +#define sys$qiow SYS$QIOW +#define sys$setef SYS$SETEF +#define sys$synch SYS$SYNCH +#define XDrawText XDRAWTEXT +#define XtCloseDisplay XTCLOSEDISPLAY +#define XtDestroyApplicationContext XTDESTROYAPPLICATIONCONTEXT +#define lib$ediv LIB$EDIV +#define lib$subx LIB$SUBX +#define sys$bintim SYS$BINTIM +#define sys$gettim SYS$GETTIM +#define XFetchName XFETCHNAME +#define XPeekIfEvent XPEEKIFEVENT +#define XQueryKeymap XQUERYKEYMAP +#endif diff --git a/reactos/lib/mesa32/include/GL/wmesa.h b/reactos/lib/mesa32/include/GL/wmesa.h new file mode 100644 index 00000000000..dc1ec89d2b1 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/wmesa.h @@ -0,0 +1,140 @@ +/* + * Mesa 3-D graphics library + * Version: 3.0 + * Copyright (C) 1995-1998 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + + +/* + * Windows driver by: Mark E. Peterson (markp@ic.mankato.mn.us) + * Updated by Li Wei (liwei@aiar.xjtu.edu.cn) + * + * + *************************************************************** + * WMesa * + * version 2.3 * + * * + * By * + * Li Wei * + * Institute of Artificial Intelligence & Robotics * + * Xi'an Jiaotong University * + * Email: liwei@aiar.xjtu.edu.cn * + * Web page: http://sun.aiar.xjtu.edu.cn * + * * + * July 7th, 1997 * + *************************************************************** + */ + + +#ifndef WMESA_H +#define WMESA_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +#include "gl\gl.h" + +#pragma warning (disable:4273) +#pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */ +#pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */ +#pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */ +#pragma warning( disable : 4013 ) /* 'function' undefined; assuming extern returning int */ +#pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */ +#pragma warning( disable : 4273 ) /* 'identifier' : inconsistent DLL linkage. dllexport assumed */ +#if (MESA_WARNQUIET>1) +# pragma warning( disable : 4146 ) /* unary minus operator applied to unsigned type, result still unsigned */ +#endif + +/* + * This is the WMesa context 'handle': + */ +typedef struct wmesa_context *WMesaContext; + + + +/* + * Create a new WMesaContext for rendering into a window. You must + * have already created the window of correct visual type and with an + * appropriate colormap. + * + * Input: + * hWnd - Window handle + * Pal - Palette to use + * rgb_flag - GL_TRUE = RGB mode, + * GL_FALSE = color index mode + * db_flag - GL_TRUE = double-buffered, + * GL_FALSE = single buffered + * alpha_flag - GL_TRUE = create software alpha buffer, + * GL_FALSE = no software alpha buffer + * + * Note: Indexed mode requires double buffering under Windows. + * + * Return: a WMesa_context or NULL if error. + */ +extern WMesaContext WMesaCreateContext(HWND hWnd,HPALETTE* pPal, + GLboolean rgb_flag, + GLboolean db_flag, + GLboolean alpha_flag); + + +/* + * Destroy a rendering context as returned by WMesaCreateContext() + */ +/*extern void WMesaDestroyContext( WMesaContext ctx );*/ +extern void WMesaDestroyContext( void ); + + + +/* + * Make the specified context the current one. + */ +extern void WMesaMakeCurrent( WMesaContext ctx ); + + +/* + * Return a handle to the current context. + */ +extern WMesaContext WMesaGetCurrentContext( void ); + + +/* + * Swap the front and back buffers for the current context. No action + * taken if the context is not double buffered. + */ +extern void WMesaSwapBuffers(void); + + +/* + * In indexed color mode we need to know when the palette changes. + */ +extern void WMesaPaletteChange(HPALETTE Pal); + +extern void WMesaMove(void); + + + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/reactos/lib/mesa32/include/GL/xmesa.h b/reactos/lib/mesa32/include/GL/xmesa.h new file mode 100644 index 00000000000..2b7f3675431 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/xmesa.h @@ -0,0 +1,390 @@ +/* + * Mesa 3-D graphics library + * Version: 4.1 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/* + * Mesa/X11 interface. This header file serves as the documentation for + * the Mesa/X11 interface functions. + * + * Note: this interface isn't intended for user programs. It's primarily + * just for implementing the pseudo-GLX interface. + */ + + +/* Sample Usage: + +In addition to the usual X calls to select a visual, create a colormap +and create a window, you must do the following to use the X/Mesa interface: + +1. Call XMesaCreateVisual() to make an XMesaVisual from an XVisualInfo. + +2. Call XMesaCreateContext() to create an X/Mesa rendering context, given + the XMesaVisual. + +3. Call XMesaCreateWindowBuffer() to create an XMesaBuffer from an X window + and XMesaVisual. + +4. Call XMesaMakeCurrent() to bind the XMesaBuffer to an XMesaContext and + to make the context the current one. + +5. Make gl* calls to render your graphics. + +6. Use XMesaSwapBuffers() when double buffering to swap front/back buffers. + +7. Before the X window is destroyed, call XMesaDestroyBuffer(). + +8. Before exiting, call XMesaDestroyVisual and XMesaDestroyContext. + +*/ + + + + +#ifndef XMESA_H +#define XMESA_H + +#ifdef __VMS +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XFree86Server +#include "xmesa_xf86.h" +#else +#include +#include +#include "xmesa_x.h" +#endif +#include "GL/gl.h" + +#ifdef AMIWIN +#include +extern struct Library *XLibBase; +#endif + + +#define XMESA_MAJOR_VERSION 4 +#define XMESA_MINOR_VERSION 1 + + + +/* + * Values passed to XMesaGetString: + */ +#define XMESA_VERSION 1 +#define XMESA_EXTENSIONS 2 + + +/* + * Values passed to XMesaSetFXmode: + */ +#define XMESA_FX_WINDOW 1 +#define XMESA_FX_FULLSCREEN 2 + + + +typedef struct xmesa_context *XMesaContext; + +typedef struct xmesa_visual *XMesaVisual; + +typedef struct xmesa_buffer *XMesaBuffer; + + + +/* + * Create a new X/Mesa visual. + * Input: display - X11 display + * visinfo - an XVisualInfo pointer + * rgb_flag - GL_TRUE = RGB mode, + * GL_FALSE = color index mode + * alpha_flag - alpha buffer requested? + * db_flag - GL_TRUE = double-buffered, + * GL_FALSE = single buffered + * stereo_flag - stereo visual? + * ximage_flag - GL_TRUE = use an XImage for back buffer, + * GL_FALSE = use an off-screen pixmap for back buffer + * depth_size - requested bits/depth values, or zero + * stencil_size - requested bits/stencil values, or zero + * accum_red_size - requested bits/red accum values, or zero + * accum_green_size - requested bits/green accum values, or zero + * accum_blue_size - requested bits/blue accum values, or zero + * accum_alpha_size - requested bits/alpha accum values, or zero + * num_samples - number of samples/pixel if multisampling, or zero + * level - visual level, usually 0 + * visualCaveat - ala the GLX extension, usually GLX_NONE_EXT + * Return; a new XMesaVisual or 0 if error. + */ +extern XMesaVisual XMesaCreateVisual( XMesaDisplay *display, + XMesaVisualInfo visinfo, + GLboolean rgb_flag, + GLboolean alpha_flag, + GLboolean db_flag, + GLboolean stereo_flag, + GLboolean ximage_flag, + GLint depth_size, + GLint stencil_size, + GLint accum_red_size, + GLint accum_green_size, + GLint accum_blue_size, + GLint accum_alpha_size, + GLint num_samples, + GLint level, + GLint visualCaveat ); + +/* + * Destroy an XMesaVisual, but not the associated XVisualInfo. + */ +extern void XMesaDestroyVisual( XMesaVisual v ); + + + +/* + * Create a new XMesaContext for rendering into an X11 window. + * + * Input: visual - an XMesaVisual + * share_list - another XMesaContext with which to share display + * lists or NULL if no sharing is wanted. + * Return: an XMesaContext or NULL if error. + */ +extern XMesaContext XMesaCreateContext( XMesaVisual v, + XMesaContext share_list ); + + +/* + * Destroy a rendering context as returned by XMesaCreateContext() + */ +extern void XMesaDestroyContext( XMesaContext c ); + + +/* + * Create an XMesaBuffer from an X window. + */ +extern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w ); + + +/* + * Create an XMesaBuffer from an X pixmap. + */ +extern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v, + XMesaPixmap p, + XMesaColormap cmap ); + + +/* + * Destroy an XMesaBuffer, but not the corresponding window or pixmap. + */ +extern void XMesaDestroyBuffer( XMesaBuffer b ); + + +/* + * Return the XMesaBuffer handle which corresponds to an X drawable, if any. + * + * New in Mesa 2.3. + */ +extern XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, + XMesaDrawable d ); + + + +/* + * Bind a buffer to a context and make the context the current one. + */ +extern GLboolean XMesaMakeCurrent( XMesaContext c, + XMesaBuffer b ); + + +/* + * Bind two buffers (read and draw) to a context and make the + * context the current one. + * New in Mesa 3.3 + */ +extern GLboolean XMesaMakeCurrent2( XMesaContext c, + XMesaBuffer drawBuffer, + XMesaBuffer readBuffer ); + + +/* + * Unbind the current context from its buffer. + */ +extern GLboolean XMesaUnbindContext( XMesaContext c ); + + +/* + * Return a handle to the current context. + */ +extern XMesaContext XMesaGetCurrentContext( void ); + + +/* + * Return handle to the current (draw) buffer. + */ +extern XMesaBuffer XMesaGetCurrentBuffer( void ); + + +/* + * Return handle to the current read buffer. + * New in Mesa 3.3 + */ +extern XMesaBuffer XMesaGetCurrentReadBuffer( void ); + + +/* + * Swap the front and back buffers for the given buffer. No action is + * taken if the buffer is not double buffered. + */ +extern void XMesaSwapBuffers( XMesaBuffer b ); + + +/* + * Copy a sub-region of the back buffer to the front buffer. + * + * New in Mesa 2.6 + */ +extern void XMesaCopySubBuffer( XMesaBuffer b, + int x, + int y, + int width, + int height ); + + +/* + * Return a pointer to the the Pixmap or XImage being used as the back + * color buffer of an XMesaBuffer. This function is a way to get "under + * the hood" of X/Mesa so one can manipulate the back buffer directly. + * Input: b - the XMesaBuffer + * Output: pixmap - pointer to back buffer's Pixmap, or 0 + * ximage - pointer to back buffer's XImage, or NULL + * Return: GL_TRUE = context is double buffered + * GL_FALSE = context is single buffered + */ +extern GLboolean XMesaGetBackBuffer( XMesaBuffer b, + XMesaPixmap *pixmap, + XMesaImage **ximage ); + + + +/* + * Return the depth buffer associated with an XMesaBuffer. + * Input: b - the XMesa buffer handle + * Output: width, height - size of buffer in pixels + * bytesPerValue - bytes per depth value (2 or 4) + * buffer - pointer to depth buffer values + * Return: GL_TRUE or GL_FALSE to indicate success or failure. + * + * New in Mesa 2.4. + */ +extern GLboolean XMesaGetDepthBuffer( XMesaBuffer b, + GLint *width, + GLint *height, + GLint *bytesPerValue, + void **buffer ); + + + +/* + * Flush/sync a context + */ +extern void XMesaFlush( XMesaContext c ); + + + +/* + * Get an X/Mesa-specific string. + * Input: name - either XMESA_VERSION or XMESA_EXTENSIONS + */ +extern const char *XMesaGetString( XMesaContext c, int name ); + + + +/* + * Scan for XMesaBuffers whose window/pixmap has been destroyed, then free + * any memory used by that buffer. + * + * New in Mesa 2.3. + */ +extern void XMesaGarbageCollect( void ); + + + +/* + * Return a dithered pixel value. + * Input: c - XMesaContext + * x, y - window coordinate + * red, green, blue, alpha - color components in [0,1] + * Return: pixel value + * + * New in Mesa 2.3. + */ +extern unsigned long XMesaDitherColor( XMesaContext xmesa, + GLint x, + GLint y, + GLfloat red, + GLfloat green, + GLfloat blue, + GLfloat alpha ); + + + +/* + * 3Dfx Glide driver only! + * Set 3Dfx/Glide full-screen or window rendering mode. + * Input: mode - either XMESA_FX_WINDOW (window rendering mode) or + * XMESA_FX_FULLSCREEN (full-screen rendering mode) + * Return: GL_TRUE if success + * GL_FALSE if invalid mode or if not using 3Dfx driver + * + * New in Mesa 2.6. + */ +extern GLboolean XMesaSetFXmode( GLint mode ); + + + +/* + * Reallocate the back/depth/stencil/accum/etc/ buffers associated with + * buffer if its size has changed. + * + * New in Mesa 4.0.2 + */ +extern void XMesaResizeBuffers( XMesaBuffer b ); + + + +/* + * Create a pbuffer. + * New in Mesa 4.1 + */ +extern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, + unsigned int width, unsigned int height); + + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/reactos/lib/mesa32/include/GL/xmesa_x.h b/reactos/lib/mesa32/include/GL/xmesa_x.h new file mode 100644 index 00000000000..def0447195f --- /dev/null +++ b/reactos/lib/mesa32/include/GL/xmesa_x.h @@ -0,0 +1,90 @@ + +/************************************************************************** + +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin + * + */ + +#ifndef _XMESA_X_H_ +#define _XMESA_X_H_ + +typedef Display XMesaDisplay; +typedef Pixmap XMesaPixmap; +typedef Colormap XMesaColormap; +typedef Drawable XMesaDrawable; +typedef Window XMesaWindow; +typedef GC XMesaGC; +typedef XVisualInfo *XMesaVisualInfo; +typedef XImage XMesaImage; +typedef XPoint XMesaPoint; +typedef XColor XMesaColor; + +#define XMesaDestroyImage XDestroyImage + +#define XMesaPutPixel XPutPixel +#define XMesaGetPixel XGetPixel + +#define XMesaSetForeground XSetForeground +#define XMesaSetBackground XSetBackground +#define XMesaSetPlaneMask XSetPlaneMask +#define XMesaSetFunction XSetFunction +#define XMesaSetDashes XSetDashes +#define XMesaSetLineAttributes XSetLineAttributes +#define XMesaSetFillStyle XSetFillStyle +#define XMesaSetTile XSetTile +#define XMesaSetStipple XSetStipple + +#define XMesaDrawPoint XDrawPoint +#define XMesaDrawPoints XDrawPoints +#define XMesaDrawLine XDrawLine +#define XMesaFillRectangle XFillRectangle +#define XMesaPutImage XPutImage +#define XMesaCopyArea XCopyArea +#define XMesaFillPolygon XFillPolygon + +#define XMesaCreatePixmap XCreatePixmap +#define XMesaFreePixmap XFreePixmap +#define XMesaFreeGC XFreeGC + +#define GET_COLORMAP_SIZE(__v) __v->visinfo->colormap_size +#define GET_REDMASK(__v) __v->visinfo->red_mask +#define GET_GREENMASK(__v) __v->visinfo->green_mask +#define GET_BLUEMASK(__v) __v->visinfo->blue_mask +#if defined(__cplusplus) || defined(c_plusplus) +#define GET_VISUAL_CLASS(__v) __v->visinfo->c_class +#else +#define GET_VISUAL_CLASS(__v) __v->visinfo->class +#endif +#define GET_VISUAL_DEPTH(__v) __v->visinfo->depth +#define GET_BLACK_PIXEL(__v) BlackPixel(__v->display, __v->visinfo->screen) +#define CHECK_BYTE_ORDER(__v) host_byte_order()==ImageByteOrder(__v->display) +#define CHECK_FOR_HPCR(__v) XInternAtom(__v->display, "_HP_RGB_SMOOTH_MAP_LIST", True) + +#endif diff --git a/reactos/lib/mesa32/include/GL/xmesa_xf86.h b/reactos/lib/mesa32/include/GL/xmesa_xf86.h new file mode 100644 index 00000000000..983f234ddd9 --- /dev/null +++ b/reactos/lib/mesa32/include/GL/xmesa_xf86.h @@ -0,0 +1,187 @@ + +/************************************************************************** + +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin + * + */ + +#ifndef _XMESA_XF86_H_ +#define _XMESA_XF86_H_ + +#include "scrnintstr.h" +#include "pixmapstr.h" + +typedef struct _XMesaImageRec XMesaImage; + +typedef ScreenRec XMesaDisplay; +typedef PixmapPtr XMesaPixmap; +typedef ColormapPtr XMesaColormap; +typedef DrawablePtr XMesaDrawable; +typedef WindowPtr XMesaWindow; +typedef GCPtr XMesaGC; +typedef VisualPtr XMesaVisualInfo; +typedef DDXPointRec XMesaPoint; +typedef xColorItem XMesaColor; + +#define XMesaSetGeneric(__d,__gc,__val,__mask) \ +do { \ + CARD32 __v[1]; \ + (void) __d; \ + __v[0] = __val; \ + dixChangeGC(NullClient, __gc, __mask, __v, NULL); \ +} while (0) + +#define XMesaSetGenericPtr(__d,__gc,__pval,__mask) \ +do { \ + ChangeGCVal __v[1]; \ + (void) __d; \ + __v[0].ptr = __pval; \ + dixChangeGC(NullClient, __gc, __mask, NULL, __v); \ +} while (0) + +#define XMesaSetDashes(__d,__gc,__do,__dl,__n) \ +do { \ + (void) __d; \ + SetDashes(__gc, __do, __n, (unsigned char *)__dl); \ +} while (0) + +#define XMesaSetLineAttributes(__d,__gc,__lw,__ls,__cs,__js) \ +do { \ + CARD32 __v[4]; \ + (void) __d; \ + __v[0] = __lw; \ + __v[1] = __ls; \ + __v[2] = __cs; \ + __v[3] = __js; \ + dixChangeGC(NullClient, __gc, \ + GCLineWidth|GCLineStyle|GCCapStyle|GCJoinStyle, \ + __v, NULL); \ +} while (0) + +#define XMesaSetForeground(d,gc,v) XMesaSetGeneric(d,gc,v,GCForeground) +#define XMesaSetBackground(d,gc,v) XMesaSetGeneric(d,gc,v,GCBackground) +#define XMesaSetPlaneMask(d,gc,v) XMesaSetGeneric(d,gc,v,GCPlaneMask) +#define XMesaSetFunction(d,gc,v) XMesaSetGeneric(d,gc,v,GCFunction) +#define XMesaSetFillStyle(d,gc,v) XMesaSetGeneric(d,gc,v,GCFillStyle) + +#define XMesaSetTile(d,gc,v) XMesaSetGenericPtr(d,gc,v,GCTile) +#define XMesaSetStipple(d,gc,v) XMesaSetGenericPtr(d,gc,v,GCStipple) + +#define XMesaDrawPoint(__d,__b,__gc,__x,__y) \ +do { \ + XMesaPoint __p[1]; \ + (void) __d; \ + __p[0].x = __x; \ + __p[0].y = __y; \ + ValidateGC(__b, __gc); \ + (*gc->ops->PolyPoint)(__b, __gc, CoordModeOrigin, 1, __p); \ +} while (0) + +#define XMesaDrawPoints(__d,__b,__gc,__p,__n,__m) \ +do { \ + (void) __d; \ + ValidateGC(__b, __gc); \ + (*gc->ops->PolyPoint)(__b, __gc, __m, __n, __p); \ +} while (0) + +#define XMesaDrawLine(__d,__b,__gc,__x0,__y0,__x1,__y1) \ +do { \ + XMesaPoint __p[2]; \ + (void) __d; \ + ValidateGC(__b, __gc); \ + __p[0].x = __x0; \ + __p[0].y = __y0; \ + __p[1].x = __x1; \ + __p[1].y = __y1; \ + (*__gc->ops->Polylines)(__b, __gc, CoordModeOrigin, 2, __p); \ +} while (0) + +#define XMesaFillRectangle(__d,__b,__gc,__x,__y,__w,__h) \ +do { \ + xRectangle __r[1]; \ + (void) __d; \ + ValidateGC((DrawablePtr)__b, __gc); \ + __r[0].x = __x; \ + __r[0].y = __y; \ + __r[0].width = __w; \ + __r[0].height = __h; \ + (*__gc->ops->PolyFillRect)((DrawablePtr)__b, __gc, 1, __r); \ +} while (0) + +#define XMesaPutImage(__d,__b,__gc,__i,__sx,__sy,__x,__y,__w,__h) \ +do { \ + /* Assumes: Images are always in ZPixmap format */ \ + (void) __d; \ + if (__sx || __sy) /* The non-trivial case */ \ + XMesaPutImageHelper(__d,__b,__gc,__i,__sx,__sy,__x,__y,__w,__h); \ + ValidateGC(__b, __gc); \ + (*__gc->ops->PutImage)(__b, __gc, ((XMesaDrawable)(__b))->depth, \ + __x, __y, __w, __h, 0, ZPixmap, \ + ((XMesaImage *)(__i))->data); \ +} while (0) + +#define XMesaCopyArea(__d,__sb,__db,__gc,__sx,__sy,__w,__h,__x,__y) \ +do { \ + (void) __d; \ + ValidateGC(__db, __gc); \ + (*__gc->ops->CopyArea)((DrawablePtr)__sb, __db, __gc, \ + __sx, __sy, __w, __h, __x, __y); \ +} while (0) + +#define XMesaFillPolygon(__d,__b,__gc,__p,__n,__s,__m) \ +do { \ + (void) __d; \ + ValidateGC(__b, __gc); \ + (*__gc->ops->FillPolygon)(__b, __gc, __s, __m, __n, __p); \ +} while (0) + +/* CreatePixmap returns a PixmapPtr; so, it cannot be inside braces */ +#define XMesaCreatePixmap(__d,__b,__w,__h,__depth) \ + (*__d->CreatePixmap)(__d, __w, __h, __depth) +#define XMesaFreePixmap(__d,__b) \ + (*__d->DestroyPixmap)(__b) + +#define XMesaFreeGC(__d,__gc) \ +do { \ + (void) __d; \ + FreeScratchGC(__gc); \ +} while (0) + +#define GET_COLORMAP_SIZE(__v) __v->visinfo->ColormapEntries +#define GET_REDMASK(__v) __v->visinfo->redMask +#define GET_GREENMASK(__v) __v->visinfo->greenMask +#define GET_BLUEMASK(__v) __v->visinfo->blueMask +#define GET_VISUAL_CLASS(__v) __v->visinfo->class +#define GET_VISUAL_DEPTH(__v) __v->visinfo->nplanes +#define GET_BLACK_PIXEL(__v) __v->display->blackPixel +#define CHECK_BYTE_ORDER(__v) GL_TRUE +#define CHECK_FOR_HPCR(__v) GL_FALSE + +#endif diff --git a/reactos/lib/mesa32/mesa32.def b/reactos/lib/mesa32/mesa32.def new file mode 100644 index 00000000000..130594c5311 --- /dev/null +++ b/reactos/lib/mesa32/mesa32.def @@ -0,0 +1,138 @@ +; DO NOT EDIT - This file generated automatically by mesadef.py script +DESCRIPTION 'Mesa (OpenGL work-alike) for Win32' +VERSION 6.0 +; +; Module definition file for Mesa (OPENGL32.DLL) +; +; Note: The OpenGL functions use the STDCALL +; function calling convention. Microsoft's +; OPENGL32 uses this convention and so must the +; Mesa OPENGL32 so that the Mesa DLL can be used +; as a drop-in replacement. +; +; The linker exports STDCALL entry points with +; 'decorated' names; e.g., _glBegin@0, where the +; trailing number is the number of bytes of +; parameter data pushed onto the stack. The +; callee is responsible for popping this data +; off the stack, usually via a RETF n instruction. +; +; However, the Microsoft OPENGL32.DLL does not export +; the decorated names, even though the calling convention +; is STDCALL. So, this module definition file is +; needed to force the Mesa OPENGL32.DLL to export the +; symbols in the same manner as the Microsoft DLL. +; Were it not for this problem, this file would not +; be needed (for the gl* functions) since the entry +; points are compiled with dllexport declspec. +; +; However, this file is still needed to export "internal" +; Mesa symbols for the benefit of the OSMESA32.DLL. +; +EXPORTS +; +; ICD API + DrvCopyContext + DrvCreateContext + DrvCreateLayerContext + DrvDeleteContext + DrvDescribeLayerPlane + DrvDescribePixelFormat + DrvGetLayerPaletteEntries + DrvGetProcAddress + DrvReleaseContext + DrvRealizeLayerPalette + DrvSetContext + DrvSetLayerPaletteEntries + DrvSetPixelFormat + DrvShareLists + DrvSwapBuffers + DrvSwapLayerBuffers + DrvValidateVersion + +; +; Mesa internals - mostly for OSMESA + _ac_CreateContext + _ac_DestroyContext + _ac_InvalidateState + _glapi_get_context + _glapi_get_proc_address + _mesa_base_compressed_texformat + _mesa_buffer_data + _mesa_buffer_map + _mesa_buffer_subdata + _mesa_bzero + _mesa_calloc + _mesa_choose_tex_format + _mesa_compressed_texture_size + _mesa_create_framebuffer + _mesa_create_visual + _mesa_delete_buffer_object + _mesa_delete_texture_object + _mesa_destroy_framebuffer + _mesa_destroy_visual + _mesa_enable_1_3_extensions + _mesa_enable_1_4_extensions + _mesa_enable_1_5_extensions + _mesa_enable_sw_extensions + _mesa_error + _mesa_free + _mesa_free_context_data + _mesa_get_current_context + _mesa_init_default_imports + _mesa_initialize_context + _mesa_make_current + _mesa_memcpy + _mesa_memset + _mesa_new_buffer_object + _mesa_new_texture_object + _mesa_problem + _mesa_ResizeBuffersMESA + _mesa_store_compressed_teximage1d + _mesa_store_compressed_teximage2d + _mesa_store_compressed_teximage3d + _mesa_store_compressed_texsubimage1d + _mesa_store_compressed_texsubimage2d + _mesa_store_compressed_texsubimage3d + _mesa_store_teximage1d + _mesa_store_teximage2d + _mesa_store_teximage3d + _mesa_store_texsubimage1d + _mesa_store_texsubimage2d + _mesa_store_texsubimage3d + _mesa_strcmp + _mesa_test_proxy_teximage + _mesa_Viewport + _swrast_Accum + _swrast_alloc_buffers + _swrast_Bitmap + _swrast_CopyPixels + _swrast_DrawBuffer + _swrast_DrawPixels + _swrast_GetDeviceDriverReference + _swrast_Clear + _swrast_choose_line + _swrast_choose_triangle + _swrast_CopyColorSubTable + _swrast_CopyColorTable + _swrast_CopyConvolutionFilter1D + _swrast_CopyConvolutionFilter2D + _swrast_copy_teximage1d + _swrast_copy_teximage2d + _swrast_copy_texsubimage1d + _swrast_copy_texsubimage2d + _swrast_copy_texsubimage3d + _swrast_CreateContext + _swrast_DestroyContext + _swrast_InvalidateState + _swrast_ReadPixels + _swrast_zbuffer_address + _swsetup_Wakeup + _swsetup_CreateContext + _swsetup_DestroyContext + _swsetup_InvalidateState + _tnl_CreateContext + _tnl_DestroyContext + _tnl_InvalidateState + _tnl_MakeCurrent + _tnl_run_pipeline diff --git a/reactos/lib/mesa32/mesa32.edf b/reactos/lib/mesa32/mesa32.edf new file mode 100644 index 00000000000..4a70e0597a6 --- /dev/null +++ b/reactos/lib/mesa32/mesa32.edf @@ -0,0 +1,107 @@ +EXPORTS +; +; ICD API + DrvCopyContext=DrvCopyContext@12 + DrvCreateContext=DrvCreateContext@4 + DrvCreateLayerContext=DrvCreateLayerContext@8 + DrvDeleteContext=DrvDeleteContext@4 + DrvDescribeLayerPlane=DrvDescribeLayerPlane@20 + DrvDescribePixelFormat=DrvDescribePixelFormat@16 + DrvGetLayerPaletteEntries=DrvGetLayerPaletteEntries@20 + DrvGetProcAddress=DrvGetProcAddress@4 + DrvReleaseContext=DrvReleaseContext@4 + DrvRealizeLayerPalette=DrvRealizeLayerPalette@12 + DrvSetContext=DrvSetContext@12 + DrvSetLayerPaletteEntries=DrvSetLayerPaletteEntries@20 + DrvSetPixelFormat=DrvSetPixelFormat@8 + DrvShareLists=DrvShareLists@8 + DrvSwapBuffers=DrvSwapBuffers@4 + DrvSwapLayerBuffers=DrvSwapLayerBuffers@8 + DrvValidateVersion=DrvValidateVersion@4 + +; +; Mesa internals - mostly for OSMESA + _ac_CreateContext=_ac_CreateContext@4 + _ac_DestroyContext=_ac_DestroyContext@4 + _ac_InvalidateState=_ac_InvalidateState@8 + _glapi_get_context=_glapi_get_context@0 + _glapi_get_proc_address=_glapi_get_proc_address@4 + _mesa_base_compressed_texformat=_mesa_base_compressed_texformat@8 + _mesa_buffer_data=_mesa_buffer_data@24 + _mesa_buffer_map=_mesa_buffer_map@16 + _mesa_buffer_subdata=_mesa_buffer_subdata@24 + _mesa_bzero=_mesa_bzero@8 + _mesa_calloc=_mesa_calloc@4 + _mesa_choose_tex_format=_mesa_choose_tex_format@16 + _mesa_compressed_texture_size=_mesa_compressed_texture_size@20 + _mesa_create_framebuffer=_mesa_create_framebuffer@20 + _mesa_create_visual=_mesa_create_visual@60 + _mesa_delete_buffer_object=_mesa_delete_buffer_object@8 + _mesa_delete_texture_object=_mesa_delete_texture_object@8 + _mesa_destroy_framebuffer=_mesa_destroy_framebuffer@4 + _mesa_destroy_visual=_mesa_destroy_visual@4 + _mesa_enable_1_3_extensions=_mesa_enable_1_3_extensions@4 + _mesa_enable_1_4_extensions=_mesa_enable_1_4_extensions@4 + _mesa_enable_1_5_extensions=_mesa_enable_1_5_extensions@4 + _mesa_enable_sw_extensions=_mesa_enable_sw_extensions@4 + _mesa_error=_mesa_error@12 + _mesa_free=_mesa_free@4 + _mesa_free_context_data=_mesa_free_context_data@4 + _mesa_get_current_context=_mesa_get_current_context@0 + _mesa_init_default_imports=_mesa_init_default_imports@8 + _mesa_initialize_context=_mesa_initialize_context@20 + _mesa_make_current=_mesa_make_current@8 + _mesa_memcpy=_mesa_memcpy@12 + _mesa_memset=_mesa_memset@12 + _mesa_new_buffer_object=_mesa_new_buffer_object@12 + _mesa_new_texture_object=_mesa_new_texture_object@12 + _mesa_problem=_mesa_problem@8 + _mesa_ResizeBuffersMESA=_mesa_ResizeBuffersMESA@0 + _mesa_store_compressed_teximage1d=_mesa_store_compressed_teximage1d@40 + _mesa_store_compressed_teximage2d=_mesa_store_compressed_teximage2d@44 + _mesa_store_compressed_teximage3d=_mesa_store_compressed_teximage3d@48 + _mesa_store_compressed_texsubimage1d=_mesa_store_compressed_texsubimage1d@40 + _mesa_store_compressed_texsubimage2d=_mesa_store_compressed_texsubimage2d@44 + _mesa_store_compressed_texsubimage3d=_mesa_store_compressed_texsubimage3d@48 + _mesa_store_teximage1d=_mesa_store_teximage1d@48 + _mesa_store_teximage2d=_mesa_store_teximage2d@52 + _mesa_store_teximage3d=_mesa_store_teximage3d@56 + _mesa_store_texsubimage1d=_mesa_store_texsubimage1d@48 + _mesa_store_texsubimage2d=_mesa_store_texsubimage2d@52 + _mesa_store_texsubimage3d=_mesa_store_texsubimage3d@56 + _mesa_strcmp=_mesa_strcmp@8 + _mesa_test_proxy_teximage=_mesa_test_proxy_teximage@40 + _mesa_Viewport=_mesa_Viewport@16 + _swrast_Accum=_swrast_Accum@28 + _swrast_alloc_buffers=_swrast_alloc_buffers@4 + _swrast_Bitmap=_swrast_Bitmap@28 + _swrast_CopyPixels=_swrast_CopyPixels@32 + _swrast_DrawBuffer=_swrast_DrawBuffer@8 + _swrast_DrawPixels=_swrast_DrawPixels@36 + _swrast_GetDeviceDriverReference=_swrast_GetDeviceDriverReference@4 + _swrast_Clear=_swrast_Clear@28 + _swrast_choose_line=_swrast_choose_line@4 + _swrast_choose_triangle=_swrast_choose_triangle@4 + _swrast_CopyColorSubTable=_swrast_CopyColorSubTable@24 + _swrast_CopyColorTable=_swrast_CopyColorTable@24 + _swrast_CopyConvolutionFilter1D=_swrast_CopyConvolutionFilter1D@24 + _swrast_CopyConvolutionFilter2D=_swrast_CopyConvolutionFilter2D@28 + _swrast_copy_teximage1d=_swrast_copy_teximage1d@32 + _swrast_copy_teximage2d=_swrast_copy_teximage2d@36 + _swrast_copy_texsubimage1d=_swrast_copy_texsubimage1d@28 + _swrast_copy_texsubimage2d=_swrast_copy_texsubimage2d@36 + _swrast_copy_texsubimage3d=_swrast_copy_texsubimage3d@40 + _swrast_CreateContext=_swrast_CreateContext@4 + _swrast_DestroyContext=_swrast_DestroyContext@4 + _swrast_InvalidateState=_swrast_InvalidateState@8 + _swrast_ReadPixels=_swrast_ReadPixels@36 + _swrast_zbuffer_address=_swrast_zbuffer_address@12 + _swsetup_Wakeup=_swsetup_Wakeup@4 + _swsetup_CreateContext=_swsetup_CreateContext@4 + _swsetup_DestroyContext=_swsetup_DestroyContext@4 + _swsetup_InvalidateState=_swsetup_InvalidateState@8 + _tnl_CreateContext=_tnl_CreateContext@4 + _tnl_DestroyContext=_tnl_DestroyContext@4 + _tnl_InvalidateState=_tnl_InvalidateState@8 + _tnl_MakeCurrent=_tnl_MakeCurrent@12 + _tnl_run_pipeline=_tnl_run_pipeline@4 From 6fc4d22bdeb499191580306191d561b3018f2aea Mon Sep 17 00:00:00 2001 From: Gregor Anich Date: Fri, 16 Jul 2004 22:12:43 +0000 Subject: [PATCH 315/356] Import Mesa-6.0.1 for use as software OpenGL renderer. svn path=/trunk/; revision=10149 --- .../lib/mesa32/src/array_cache/ac_context.c | 375 + .../lib/mesa32/src/array_cache/ac_context.h | 99 + .../lib/mesa32/src/array_cache/ac_import.c | 881 + reactos/lib/mesa32/src/array_cache/acache.h | 132 + .../mesa32/src/array_cache/array_cache.dsp | 108 + .../lib/mesa32/src/drivers/beos/GLView.cpp | 1427 ++ reactos/lib/mesa32/src/drivers/beos/GLView.h | 196 + reactos/lib/mesa32/src/drivers/common/t_dd.c | 58 + .../mesa32/src/drivers/common/t_dd_dmatmp.h | 1093 + .../mesa32/src/drivers/common/t_dd_dmatmp2.h | 935 + .../src/drivers/common/t_dd_rendertmp.h | 434 + .../mesa32/src/drivers/common/t_dd_triemit.h | 157 + .../mesa32/src/drivers/common/t_dd_tritmp.h | 743 + .../mesa32/src/drivers/common/t_dd_unfilled.h | 212 + .../lib/mesa32/src/drivers/common/t_dd_vb.c | 344 + .../mesa32/src/drivers/common/t_dd_vbtmp.h | 679 + .../mesa32/src/drivers/common/t_dd_vertex.h | 78 + reactos/lib/mesa32/src/drivers/dos/blit.S | 210 + reactos/lib/mesa32/src/drivers/dos/dmesa.c | 1418 ++ reactos/lib/mesa32/src/drivers/dos/dpmi.c | 148 + reactos/lib/mesa32/src/drivers/dos/internal.h | 130 + reactos/lib/mesa32/src/drivers/dos/vesa.c | 534 + reactos/lib/mesa32/src/drivers/dos/vesa.h | 47 + reactos/lib/mesa32/src/drivers/dos/vga.c | 236 + reactos/lib/mesa32/src/drivers/dos/vga.h | 42 + reactos/lib/mesa32/src/drivers/dos/video.c | 651 + reactos/lib/mesa32/src/drivers/dos/video.h | 65 + reactos/lib/mesa32/src/drivers/dos/virtual.S | 495 + .../mesa32/src/drivers/dri/common/depthtmp.h | 176 + .../lib/mesa32/src/drivers/dri/common/mm.c | 196 + .../lib/mesa32/src/drivers/dri/common/mm.h | 82 + .../lib/mesa32/src/drivers/dri/common/mmx.h | 560 + .../mesa32/src/drivers/dri/common/spantmp.h | 259 + .../src/drivers/dri/common/stenciltmp.h | 147 + .../mesa32/src/drivers/dri/common/texmem.c | 1230 + .../mesa32/src/drivers/dri/common/texmem.h | 295 + .../lib/mesa32/src/drivers/dri/common/utils.c | 219 + .../lib/mesa32/src/drivers/dri/common/utils.h | 58 + .../mesa32/src/drivers/dri/common/vblank.c | 363 + .../mesa32/src/drivers/dri/common/vblank.h | 64 + .../mesa32/src/drivers/dri/common/xmlconfig.c | 993 + .../mesa32/src/drivers/dri/common/xmlconfig.h | 124 + .../mesa32/src/drivers/dri/common/xmlpool.h | 270 + .../lib/mesa32/src/drivers/fbdev/glfbdev.c | 828 + .../src/drivers/ggi/default/genkgi.conf.in | 4 + .../src/drivers/ggi/default/genkgi_mode.c | 97 + .../src/drivers/ggi/default/genkgi_visual.c | 190 + .../mesa32/src/drivers/ggi/default/linear.c | 409 + .../src/drivers/ggi/default/linear_15.c | 36 + .../src/drivers/ggi/default/linear_16.c | 36 + .../src/drivers/ggi/default/linear_24.c | 36 + .../src/drivers/ggi/default/linear_32.c | 36 + .../mesa32/src/drivers/ggi/default/linear_8.c | 36 + .../mesa32/src/drivers/ggi/default/stubs.c | 512 + .../src/drivers/ggi/display/fbdev.conf.in | 4 + .../src/drivers/ggi/display/fbdev_mode.c | 134 + .../src/drivers/ggi/display/fbdev_visual.c | 150 + .../src/drivers/ggi/include/ggi/mesa/debug.h | 260 + .../ggi/include/ggi/mesa/display_fbdev.h | 20 + .../drivers/ggi/include/ggi/mesa/ggimesa.h | 84 + .../ggi/include/ggi/mesa/ggimesa_int.h | 45 + reactos/lib/mesa32/src/drivers/glide/fxapi.c | 932 + reactos/lib/mesa32/src/drivers/glide/fxdd.c | 1759 ++ .../lib/mesa32/src/drivers/glide/fxddspan.c | 663 + .../lib/mesa32/src/drivers/glide/fxddtex.c | 1684 ++ reactos/lib/mesa32/src/drivers/glide/fxdrv.h | 721 + reactos/lib/mesa32/src/drivers/glide/fxg.c | 2294 ++ reactos/lib/mesa32/src/drivers/glide/fxg.h | 381 + .../lib/mesa32/src/drivers/glide/fxglidew.c | 263 + .../lib/mesa32/src/drivers/glide/fxglidew.h | 197 + .../lib/mesa32/src/drivers/glide/fxopengl.def | 938 + .../lib/mesa32/src/drivers/glide/fxsetup.c | 2179 ++ .../lib/mesa32/src/drivers/glide/fxsetup.h | 1250 + .../lib/mesa32/src/drivers/glide/fxtexman.c | 884 + reactos/lib/mesa32/src/drivers/glide/fxtris.c | 1466 ++ reactos/lib/mesa32/src/drivers/glide/fxvb.c | 593 + .../lib/mesa32/src/drivers/glide/fxvbtmp.h | 317 + reactos/lib/mesa32/src/drivers/glide/fxwgl.c | 1017 + .../mesa32/src/drivers/osmesa/Makefile.win | 39 + .../lib/mesa32/src/drivers/osmesa/osmesa.c | 1337 ++ .../lib/mesa32/src/drivers/osmesa/osmesa.def | 13 + .../lib/mesa32/src/drivers/osmesa/osmesa.dsp | 119 + .../lib/mesa32/src/drivers/svga/svgamesa.c | 513 + .../lib/mesa32/src/drivers/svga/svgamesa15.c | 217 + .../lib/mesa32/src/drivers/svga/svgamesa15.h | 43 + .../lib/mesa32/src/drivers/svga/svgamesa16.c | 215 + .../lib/mesa32/src/drivers/svga/svgamesa16.h | 44 + .../lib/mesa32/src/drivers/svga/svgamesa24.c | 239 + .../lib/mesa32/src/drivers/svga/svgamesa24.h | 44 + .../lib/mesa32/src/drivers/svga/svgamesa32.c | 220 + .../lib/mesa32/src/drivers/svga/svgamesa32.h | 44 + .../lib/mesa32/src/drivers/svga/svgamesa8.c | 191 + .../lib/mesa32/src/drivers/svga/svgamesa8.h | 44 + reactos/lib/mesa32/src/drivers/svga/svgapix.h | 71 + .../mesa32/src/drivers/windows/gdi/colors.h | 539 + .../mesa32/src/drivers/windows/gdi/gdi.dsp | 129 + .../mesa32/src/drivers/windows/gdi/mesa.def | 1057 + .../lib/mesa32/src/drivers/windows/gdi/wgl.c | 623 + .../mesa32/src/drivers/windows/gdi/wmesa.c | 3328 +++ .../mesa32/src/drivers/windows/gdi/wmesadef.h | 174 + .../mesa32/src/drivers/windows/icd/colors.h | 539 + .../lib/mesa32/src/drivers/windows/icd/icd.c | 332 + .../mesa32/src/drivers/windows/icd/icdlist.h | 336 + .../mesa32/src/drivers/windows/icd/mesa.def | 138 + .../mesa32/src/drivers/windows/icd/wmesadef.h | 173 + reactos/lib/mesa32/src/drivers/x11/fakeglx.c | 2868 +++ reactos/lib/mesa32/src/drivers/x11/glxapi.c | 1343 ++ reactos/lib/mesa32/src/drivers/x11/glxapi.h | 236 + .../lib/mesa32/src/drivers/x11/glxheader.h | 71 + reactos/lib/mesa32/src/drivers/x11/realglx.c | 185 + reactos/lib/mesa32/src/drivers/x11/realglx.h | 326 + reactos/lib/mesa32/src/drivers/x11/xfonts.c | 377 + reactos/lib/mesa32/src/drivers/x11/xfonts.h | 41 + reactos/lib/mesa32/src/drivers/x11/xm_api.c | 2626 +++ reactos/lib/mesa32/src/drivers/x11/xm_dd.c | 1231 + reactos/lib/mesa32/src/drivers/x11/xm_line.c | 574 + reactos/lib/mesa32/src/drivers/x11/xm_span.c | 4485 ++++ reactos/lib/mesa32/src/drivers/x11/xm_tri.c | 1495 ++ reactos/lib/mesa32/src/drivers/x11/xmesaP.h | 551 + reactos/lib/mesa32/src/glapi/glapi.c | 923 + reactos/lib/mesa32/src/glapi/glapi.dsp | 124 + reactos/lib/mesa32/src/glapi/glapi.h | 109 + reactos/lib/mesa32/src/glapi/glapioffsets.h | 716 + reactos/lib/mesa32/src/glapi/glapitable.h | 723 + reactos/lib/mesa32/src/glapi/glapitemp.h | 5823 +++++ reactos/lib/mesa32/src/glapi/glprocs.h | 923 + reactos/lib/mesa32/src/glapi/glthread.c | 367 + reactos/lib/mesa32/src/glapi/glthread.h | 295 + reactos/lib/mesa32/src/main/accum.c | 97 + reactos/lib/mesa32/src/main/accum.h | 62 + reactos/lib/mesa32/src/main/api_arrayelt.c | 830 + reactos/lib/mesa32/src/main/api_arrayelt.h | 37 + reactos/lib/mesa32/src/main/api_eval.h | 42 + reactos/lib/mesa32/src/main/api_loopback.c | 1563 ++ reactos/lib/mesa32/src/main/api_loopback.h | 37 + reactos/lib/mesa32/src/main/api_noop.c | 863 + reactos/lib/mesa32/src/main/api_noop.h | 180 + reactos/lib/mesa32/src/main/api_validate.c | 239 + reactos/lib/mesa32/src/main/api_validate.h | 49 + reactos/lib/mesa32/src/main/arbfragparse.c | 238 + reactos/lib/mesa32/src/main/arbfragparse.h | 35 + reactos/lib/mesa32/src/main/arbparse.c | 6058 +++++ reactos/lib/mesa32/src/main/arbparse.h | 83 + reactos/lib/mesa32/src/main/arbparse_syn.h | 1267 + reactos/lib/mesa32/src/main/arbprogram.c | 712 + reactos/lib/mesa32/src/main/arbprogram.h | 128 + reactos/lib/mesa32/src/main/arbvertparse.c | 223 + reactos/lib/mesa32/src/main/arbvertparse.h | 33 + reactos/lib/mesa32/src/main/attrib.c | 1244 + reactos/lib/mesa32/src/main/attrib.h | 68 + reactos/lib/mesa32/src/main/blend.c | 590 + reactos/lib/mesa32/src/main/blend.h | 74 + reactos/lib/mesa32/src/main/bufferobj.c | 804 + reactos/lib/mesa32/src/main/bufferobj.h | 116 + reactos/lib/mesa32/src/main/buffers.c | 620 + reactos/lib/mesa32/src/main/buffers.h | 70 + reactos/lib/mesa32/src/main/clip.c | 119 + reactos/lib/mesa32/src/main/clip.h | 42 + reactos/lib/mesa32/src/main/colormac.h | 239 + reactos/lib/mesa32/src/main/colortab.c | 1381 ++ reactos/lib/mesa32/src/main/colortab.h | 110 + reactos/lib/mesa32/src/main/config.h | 269 + reactos/lib/mesa32/src/main/context.c | 1945 ++ reactos/lib/mesa32/src/main/context.h | 395 + reactos/lib/mesa32/src/main/convolve.c | 1412 ++ reactos/lib/mesa32/src/main/convolve.h | 114 + reactos/lib/mesa32/src/main/dd.h | 1011 + reactos/lib/mesa32/src/main/debug.c | 251 + reactos/lib/mesa32/src/main/debug.h | 64 + reactos/lib/mesa32/src/main/depth.c | 186 + reactos/lib/mesa32/src/main/depth.h | 62 + reactos/lib/mesa32/src/main/dispatch.c | 90 + reactos/lib/mesa32/src/main/dlist.c | 7815 +++++++ reactos/lib/mesa32/src/main/dlist.h | 104 + reactos/lib/mesa32/src/main/drawpix.c | 308 + reactos/lib/mesa32/src/main/drawpix.h | 55 + reactos/lib/mesa32/src/main/enable.c | 1441 ++ reactos/lib/mesa32/src/main/enable.h | 57 + reactos/lib/mesa32/src/main/enums.c | 973 + reactos/lib/mesa32/src/main/enums.h | 55 + reactos/lib/mesa32/src/main/eval.c | 962 + reactos/lib/mesa32/src/main/eval.h | 128 + reactos/lib/mesa32/src/main/extensions.c | 450 + reactos/lib/mesa32/src/main/extensions.h | 82 + reactos/lib/mesa32/src/main/feedback.c | 529 + reactos/lib/mesa32/src/main/feedback.h | 82 + reactos/lib/mesa32/src/main/fog.c | 177 + reactos/lib/mesa32/src/main/fog.h | 66 + reactos/lib/mesa32/src/main/get.c | 6488 ++++++ reactos/lib/mesa32/src/main/get.h | 59 + reactos/lib/mesa32/src/main/glheader.h | 300 + reactos/lib/mesa32/src/main/hash.c | 360 + reactos/lib/mesa32/src/main/hash.h | 62 + reactos/lib/mesa32/src/main/hint.c | 140 + reactos/lib/mesa32/src/main/hint.h | 57 + reactos/lib/mesa32/src/main/histogram.c | 1136 + reactos/lib/mesa32/src/main/histogram.h | 89 + reactos/lib/mesa32/src/main/image.c | 4136 ++++ reactos/lib/mesa32/src/main/image.h | 178 + reactos/lib/mesa32/src/main/imports.c | 1190 + reactos/lib/mesa32/src/main/imports.h | 776 + reactos/lib/mesa32/src/main/light.c | 1323 ++ reactos/lib/mesa32/src/main/light.h | 141 + reactos/lib/mesa32/src/main/lines.c | 134 + reactos/lib/mesa32/src/main/lines.h | 48 + reactos/lib/mesa32/src/main/macros.h | 658 + reactos/lib/mesa32/src/main/main.dsp | 612 + reactos/lib/mesa32/src/main/matrix.c | 938 + reactos/lib/mesa32/src/main/matrix.h | 131 + reactos/lib/mesa32/src/main/mtypes.h | 2320 ++ reactos/lib/mesa32/src/main/nvfragparse.c | 1767 ++ reactos/lib/mesa32/src/main/nvfragparse.h | 52 + reactos/lib/mesa32/src/main/nvfragprog.h | 190 + reactos/lib/mesa32/src/main/nvprogram.c | 871 + reactos/lib/mesa32/src/main/nvprogram.h | 119 + reactos/lib/mesa32/src/main/nvvertexec.c | 839 + reactos/lib/mesa32/src/main/nvvertexec.h | 43 + reactos/lib/mesa32/src/main/nvvertparse.c | 1496 ++ reactos/lib/mesa32/src/main/nvvertparse.h | 50 + reactos/lib/mesa32/src/main/nvvertprog.h | 107 + reactos/lib/mesa32/src/main/occlude.c | 329 + reactos/lib/mesa32/src/main/occlude.h | 58 + reactos/lib/mesa32/src/main/pixel.c | 1529 ++ reactos/lib/mesa32/src/main/pixel.h | 149 + reactos/lib/mesa32/src/main/points.c | 272 + reactos/lib/mesa32/src/main/points.h | 57 + reactos/lib/mesa32/src/main/polygon.c | 304 + reactos/lib/mesa32/src/main/polygon.h | 65 + reactos/lib/mesa32/src/main/program.c | 1244 + reactos/lib/mesa32/src/main/program.h | 236 + reactos/lib/mesa32/src/main/rastpos.c | 905 + reactos/lib/mesa32/src/main/rastpos.h | 193 + reactos/lib/mesa32/src/main/simple_list.h | 197 + reactos/lib/mesa32/src/main/state.c | 935 + reactos/lib/mesa32/src/main/state.h | 46 + reactos/lib/mesa32/src/main/stencil.c | 296 + reactos/lib/mesa32/src/main/stencil.h | 61 + reactos/lib/mesa32/src/main/texcompress.c | 274 + reactos/lib/mesa32/src/main/texcompress.h | 64 + reactos/lib/mesa32/src/main/texformat.c | 978 + reactos/lib/mesa32/src/main/texformat.h | 180 + reactos/lib/mesa32/src/main/texformat_tmp.h | 529 + reactos/lib/mesa32/src/main/teximage.c | 3204 +++ reactos/lib/mesa32/src/main/teximage.h | 227 + reactos/lib/mesa32/src/main/texobj.c | 1020 + reactos/lib/mesa32/src/main/texobj.h | 101 + reactos/lib/mesa32/src/main/texstate.c | 2996 +++ reactos/lib/mesa32/src/main/texstate.h | 192 + reactos/lib/mesa32/src/main/texstore.c | 2083 ++ reactos/lib/mesa32/src/main/texstore.h | 173 + reactos/lib/mesa32/src/main/texutil.c | 1035 + reactos/lib/mesa32/src/main/texutil.h | 72 + reactos/lib/mesa32/src/main/texutil_tmp.h | 526 + reactos/lib/mesa32/src/main/varray.c | 989 + reactos/lib/mesa32/src/main/varray.h | 160 + reactos/lib/mesa32/src/main/version.h | 52 + reactos/lib/mesa32/src/main/vsnprintf.c | 165 + reactos/lib/mesa32/src/main/vtxfmt.c | 174 + reactos/lib/mesa32/src/main/vtxfmt.h | 43 + reactos/lib/mesa32/src/main/vtxfmt_tmp.h | 478 + reactos/lib/mesa32/src/math/m_clip_tmp.h | 243 + reactos/lib/mesa32/src/math/m_copy_tmp.h | 86 + reactos/lib/mesa32/src/math/m_debug.h | 42 + reactos/lib/mesa32/src/math/m_debug_clip.c | 366 + reactos/lib/mesa32/src/math/m_debug_norm.c | 379 + reactos/lib/mesa32/src/math/m_debug_util.h | 281 + reactos/lib/mesa32/src/math/m_debug_xform.c | 334 + reactos/lib/mesa32/src/math/m_dotprod_tmp.h | 102 + reactos/lib/mesa32/src/math/m_eval.c | 461 + reactos/lib/mesa32/src/math/m_eval.h | 103 + reactos/lib/mesa32/src/math/m_matrix.c | 1486 ++ reactos/lib/mesa32/src/math/m_matrix.h | 248 + reactos/lib/mesa32/src/math/m_norm_tmp.h | 390 + reactos/lib/mesa32/src/math/m_trans_tmp.h | 287 + reactos/lib/mesa32/src/math/m_translate.c | 718 + reactos/lib/mesa32/src/math/m_translate.h | 106 + reactos/lib/mesa32/src/math/m_vector.c | 190 + reactos/lib/mesa32/src/math/m_vector.h | 95 + reactos/lib/mesa32/src/math/m_xform.c | 219 + reactos/lib/mesa32/src/math/m_xform.h | 216 + reactos/lib/mesa32/src/math/m_xform_tmp.h | 806 + reactos/lib/mesa32/src/math/math.dsp | 180 + reactos/lib/mesa32/src/math/mathmod.h | 41 + reactos/lib/mesa32/src/sparc/clip.S | 236 + reactos/lib/mesa32/src/sparc/glapi_sparc.S | 19243 ++++++++++++++++ reactos/lib/mesa32/src/sparc/norm.S | 603 + reactos/lib/mesa32/src/sparc/sparc.c | 187 + reactos/lib/mesa32/src/sparc/sparc.h | 38 + reactos/lib/mesa32/src/sparc/sparc_matrix.h | 170 + reactos/lib/mesa32/src/sparc/xform.S | 1387 ++ reactos/lib/mesa32/src/swrast/s_aaline.c | 554 + reactos/lib/mesa32/src/swrast/s_aaline.h | 39 + reactos/lib/mesa32/src/swrast/s_aalinetemp.h | 317 + reactos/lib/mesa32/src/swrast/s_aatriangle.c | 495 + reactos/lib/mesa32/src/swrast/s_aatriangle.h | 39 + reactos/lib/mesa32/src/swrast/s_aatritemp.h | 554 + reactos/lib/mesa32/src/swrast/s_accum.c | 527 + reactos/lib/mesa32/src/swrast/s_accum.h | 43 + reactos/lib/mesa32/src/swrast/s_alpha.c | 224 + reactos/lib/mesa32/src/swrast/s_alpha.h | 39 + reactos/lib/mesa32/src/swrast/s_alphabuf.c | 337 + reactos/lib/mesa32/src/swrast/s_alphabuf.h | 80 + reactos/lib/mesa32/src/swrast/s_bitmap.c | 256 + reactos/lib/mesa32/src/swrast/s_blend.c | 812 + reactos/lib/mesa32/src/swrast/s_blend.h | 45 + reactos/lib/mesa32/src/swrast/s_buffers.c | 287 + reactos/lib/mesa32/src/swrast/s_context.c | 683 + reactos/lib/mesa32/src/swrast/s_context.h | 383 + reactos/lib/mesa32/src/swrast/s_copypix.c | 846 + reactos/lib/mesa32/src/swrast/s_depth.c | 1777 ++ reactos/lib/mesa32/src/swrast/s_depth.h | 64 + reactos/lib/mesa32/src/swrast/s_drawpix.c | 999 + reactos/lib/mesa32/src/swrast/s_drawpix.h | 41 + reactos/lib/mesa32/src/swrast/s_feedback.c | 165 + reactos/lib/mesa32/src/swrast/s_feedback.h | 51 + reactos/lib/mesa32/src/swrast/s_fog.c | 313 + reactos/lib/mesa32/src/swrast/s_fog.h | 45 + reactos/lib/mesa32/src/swrast/s_imaging.c | 155 + reactos/lib/mesa32/src/swrast/s_lines.c | 342 + reactos/lib/mesa32/src/swrast/s_lines.h | 41 + reactos/lib/mesa32/src/swrast/s_linetemp.h | 447 + reactos/lib/mesa32/src/swrast/s_logic.c | 497 + reactos/lib/mesa32/src/swrast/s_logic.h | 45 + reactos/lib/mesa32/src/swrast/s_masking.c | 191 + reactos/lib/mesa32/src/swrast/s_masking.h | 61 + reactos/lib/mesa32/src/swrast/s_nvfragprog.c | 1382 ++ reactos/lib/mesa32/src/swrast/s_nvfragprog.h | 38 + reactos/lib/mesa32/src/swrast/s_pixeltex.c | 117 + reactos/lib/mesa32/src/swrast/s_pixeltex.h | 38 + reactos/lib/mesa32/src/swrast/s_points.c | 275 + reactos/lib/mesa32/src/swrast/s_points.h | 39 + reactos/lib/mesa32/src/swrast/s_pointtemp.h | 384 + reactos/lib/mesa32/src/swrast/s_readpix.c | 535 + reactos/lib/mesa32/src/swrast/s_span.c | 1520 ++ reactos/lib/mesa32/src/swrast/s_span.h | 75 + reactos/lib/mesa32/src/swrast/s_spantemp.h | 376 + reactos/lib/mesa32/src/swrast/s_stencil.c | 1326 ++ reactos/lib/mesa32/src/swrast/s_stencil.h | 59 + reactos/lib/mesa32/src/swrast/s_texstore.c | 429 + reactos/lib/mesa32/src/swrast/s_texture.c | 4292 ++++ reactos/lib/mesa32/src/swrast/s_texture.h | 47 + reactos/lib/mesa32/src/swrast/s_triangle.c | 1155 + reactos/lib/mesa32/src/swrast/s_triangle.h | 51 + reactos/lib/mesa32/src/swrast/s_trispan.h | 31 + reactos/lib/mesa32/src/swrast/s_tritemp.h | 1183 + reactos/lib/mesa32/src/swrast/s_zoom.c | 428 + reactos/lib/mesa32/src/swrast/s_zoom.h | 54 + reactos/lib/mesa32/src/swrast/swrast.dsp | 324 + reactos/lib/mesa32/src/swrast/swrast.h | 458 + .../lib/mesa32/src/swrast_setup/ss_context.c | 250 + .../lib/mesa32/src/swrast_setup/ss_context.h | 45 + .../lib/mesa32/src/swrast_setup/ss_triangle.c | 314 + .../lib/mesa32/src/swrast_setup/ss_triangle.h | 39 + .../lib/mesa32/src/swrast_setup/ss_tritmp.h | 209 + reactos/lib/mesa32/src/swrast_setup/ss_vb.h | 38 + .../mesa32/src/swrast_setup/swrast_setup.dsp | 124 + .../mesa32/src/swrast_setup/swrast_setup.h | 61 + reactos/lib/mesa32/src/tnl/t_array_api.c | 441 + reactos/lib/mesa32/src/tnl/t_array_api.h | 46 + reactos/lib/mesa32/src/tnl/t_array_import.c | 360 + reactos/lib/mesa32/src/tnl/t_array_import.h | 36 + reactos/lib/mesa32/src/tnl/t_context.c | 261 + reactos/lib/mesa32/src/tnl/t_context.h | 734 + reactos/lib/mesa32/src/tnl/t_pipeline.c | 216 + reactos/lib/mesa32/src/tnl/t_pipeline.h | 75 + reactos/lib/mesa32/src/tnl/t_save_api.c | 1587 ++ reactos/lib/mesa32/src/tnl/t_save_api.h | 58 + reactos/lib/mesa32/src/tnl/t_save_loopback.c | 305 + reactos/lib/mesa32/src/tnl/t_save_playback.c | 217 + reactos/lib/mesa32/src/tnl/t_vb_cliptmp.h | 270 + reactos/lib/mesa32/src/tnl/t_vb_fog.c | 254 + reactos/lib/mesa32/src/tnl/t_vb_light.c | 367 + reactos/lib/mesa32/src/tnl/t_vb_lighttmp.h | 817 + reactos/lib/mesa32/src/tnl/t_vb_normals.c | 201 + reactos/lib/mesa32/src/tnl/t_vb_points.c | 124 + reactos/lib/mesa32/src/tnl/t_vb_program.c | 365 + reactos/lib/mesa32/src/tnl/t_vb_render.c | 377 + reactos/lib/mesa32/src/tnl/t_vb_rendertmp.h | 440 + reactos/lib/mesa32/src/tnl/t_vb_texgen.c | 691 + reactos/lib/mesa32/src/tnl/t_vb_texmat.c | 150 + reactos/lib/mesa32/src/tnl/t_vb_vertex.c | 303 + reactos/lib/mesa32/src/tnl/t_vertex.c | 1066 + reactos/lib/mesa32/src/tnl/t_vertex.h | 119 + reactos/lib/mesa32/src/tnl/t_vtx_api.c | 1194 + reactos/lib/mesa32/src/tnl/t_vtx_api.h | 58 + reactos/lib/mesa32/src/tnl/t_vtx_eval.c | 253 + reactos/lib/mesa32/src/tnl/t_vtx_exec.c | 289 + reactos/lib/mesa32/src/tnl/tnl.dsp | 212 + reactos/lib/mesa32/src/tnl/tnl.h | 78 + reactos/lib/mesa32/src/tnl_dd/imm/NOTES.imm | 112 + .../lib/mesa32/src/tnl_dd/imm/t_dd_imm_capi.h | 419 + .../lib/mesa32/src/tnl_dd/imm/t_dd_imm_napi.h | 226 + .../mesa32/src/tnl_dd/imm/t_dd_imm_primtmp.h | 570 + .../lib/mesa32/src/tnl_dd/imm/t_dd_imm_tapi.h | 75 + .../lib/mesa32/src/tnl_dd/imm/t_dd_imm_vapi.h | 159 + .../lib/mesa32/src/tnl_dd/imm/t_dd_imm_vb.c | 204 + .../mesa32/src/tnl_dd/imm/t_dd_imm_vbtmp.h | 268 + reactos/lib/mesa32/src/tnl_dd/t_dd.c | 58 + reactos/lib/mesa32/src/tnl_dd/t_dd_dmatmp.h | 1234 + reactos/lib/mesa32/src/tnl_dd/t_dd_dmatmp2.h | 914 + .../lib/mesa32/src/tnl_dd/t_dd_rendertmp.h | 434 + reactos/lib/mesa32/src/tnl_dd/t_dd_triemit.h | 157 + reactos/lib/mesa32/src/tnl_dd/t_dd_tritmp.h | 743 + reactos/lib/mesa32/src/tnl_dd/t_dd_unfilled.h | 212 + reactos/lib/mesa32/src/tnl_dd/t_dd_vb.c | 344 + reactos/lib/mesa32/src/tnl_dd/t_dd_vbtmp.h | 665 + reactos/lib/mesa32/src/tnl_dd/t_dd_vertex.h | 78 + reactos/lib/mesa32/src/x86/3dnow.c | 92 + reactos/lib/mesa32/src/x86/3dnow.h | 39 + reactos/lib/mesa32/src/x86/3dnow_normal.S | 836 + reactos/lib/mesa32/src/x86/3dnow_xform1.S | 423 + reactos/lib/mesa32/src/x86/3dnow_xform2.S | 464 + reactos/lib/mesa32/src/x86/3dnow_xform3.S | 548 + reactos/lib/mesa32/src/x86/3dnow_xform4.S | 557 + reactos/lib/mesa32/src/x86/assyntax.h | 1715 ++ reactos/lib/mesa32/src/x86/clip_args.h | 60 + reactos/lib/mesa32/src/x86/common_x86.c | 366 + reactos/lib/mesa32/src/x86/common_x86_asm.S | 203 + reactos/lib/mesa32/src/x86/common_x86_asm.h | 64 + .../lib/mesa32/src/x86/common_x86_features.h | 68 + .../lib/mesa32/src/x86/common_x86_macros.h | 107 + reactos/lib/mesa32/src/x86/gen_matypes.c | 251 + reactos/lib/mesa32/src/x86/glapi_x86.S | 5522 +++++ reactos/lib/mesa32/src/x86/matypes.h | 165 + reactos/lib/mesa32/src/x86/mmx.h | 51 + reactos/lib/mesa32/src/x86/mmx_blend.S | 363 + reactos/lib/mesa32/src/x86/mmx_blendtmp.h | 114 + reactos/lib/mesa32/src/x86/norm_args.h | 58 + reactos/lib/mesa32/src/x86/sse.c | 123 + reactos/lib/mesa32/src/x86/sse.h | 39 + reactos/lib/mesa32/src/x86/sse_normal.S | 252 + reactos/lib/mesa32/src/x86/sse_xform1.S | 433 + reactos/lib/mesa32/src/x86/sse_xform2.S | 452 + reactos/lib/mesa32/src/x86/sse_xform3.S | 498 + reactos/lib/mesa32/src/x86/sse_xform4.S | 226 + reactos/lib/mesa32/src/x86/x86.c | 96 + reactos/lib/mesa32/src/x86/x86.h | 36 + reactos/lib/mesa32/src/x86/x86_cliptest.S | 401 + reactos/lib/mesa32/src/x86/x86_xform2.S | 563 + reactos/lib/mesa32/src/x86/x86_xform3.S | 633 + reactos/lib/mesa32/src/x86/x86_xform4.S | 666 + reactos/lib/mesa32/src/x86/xform_args.h | 52 + 442 files changed, 253433 insertions(+) create mode 100644 reactos/lib/mesa32/src/array_cache/ac_context.c create mode 100644 reactos/lib/mesa32/src/array_cache/ac_context.h create mode 100644 reactos/lib/mesa32/src/array_cache/ac_import.c create mode 100644 reactos/lib/mesa32/src/array_cache/acache.h create mode 100644 reactos/lib/mesa32/src/array_cache/array_cache.dsp create mode 100644 reactos/lib/mesa32/src/drivers/beos/GLView.cpp create mode 100644 reactos/lib/mesa32/src/drivers/beos/GLView.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd.c create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp2.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_rendertmp.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_triemit.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_tritmp.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_unfilled.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_vb.c create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_vbtmp.h create mode 100644 reactos/lib/mesa32/src/drivers/common/t_dd_vertex.h create mode 100644 reactos/lib/mesa32/src/drivers/dos/blit.S create mode 100644 reactos/lib/mesa32/src/drivers/dos/dmesa.c create mode 100644 reactos/lib/mesa32/src/drivers/dos/dpmi.c create mode 100644 reactos/lib/mesa32/src/drivers/dos/internal.h create mode 100644 reactos/lib/mesa32/src/drivers/dos/vesa.c create mode 100644 reactos/lib/mesa32/src/drivers/dos/vesa.h create mode 100644 reactos/lib/mesa32/src/drivers/dos/vga.c create mode 100644 reactos/lib/mesa32/src/drivers/dos/vga.h create mode 100644 reactos/lib/mesa32/src/drivers/dos/video.c create mode 100644 reactos/lib/mesa32/src/drivers/dos/video.h create mode 100644 reactos/lib/mesa32/src/drivers/dos/virtual.S create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/depthtmp.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/mm.c create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/mm.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/mmx.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/spantmp.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/stenciltmp.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/texmem.c create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/texmem.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/utils.c create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/utils.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/vblank.c create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/vblank.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/xmlconfig.c create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/xmlconfig.h create mode 100644 reactos/lib/mesa32/src/drivers/dri/common/xmlpool.h create mode 100644 reactos/lib/mesa32/src/drivers/fbdev/glfbdev.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/genkgi.conf.in create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/genkgi_mode.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/genkgi_visual.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/linear.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/linear_15.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/linear_16.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/linear_24.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/linear_32.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/linear_8.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/default/stubs.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/display/fbdev.conf.in create mode 100644 reactos/lib/mesa32/src/drivers/ggi/display/fbdev_mode.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/display/fbdev_visual.c create mode 100644 reactos/lib/mesa32/src/drivers/ggi/include/ggi/mesa/debug.h create mode 100644 reactos/lib/mesa32/src/drivers/ggi/include/ggi/mesa/display_fbdev.h create mode 100644 reactos/lib/mesa32/src/drivers/ggi/include/ggi/mesa/ggimesa.h create mode 100644 reactos/lib/mesa32/src/drivers/ggi/include/ggi/mesa/ggimesa_int.h create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxapi.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxdd.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxddspan.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxddtex.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxdrv.h create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxg.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxg.h create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxglidew.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxglidew.h create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxopengl.def create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxsetup.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxsetup.h create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxtexman.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxtris.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxvb.c create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxvbtmp.h create mode 100644 reactos/lib/mesa32/src/drivers/glide/fxwgl.c create mode 100644 reactos/lib/mesa32/src/drivers/osmesa/Makefile.win create mode 100644 reactos/lib/mesa32/src/drivers/osmesa/osmesa.c create mode 100644 reactos/lib/mesa32/src/drivers/osmesa/osmesa.def create mode 100644 reactos/lib/mesa32/src/drivers/osmesa/osmesa.dsp create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa.c create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa15.c create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa15.h create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa16.c create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa16.h create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa24.c create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa24.h create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa32.c create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa32.h create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa8.c create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgamesa8.h create mode 100644 reactos/lib/mesa32/src/drivers/svga/svgapix.h create mode 100644 reactos/lib/mesa32/src/drivers/windows/gdi/colors.h create mode 100644 reactos/lib/mesa32/src/drivers/windows/gdi/gdi.dsp create mode 100644 reactos/lib/mesa32/src/drivers/windows/gdi/mesa.def create mode 100644 reactos/lib/mesa32/src/drivers/windows/gdi/wgl.c create mode 100644 reactos/lib/mesa32/src/drivers/windows/gdi/wmesa.c create mode 100644 reactos/lib/mesa32/src/drivers/windows/gdi/wmesadef.h create mode 100644 reactos/lib/mesa32/src/drivers/windows/icd/colors.h create mode 100644 reactos/lib/mesa32/src/drivers/windows/icd/icd.c create mode 100644 reactos/lib/mesa32/src/drivers/windows/icd/icdlist.h create mode 100644 reactos/lib/mesa32/src/drivers/windows/icd/mesa.def create mode 100644 reactos/lib/mesa32/src/drivers/windows/icd/wmesadef.h create mode 100644 reactos/lib/mesa32/src/drivers/x11/fakeglx.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/glxapi.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/glxapi.h create mode 100644 reactos/lib/mesa32/src/drivers/x11/glxheader.h create mode 100644 reactos/lib/mesa32/src/drivers/x11/realglx.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/realglx.h create mode 100644 reactos/lib/mesa32/src/drivers/x11/xfonts.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/xfonts.h create mode 100644 reactos/lib/mesa32/src/drivers/x11/xm_api.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/xm_dd.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/xm_line.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/xm_span.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/xm_tri.c create mode 100644 reactos/lib/mesa32/src/drivers/x11/xmesaP.h create mode 100644 reactos/lib/mesa32/src/glapi/glapi.c create mode 100644 reactos/lib/mesa32/src/glapi/glapi.dsp create mode 100644 reactos/lib/mesa32/src/glapi/glapi.h create mode 100644 reactos/lib/mesa32/src/glapi/glapioffsets.h create mode 100644 reactos/lib/mesa32/src/glapi/glapitable.h create mode 100644 reactos/lib/mesa32/src/glapi/glapitemp.h create mode 100644 reactos/lib/mesa32/src/glapi/glprocs.h create mode 100644 reactos/lib/mesa32/src/glapi/glthread.c create mode 100644 reactos/lib/mesa32/src/glapi/glthread.h create mode 100644 reactos/lib/mesa32/src/main/accum.c create mode 100644 reactos/lib/mesa32/src/main/accum.h create mode 100644 reactos/lib/mesa32/src/main/api_arrayelt.c create mode 100644 reactos/lib/mesa32/src/main/api_arrayelt.h create mode 100644 reactos/lib/mesa32/src/main/api_eval.h create mode 100644 reactos/lib/mesa32/src/main/api_loopback.c create mode 100644 reactos/lib/mesa32/src/main/api_loopback.h create mode 100644 reactos/lib/mesa32/src/main/api_noop.c create mode 100644 reactos/lib/mesa32/src/main/api_noop.h create mode 100644 reactos/lib/mesa32/src/main/api_validate.c create mode 100644 reactos/lib/mesa32/src/main/api_validate.h create mode 100644 reactos/lib/mesa32/src/main/arbfragparse.c create mode 100644 reactos/lib/mesa32/src/main/arbfragparse.h create mode 100644 reactos/lib/mesa32/src/main/arbparse.c create mode 100644 reactos/lib/mesa32/src/main/arbparse.h create mode 100644 reactos/lib/mesa32/src/main/arbparse_syn.h create mode 100644 reactos/lib/mesa32/src/main/arbprogram.c create mode 100644 reactos/lib/mesa32/src/main/arbprogram.h create mode 100644 reactos/lib/mesa32/src/main/arbvertparse.c create mode 100644 reactos/lib/mesa32/src/main/arbvertparse.h create mode 100644 reactos/lib/mesa32/src/main/attrib.c create mode 100644 reactos/lib/mesa32/src/main/attrib.h create mode 100644 reactos/lib/mesa32/src/main/blend.c create mode 100644 reactos/lib/mesa32/src/main/blend.h create mode 100644 reactos/lib/mesa32/src/main/bufferobj.c create mode 100644 reactos/lib/mesa32/src/main/bufferobj.h create mode 100644 reactos/lib/mesa32/src/main/buffers.c create mode 100644 reactos/lib/mesa32/src/main/buffers.h create mode 100644 reactos/lib/mesa32/src/main/clip.c create mode 100644 reactos/lib/mesa32/src/main/clip.h create mode 100644 reactos/lib/mesa32/src/main/colormac.h create mode 100644 reactos/lib/mesa32/src/main/colortab.c create mode 100644 reactos/lib/mesa32/src/main/colortab.h create mode 100644 reactos/lib/mesa32/src/main/config.h create mode 100644 reactos/lib/mesa32/src/main/context.c create mode 100644 reactos/lib/mesa32/src/main/context.h create mode 100644 reactos/lib/mesa32/src/main/convolve.c create mode 100644 reactos/lib/mesa32/src/main/convolve.h create mode 100644 reactos/lib/mesa32/src/main/dd.h create mode 100644 reactos/lib/mesa32/src/main/debug.c create mode 100644 reactos/lib/mesa32/src/main/debug.h create mode 100644 reactos/lib/mesa32/src/main/depth.c create mode 100644 reactos/lib/mesa32/src/main/depth.h create mode 100644 reactos/lib/mesa32/src/main/dispatch.c create mode 100644 reactos/lib/mesa32/src/main/dlist.c create mode 100644 reactos/lib/mesa32/src/main/dlist.h create mode 100644 reactos/lib/mesa32/src/main/drawpix.c create mode 100644 reactos/lib/mesa32/src/main/drawpix.h create mode 100644 reactos/lib/mesa32/src/main/enable.c create mode 100644 reactos/lib/mesa32/src/main/enable.h create mode 100644 reactos/lib/mesa32/src/main/enums.c create mode 100644 reactos/lib/mesa32/src/main/enums.h create mode 100644 reactos/lib/mesa32/src/main/eval.c create mode 100644 reactos/lib/mesa32/src/main/eval.h create mode 100644 reactos/lib/mesa32/src/main/extensions.c create mode 100644 reactos/lib/mesa32/src/main/extensions.h create mode 100644 reactos/lib/mesa32/src/main/feedback.c create mode 100644 reactos/lib/mesa32/src/main/feedback.h create mode 100644 reactos/lib/mesa32/src/main/fog.c create mode 100644 reactos/lib/mesa32/src/main/fog.h create mode 100644 reactos/lib/mesa32/src/main/get.c create mode 100644 reactos/lib/mesa32/src/main/get.h create mode 100644 reactos/lib/mesa32/src/main/glheader.h create mode 100644 reactos/lib/mesa32/src/main/hash.c create mode 100644 reactos/lib/mesa32/src/main/hash.h create mode 100644 reactos/lib/mesa32/src/main/hint.c create mode 100644 reactos/lib/mesa32/src/main/hint.h create mode 100644 reactos/lib/mesa32/src/main/histogram.c create mode 100644 reactos/lib/mesa32/src/main/histogram.h create mode 100644 reactos/lib/mesa32/src/main/image.c create mode 100644 reactos/lib/mesa32/src/main/image.h create mode 100644 reactos/lib/mesa32/src/main/imports.c create mode 100644 reactos/lib/mesa32/src/main/imports.h create mode 100644 reactos/lib/mesa32/src/main/light.c create mode 100644 reactos/lib/mesa32/src/main/light.h create mode 100644 reactos/lib/mesa32/src/main/lines.c create mode 100644 reactos/lib/mesa32/src/main/lines.h create mode 100644 reactos/lib/mesa32/src/main/macros.h create mode 100644 reactos/lib/mesa32/src/main/main.dsp create mode 100644 reactos/lib/mesa32/src/main/matrix.c create mode 100644 reactos/lib/mesa32/src/main/matrix.h create mode 100644 reactos/lib/mesa32/src/main/mtypes.h create mode 100644 reactos/lib/mesa32/src/main/nvfragparse.c create mode 100644 reactos/lib/mesa32/src/main/nvfragparse.h create mode 100644 reactos/lib/mesa32/src/main/nvfragprog.h create mode 100644 reactos/lib/mesa32/src/main/nvprogram.c create mode 100644 reactos/lib/mesa32/src/main/nvprogram.h create mode 100644 reactos/lib/mesa32/src/main/nvvertexec.c create mode 100644 reactos/lib/mesa32/src/main/nvvertexec.h create mode 100644 reactos/lib/mesa32/src/main/nvvertparse.c create mode 100644 reactos/lib/mesa32/src/main/nvvertparse.h create mode 100644 reactos/lib/mesa32/src/main/nvvertprog.h create mode 100644 reactos/lib/mesa32/src/main/occlude.c create mode 100644 reactos/lib/mesa32/src/main/occlude.h create mode 100644 reactos/lib/mesa32/src/main/pixel.c create mode 100644 reactos/lib/mesa32/src/main/pixel.h create mode 100644 reactos/lib/mesa32/src/main/points.c create mode 100644 reactos/lib/mesa32/src/main/points.h create mode 100644 reactos/lib/mesa32/src/main/polygon.c create mode 100644 reactos/lib/mesa32/src/main/polygon.h create mode 100644 reactos/lib/mesa32/src/main/program.c create mode 100644 reactos/lib/mesa32/src/main/program.h create mode 100644 reactos/lib/mesa32/src/main/rastpos.c create mode 100644 reactos/lib/mesa32/src/main/rastpos.h create mode 100644 reactos/lib/mesa32/src/main/simple_list.h create mode 100644 reactos/lib/mesa32/src/main/state.c create mode 100644 reactos/lib/mesa32/src/main/state.h create mode 100644 reactos/lib/mesa32/src/main/stencil.c create mode 100644 reactos/lib/mesa32/src/main/stencil.h create mode 100644 reactos/lib/mesa32/src/main/texcompress.c create mode 100644 reactos/lib/mesa32/src/main/texcompress.h create mode 100644 reactos/lib/mesa32/src/main/texformat.c create mode 100644 reactos/lib/mesa32/src/main/texformat.h create mode 100644 reactos/lib/mesa32/src/main/texformat_tmp.h create mode 100644 reactos/lib/mesa32/src/main/teximage.c create mode 100644 reactos/lib/mesa32/src/main/teximage.h create mode 100644 reactos/lib/mesa32/src/main/texobj.c create mode 100644 reactos/lib/mesa32/src/main/texobj.h create mode 100644 reactos/lib/mesa32/src/main/texstate.c create mode 100644 reactos/lib/mesa32/src/main/texstate.h create mode 100644 reactos/lib/mesa32/src/main/texstore.c create mode 100644 reactos/lib/mesa32/src/main/texstore.h create mode 100644 reactos/lib/mesa32/src/main/texutil.c create mode 100644 reactos/lib/mesa32/src/main/texutil.h create mode 100644 reactos/lib/mesa32/src/main/texutil_tmp.h create mode 100644 reactos/lib/mesa32/src/main/varray.c create mode 100644 reactos/lib/mesa32/src/main/varray.h create mode 100644 reactos/lib/mesa32/src/main/version.h create mode 100644 reactos/lib/mesa32/src/main/vsnprintf.c create mode 100644 reactos/lib/mesa32/src/main/vtxfmt.c create mode 100644 reactos/lib/mesa32/src/main/vtxfmt.h create mode 100644 reactos/lib/mesa32/src/main/vtxfmt_tmp.h create mode 100644 reactos/lib/mesa32/src/math/m_clip_tmp.h create mode 100644 reactos/lib/mesa32/src/math/m_copy_tmp.h create mode 100644 reactos/lib/mesa32/src/math/m_debug.h create mode 100644 reactos/lib/mesa32/src/math/m_debug_clip.c create mode 100644 reactos/lib/mesa32/src/math/m_debug_norm.c create mode 100644 reactos/lib/mesa32/src/math/m_debug_util.h create mode 100644 reactos/lib/mesa32/src/math/m_debug_xform.c create mode 100644 reactos/lib/mesa32/src/math/m_dotprod_tmp.h create mode 100644 reactos/lib/mesa32/src/math/m_eval.c create mode 100644 reactos/lib/mesa32/src/math/m_eval.h create mode 100644 reactos/lib/mesa32/src/math/m_matrix.c create mode 100644 reactos/lib/mesa32/src/math/m_matrix.h create mode 100644 reactos/lib/mesa32/src/math/m_norm_tmp.h create mode 100644 reactos/lib/mesa32/src/math/m_trans_tmp.h create mode 100644 reactos/lib/mesa32/src/math/m_translate.c create mode 100644 reactos/lib/mesa32/src/math/m_translate.h create mode 100644 reactos/lib/mesa32/src/math/m_vector.c create mode 100644 reactos/lib/mesa32/src/math/m_vector.h create mode 100644 reactos/lib/mesa32/src/math/m_xform.c create mode 100644 reactos/lib/mesa32/src/math/m_xform.h create mode 100644 reactos/lib/mesa32/src/math/m_xform_tmp.h create mode 100644 reactos/lib/mesa32/src/math/math.dsp create mode 100644 reactos/lib/mesa32/src/math/mathmod.h create mode 100644 reactos/lib/mesa32/src/sparc/clip.S create mode 100644 reactos/lib/mesa32/src/sparc/glapi_sparc.S create mode 100644 reactos/lib/mesa32/src/sparc/norm.S create mode 100644 reactos/lib/mesa32/src/sparc/sparc.c create mode 100644 reactos/lib/mesa32/src/sparc/sparc.h create mode 100644 reactos/lib/mesa32/src/sparc/sparc_matrix.h create mode 100644 reactos/lib/mesa32/src/sparc/xform.S create mode 100644 reactos/lib/mesa32/src/swrast/s_aaline.c create mode 100644 reactos/lib/mesa32/src/swrast/s_aaline.h create mode 100644 reactos/lib/mesa32/src/swrast/s_aalinetemp.h create mode 100644 reactos/lib/mesa32/src/swrast/s_aatriangle.c create mode 100644 reactos/lib/mesa32/src/swrast/s_aatriangle.h create mode 100644 reactos/lib/mesa32/src/swrast/s_aatritemp.h create mode 100644 reactos/lib/mesa32/src/swrast/s_accum.c create mode 100644 reactos/lib/mesa32/src/swrast/s_accum.h create mode 100644 reactos/lib/mesa32/src/swrast/s_alpha.c create mode 100644 reactos/lib/mesa32/src/swrast/s_alpha.h create mode 100644 reactos/lib/mesa32/src/swrast/s_alphabuf.c create mode 100644 reactos/lib/mesa32/src/swrast/s_alphabuf.h create mode 100644 reactos/lib/mesa32/src/swrast/s_bitmap.c create mode 100644 reactos/lib/mesa32/src/swrast/s_blend.c create mode 100644 reactos/lib/mesa32/src/swrast/s_blend.h create mode 100644 reactos/lib/mesa32/src/swrast/s_buffers.c create mode 100644 reactos/lib/mesa32/src/swrast/s_context.c create mode 100644 reactos/lib/mesa32/src/swrast/s_context.h create mode 100644 reactos/lib/mesa32/src/swrast/s_copypix.c create mode 100644 reactos/lib/mesa32/src/swrast/s_depth.c create mode 100644 reactos/lib/mesa32/src/swrast/s_depth.h create mode 100644 reactos/lib/mesa32/src/swrast/s_drawpix.c create mode 100644 reactos/lib/mesa32/src/swrast/s_drawpix.h create mode 100644 reactos/lib/mesa32/src/swrast/s_feedback.c create mode 100644 reactos/lib/mesa32/src/swrast/s_feedback.h create mode 100644 reactos/lib/mesa32/src/swrast/s_fog.c create mode 100644 reactos/lib/mesa32/src/swrast/s_fog.h create mode 100644 reactos/lib/mesa32/src/swrast/s_imaging.c create mode 100644 reactos/lib/mesa32/src/swrast/s_lines.c create mode 100644 reactos/lib/mesa32/src/swrast/s_lines.h create mode 100644 reactos/lib/mesa32/src/swrast/s_linetemp.h create mode 100644 reactos/lib/mesa32/src/swrast/s_logic.c create mode 100644 reactos/lib/mesa32/src/swrast/s_logic.h create mode 100644 reactos/lib/mesa32/src/swrast/s_masking.c create mode 100644 reactos/lib/mesa32/src/swrast/s_masking.h create mode 100644 reactos/lib/mesa32/src/swrast/s_nvfragprog.c create mode 100644 reactos/lib/mesa32/src/swrast/s_nvfragprog.h create mode 100644 reactos/lib/mesa32/src/swrast/s_pixeltex.c create mode 100644 reactos/lib/mesa32/src/swrast/s_pixeltex.h create mode 100644 reactos/lib/mesa32/src/swrast/s_points.c create mode 100644 reactos/lib/mesa32/src/swrast/s_points.h create mode 100644 reactos/lib/mesa32/src/swrast/s_pointtemp.h create mode 100644 reactos/lib/mesa32/src/swrast/s_readpix.c create mode 100644 reactos/lib/mesa32/src/swrast/s_span.c create mode 100644 reactos/lib/mesa32/src/swrast/s_span.h create mode 100644 reactos/lib/mesa32/src/swrast/s_spantemp.h create mode 100644 reactos/lib/mesa32/src/swrast/s_stencil.c create mode 100644 reactos/lib/mesa32/src/swrast/s_stencil.h create mode 100644 reactos/lib/mesa32/src/swrast/s_texstore.c create mode 100644 reactos/lib/mesa32/src/swrast/s_texture.c create mode 100644 reactos/lib/mesa32/src/swrast/s_texture.h create mode 100644 reactos/lib/mesa32/src/swrast/s_triangle.c create mode 100644 reactos/lib/mesa32/src/swrast/s_triangle.h create mode 100644 reactos/lib/mesa32/src/swrast/s_trispan.h create mode 100644 reactos/lib/mesa32/src/swrast/s_tritemp.h create mode 100644 reactos/lib/mesa32/src/swrast/s_zoom.c create mode 100644 reactos/lib/mesa32/src/swrast/s_zoom.h create mode 100644 reactos/lib/mesa32/src/swrast/swrast.dsp create mode 100644 reactos/lib/mesa32/src/swrast/swrast.h create mode 100644 reactos/lib/mesa32/src/swrast_setup/ss_context.c create mode 100644 reactos/lib/mesa32/src/swrast_setup/ss_context.h create mode 100644 reactos/lib/mesa32/src/swrast_setup/ss_triangle.c create mode 100644 reactos/lib/mesa32/src/swrast_setup/ss_triangle.h create mode 100644 reactos/lib/mesa32/src/swrast_setup/ss_tritmp.h create mode 100644 reactos/lib/mesa32/src/swrast_setup/ss_vb.h create mode 100644 reactos/lib/mesa32/src/swrast_setup/swrast_setup.dsp create mode 100644 reactos/lib/mesa32/src/swrast_setup/swrast_setup.h create mode 100644 reactos/lib/mesa32/src/tnl/t_array_api.c create mode 100644 reactos/lib/mesa32/src/tnl/t_array_api.h create mode 100644 reactos/lib/mesa32/src/tnl/t_array_import.c create mode 100644 reactos/lib/mesa32/src/tnl/t_array_import.h create mode 100644 reactos/lib/mesa32/src/tnl/t_context.c create mode 100644 reactos/lib/mesa32/src/tnl/t_context.h create mode 100644 reactos/lib/mesa32/src/tnl/t_pipeline.c create mode 100644 reactos/lib/mesa32/src/tnl/t_pipeline.h create mode 100644 reactos/lib/mesa32/src/tnl/t_save_api.c create mode 100644 reactos/lib/mesa32/src/tnl/t_save_api.h create mode 100644 reactos/lib/mesa32/src/tnl/t_save_loopback.c create mode 100644 reactos/lib/mesa32/src/tnl/t_save_playback.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_cliptmp.h create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_fog.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_light.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_lighttmp.h create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_normals.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_points.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_program.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_render.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_rendertmp.h create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_texgen.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_texmat.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vb_vertex.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vertex.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vertex.h create mode 100644 reactos/lib/mesa32/src/tnl/t_vtx_api.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vtx_api.h create mode 100644 reactos/lib/mesa32/src/tnl/t_vtx_eval.c create mode 100644 reactos/lib/mesa32/src/tnl/t_vtx_exec.c create mode 100644 reactos/lib/mesa32/src/tnl/tnl.dsp create mode 100644 reactos/lib/mesa32/src/tnl/tnl.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/NOTES.imm create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_capi.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_napi.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_primtmp.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_tapi.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_vapi.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_vb.c create mode 100644 reactos/lib/mesa32/src/tnl_dd/imm/t_dd_imm_vbtmp.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd.c create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_dmatmp.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_dmatmp2.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_rendertmp.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_triemit.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_tritmp.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_unfilled.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_vb.c create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_vbtmp.h create mode 100644 reactos/lib/mesa32/src/tnl_dd/t_dd_vertex.h create mode 100644 reactos/lib/mesa32/src/x86/3dnow.c create mode 100644 reactos/lib/mesa32/src/x86/3dnow.h create mode 100644 reactos/lib/mesa32/src/x86/3dnow_normal.S create mode 100644 reactos/lib/mesa32/src/x86/3dnow_xform1.S create mode 100644 reactos/lib/mesa32/src/x86/3dnow_xform2.S create mode 100644 reactos/lib/mesa32/src/x86/3dnow_xform3.S create mode 100644 reactos/lib/mesa32/src/x86/3dnow_xform4.S create mode 100644 reactos/lib/mesa32/src/x86/assyntax.h create mode 100644 reactos/lib/mesa32/src/x86/clip_args.h create mode 100644 reactos/lib/mesa32/src/x86/common_x86.c create mode 100644 reactos/lib/mesa32/src/x86/common_x86_asm.S create mode 100644 reactos/lib/mesa32/src/x86/common_x86_asm.h create mode 100644 reactos/lib/mesa32/src/x86/common_x86_features.h create mode 100644 reactos/lib/mesa32/src/x86/common_x86_macros.h create mode 100644 reactos/lib/mesa32/src/x86/gen_matypes.c create mode 100644 reactos/lib/mesa32/src/x86/glapi_x86.S create mode 100644 reactos/lib/mesa32/src/x86/matypes.h create mode 100644 reactos/lib/mesa32/src/x86/mmx.h create mode 100644 reactos/lib/mesa32/src/x86/mmx_blend.S create mode 100644 reactos/lib/mesa32/src/x86/mmx_blendtmp.h create mode 100644 reactos/lib/mesa32/src/x86/norm_args.h create mode 100644 reactos/lib/mesa32/src/x86/sse.c create mode 100644 reactos/lib/mesa32/src/x86/sse.h create mode 100644 reactos/lib/mesa32/src/x86/sse_normal.S create mode 100644 reactos/lib/mesa32/src/x86/sse_xform1.S create mode 100644 reactos/lib/mesa32/src/x86/sse_xform2.S create mode 100644 reactos/lib/mesa32/src/x86/sse_xform3.S create mode 100644 reactos/lib/mesa32/src/x86/sse_xform4.S create mode 100644 reactos/lib/mesa32/src/x86/x86.c create mode 100644 reactos/lib/mesa32/src/x86/x86.h create mode 100644 reactos/lib/mesa32/src/x86/x86_cliptest.S create mode 100644 reactos/lib/mesa32/src/x86/x86_xform2.S create mode 100644 reactos/lib/mesa32/src/x86/x86_xform3.S create mode 100644 reactos/lib/mesa32/src/x86/x86_xform4.S create mode 100644 reactos/lib/mesa32/src/x86/xform_args.h diff --git a/reactos/lib/mesa32/src/array_cache/ac_context.c b/reactos/lib/mesa32/src/array_cache/ac_context.c new file mode 100644 index 00000000000..ebf3a3dc47b --- /dev/null +++ b/reactos/lib/mesa32/src/array_cache/ac_context.c @@ -0,0 +1,375 @@ +/* + * Mesa 3-D graphics library + * Version: 5.1 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +#include "glheader.h" +#include "macros.h" +#include "imports.h" +#include "mtypes.h" + +#include "array_cache/ac_context.h" + + +/* + * Initialize the array fallbacks. That is, by default the fallback arrays + * point into the current vertex attribute values in ctx->Current.Attrib[] + */ +static void _ac_fallbacks_init( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *cl; + GLuint i; + + cl = &ac->Fallback.Normal; + cl->Size = 3; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) ctx->Current.Attrib[VERT_ATTRIB_NORMAL]; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Fallback.Color; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) ctx->Current.Attrib[VERT_ATTRIB_COLOR0]; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Fallback.SecondaryColor; + cl->Size = 3; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Fallback.FogCoord; + cl->Size = 1; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) &ctx->Current.Attrib[VERT_ATTRIB_FOG]; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Fallback.Index; + cl->Size = 1; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) &ctx->Current.Index; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + for (i = 0 ; i < MAX_TEXTURE_COORD_UNITS ; i++) { + cl = &ac->Fallback.TexCoord[i]; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i]; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + } + + cl = &ac->Fallback.EdgeFlag; + cl->Size = 1; + cl->Type = GL_UNSIGNED_BYTE; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) &ctx->Current.EdgeFlag; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + for (i = 0; i < VERT_ATTRIB_MAX; i++) { + cl = &ac->Fallback.Attrib[i]; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 0; + cl->Ptr = (GLubyte *) ctx->Current.Attrib[i]; + cl->Enabled = 1; + cl->Flags = CA_CLIENT_DATA; /* hack */ +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + } +} + + +/* + * Initialize the array cache pointers, types, strides, etc. + */ +static void _ac_cache_init( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *cl; + GLuint size = ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES; + GLuint i; + + cl = &ac->Cache.Vertex; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 4 * sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Cache.Normal; + cl->Size = 3; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 3 * sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Cache.Color; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 4 * sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Cache.SecondaryColor; + cl->Size = 3; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 4 * sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Cache.FogCoord; + cl->Size = 1; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + cl = &ac->Cache.Index; + cl->Size = 1; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) { + cl = &ac->Cache.TexCoord[i]; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 4 * sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + } + + cl = &ac->Cache.EdgeFlag; + cl->Size = 1; + cl->Type = GL_UNSIGNED_BYTE; + cl->Stride = 0; + cl->StrideB = sizeof(GLubyte); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + + for (i = 0 ; i < VERT_ATTRIB_MAX; i++) { + cl = &ac->Cache.Attrib[i]; + cl->Size = 4; + cl->Type = GL_FLOAT; + cl->Stride = 0; + cl->StrideB = 4 * sizeof(GLfloat); + cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size ); + cl->Enabled = 1; + cl->Flags = 0; +#if FEATURE_ARB_vertex_buffer_object + cl->BufferObj = ctx->Array.NullBufferObj; +#endif + } +} + + +/* This storage used to hold translated client data if type or stride + * need to be fixed. + */ +static void _ac_elts_init( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + GLuint size = 1000; + + ac->Elts = (GLuint *)MALLOC( sizeof(GLuint) * size ); + ac->elt_size = size; +} + +static void _ac_raw_init( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + GLuint i; + + ac->Raw.Color = ac->Fallback.Color; + ac->Raw.EdgeFlag = ac->Fallback.EdgeFlag; + ac->Raw.FogCoord = ac->Fallback.FogCoord; + ac->Raw.Index = ac->Fallback.Index; + ac->Raw.Normal = ac->Fallback.Normal; + ac->Raw.SecondaryColor = ac->Fallback.SecondaryColor; + ac->Raw.Vertex = ctx->Array.Vertex; + + ac->IsCached.Color = GL_FALSE; + ac->IsCached.EdgeFlag = GL_FALSE; + ac->IsCached.FogCoord = GL_FALSE; + ac->IsCached.Index = GL_FALSE; + ac->IsCached.Normal = GL_FALSE; + ac->IsCached.SecondaryColor = GL_FALSE; + ac->IsCached.Vertex = GL_FALSE; + + for (i = 0 ; i < MAX_TEXTURE_COORD_UNITS ; i++) { + ac->Raw.TexCoord[i] = ac->Fallback.TexCoord[i]; + ac->IsCached.TexCoord[i] = GL_FALSE; + } + + for (i = 0 ; i < VERT_ATTRIB_MAX ; i++) { + ac->Raw.Attrib[i] = ac->Fallback.Attrib[i]; + ac->IsCached.Attrib[i] = GL_FALSE; + } +} + +GLboolean _ac_CreateContext( GLcontext *ctx ) +{ + ctx->acache_context = CALLOC(sizeof(ACcontext)); + if (ctx->acache_context) { + _ac_cache_init( ctx ); + _ac_fallbacks_init( ctx ); + _ac_raw_init( ctx ); + _ac_elts_init( ctx ); + return GL_TRUE; + } + return GL_FALSE; +} + +void _ac_DestroyContext( GLcontext *ctx ) +{ + struct gl_buffer_object *nullObj = ctx->Array.NullBufferObj; + ACcontext *ac = AC_CONTEXT(ctx); + GLint i; + + /* only free vertex data if it's really a pointer to vertex data and + * not an offset into a buffer object. + */ + if (ac->Cache.Vertex.Ptr && ac->Cache.Vertex.BufferObj == nullObj) + FREE( (void *) ac->Cache.Vertex.Ptr ); + if (ac->Cache.Normal.Ptr && ac->Cache.Normal.BufferObj == nullObj) + FREE( (void *) ac->Cache.Normal.Ptr ); + if (ac->Cache.Color.Ptr && ac->Cache.Color.BufferObj == nullObj) + FREE( (void *) ac->Cache.Color.Ptr ); + if (ac->Cache.SecondaryColor.Ptr && ac->Cache.SecondaryColor.BufferObj == nullObj) + FREE( (void *) ac->Cache.SecondaryColor.Ptr ); + if (ac->Cache.EdgeFlag.Ptr && ac->Cache.EdgeFlag.BufferObj == nullObj) + FREE( (void *) ac->Cache.EdgeFlag.Ptr ); + if (ac->Cache.Index.Ptr && ac->Cache.Index.BufferObj == nullObj) + FREE( (void *) ac->Cache.Index.Ptr ); + if (ac->Cache.FogCoord.Ptr && ac->Cache.FogCoord.BufferObj == nullObj) + FREE( (void *) ac->Cache.FogCoord.Ptr ); + + for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) { + if (ac->Cache.TexCoord[i].Ptr && ac->Cache.TexCoord[i].BufferObj == nullObj) + FREE( (void *) ac->Cache.TexCoord[i].Ptr ); + } + + for (i = 0; i < VERT_ATTRIB_MAX; i++) { + if (ac->Cache.Attrib[i].Ptr && ac->Cache.Attrib[i].BufferObj == nullObj) + FREE( (void *) ac->Cache.Attrib[i].Ptr ); + } + + if (ac->Elts) + FREE( ac->Elts ); + + /* Free the context structure itself */ + FREE(ac); + ctx->acache_context = NULL; +} + +void _ac_InvalidateState( GLcontext *ctx, GLuint new_state ) +{ + AC_CONTEXT(ctx)->NewState |= new_state; + AC_CONTEXT(ctx)->NewArrayState |= ctx->Array.NewState; +} diff --git a/reactos/lib/mesa32/src/array_cache/ac_context.h b/reactos/lib/mesa32/src/array_cache/ac_context.h new file mode 100644 index 00000000000..36aded3152c --- /dev/null +++ b/reactos/lib/mesa32/src/array_cache/ac_context.h @@ -0,0 +1,99 @@ + +/* + * Mesa 3-D graphics library + * Version: 5.1 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +#ifndef _AC_CONTEXT_H +#define _AC_CONTEXT_H + +#include "glheader.h" +#include "mtypes.h" + +#include "array_cache/acache.h" + +/* These are used to make the ctx->Current values look like + * arrays (with zero StrideB). + */ +struct ac_arrays { + struct gl_client_array Vertex; + struct gl_client_array Normal; + struct gl_client_array Color; + struct gl_client_array SecondaryColor; + struct gl_client_array FogCoord; + struct gl_client_array Index; + struct gl_client_array TexCoord[MAX_TEXTURE_COORD_UNITS]; + struct gl_client_array EdgeFlag; + struct gl_client_array Attrib[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */ +}; + +struct ac_array_pointers { + struct gl_client_array *Vertex; + struct gl_client_array *Normal; + struct gl_client_array *Color; + struct gl_client_array *SecondaryColor; + struct gl_client_array *FogCoord; + struct gl_client_array *Index; + struct gl_client_array *TexCoord[MAX_TEXTURE_COORD_UNITS]; + struct gl_client_array *EdgeFlag; + struct gl_client_array *Attrib[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */ +}; + +struct ac_array_flags { + GLboolean Vertex; + GLboolean Normal; + GLboolean Color; + GLboolean SecondaryColor; + GLboolean FogCoord; + GLboolean Index; + GLboolean TexCoord[MAX_TEXTURE_COORD_UNITS]; + GLboolean EdgeFlag; + GLboolean Attrib[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */ +}; + + +typedef struct { + GLuint NewState; /* not needed? */ + GLuint NewArrayState; + + /* Facility for importing and caching array data: + */ + struct ac_arrays Fallback; + struct ac_arrays Cache; + struct ac_arrays Raw; + struct ac_array_flags IsCached; + GLuint start; + GLuint count; + + /* Facility for importing element lists: + */ + GLuint *Elts; + GLuint elt_size; + +} ACcontext; + +#define AC_CONTEXT(ctx) ((ACcontext *)ctx->acache_context) + +#endif diff --git a/reactos/lib/mesa32/src/array_cache/ac_import.c b/reactos/lib/mesa32/src/array_cache/ac_import.c new file mode 100644 index 00000000000..7ec1d00ee58 --- /dev/null +++ b/reactos/lib/mesa32/src/array_cache/ac_import.c @@ -0,0 +1,881 @@ +/* + * Mesa 3-D graphics library + * Version: 5.1 + * + * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +#include "glheader.h" +#include "macros.h" +#include "imports.h" +#include "mtypes.h" + +#include "math/m_translate.h" +#include "array_cache/ac_context.h" +#include "math/m_translate.h" + +#define STRIDE_ARRAY( array, offset ) \ +do { \ + GLubyte *tmp = ADD_POINTERS( (array).BufferObj->Data, (array).Ptr ) \ + + (offset) * (array).StrideB; \ + (array).Ptr = tmp; \ +} while (0) + + +/* Set the array pointer back to its source when the cached data is + * invalidated: + */ +static void reset_texcoord( GLcontext *ctx, GLuint unit ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.TexCoord[unit].Enabled) { + ac->Raw.TexCoord[unit] = ctx->Array.TexCoord[unit]; + STRIDE_ARRAY(ac->Raw.TexCoord[unit], ac->start); + } + else { + ac->Raw.TexCoord[unit] = ac->Fallback.TexCoord[unit]; + + if (ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][3] != 1.0) + ac->Raw.TexCoord[unit].Size = 4; + else if (ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][2] != 0.0) + ac->Raw.TexCoord[unit].Size = 3; + else + ac->Raw.TexCoord[unit].Size = 2; + } + + ac->IsCached.TexCoord[unit] = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_TEXCOORD(unit); +} + +static void reset_vertex( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + ASSERT(ctx->Array.Vertex.Enabled + || (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)); + ac->Raw.Vertex = ctx->Array.Vertex; + STRIDE_ARRAY(ac->Raw.Vertex, ac->start); + ac->IsCached.Vertex = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_VERTEX; +} + + +static void reset_normal( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.Normal.Enabled) { + ac->Raw.Normal = ctx->Array.Normal; + STRIDE_ARRAY(ac->Raw.Normal, ac->start); + } + else { + ac->Raw.Normal = ac->Fallback.Normal; + } + + ac->IsCached.Normal = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_NORMAL; +} + + +static void reset_color( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + + if (ctx->Array.Color.Enabled) { + ac->Raw.Color = ctx->Array.Color; + STRIDE_ARRAY(ac->Raw.Color, ac->start); + } + else + ac->Raw.Color = ac->Fallback.Color; + + ac->IsCached.Color = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_COLOR0; +} + + +static void reset_secondarycolor( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.SecondaryColor.Enabled & _NEW_ARRAY_COLOR1) { + ac->Raw.SecondaryColor = ctx->Array.SecondaryColor; + STRIDE_ARRAY(ac->Raw.SecondaryColor, ac->start); + } + else + ac->Raw.SecondaryColor = ac->Fallback.SecondaryColor; + + ac->IsCached.SecondaryColor = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_COLOR1; +} + + +static void reset_index( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.Index.Enabled & _NEW_ARRAY_INDEX) { + ac->Raw.Index = ctx->Array.Index; + STRIDE_ARRAY(ac->Raw.Index, ac->start); + } + else + ac->Raw.Index = ac->Fallback.Index; + + ac->IsCached.Index = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_INDEX; +} + + +static void reset_fogcoord( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.FogCoord.Enabled & _NEW_ARRAY_FOGCOORD) { + ac->Raw.FogCoord = ctx->Array.FogCoord; + STRIDE_ARRAY(ac->Raw.FogCoord, ac->start); + } + else + ac->Raw.FogCoord = ac->Fallback.FogCoord; + + ac->IsCached.FogCoord = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_FOGCOORD; +} + + +static void reset_edgeflag( GLcontext *ctx ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.EdgeFlag.Enabled & _NEW_ARRAY_EDGEFLAG) { + ac->Raw.EdgeFlag = ctx->Array.EdgeFlag; + STRIDE_ARRAY(ac->Raw.EdgeFlag, ac->start); + } + else + ac->Raw.EdgeFlag = ac->Fallback.EdgeFlag; + + ac->IsCached.EdgeFlag = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_EDGEFLAG; +} + + +static void reset_attrib( GLcontext *ctx, GLuint index ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (ctx->Array.VertexAttrib[index].Enabled) { + ac->Raw.Attrib[index] = ctx->Array.VertexAttrib[index]; + STRIDE_ARRAY(ac->Raw.Attrib[index], ac->start); + } + else + ac->Raw.Attrib[index] = ac->Fallback.Attrib[index]; + + ac->IsCached.Attrib[index] = GL_FALSE; + ac->NewArrayState &= ~_NEW_ARRAY_ATTRIB(index); +} + + +/* + * Generic import function for color data + */ +static void import( GLcontext *ctx, + GLenum type, + struct gl_client_array *to, + struct gl_client_array *from ) +{ + GLubyte *dest; + const GLubyte *src; + ACcontext *ac = AC_CONTEXT(ctx); + + if (type == 0) + type = from->Type; + + /* The dest and source data addresses are the sum of the buffer + * object's start plus the vertex array pointer/offset. + */ + dest = ADD_POINTERS(to->BufferObj->Data, to->Ptr); + src = ADD_POINTERS(from->BufferObj->Data, from->Ptr); + + switch (type) { + case GL_FLOAT: + _math_trans_4fc( (GLfloat (*)[4]) dest, + src, + from->StrideB, + from->Type, + from->Size, + 0, + ac->count - ac->start); + + to->StrideB = 4 * sizeof(GLfloat); + to->Type = GL_FLOAT; + break; + + case GL_UNSIGNED_BYTE: + _math_trans_4ub( (GLubyte (*)[4]) dest, + src, + from->StrideB, + from->Type, + from->Size, + 0, + ac->count - ac->start); + + to->StrideB = 4 * sizeof(GLubyte); + to->Type = GL_UNSIGNED_BYTE; + break; + + case GL_UNSIGNED_SHORT: + _math_trans_4us( (GLushort (*)[4]) dest, + src, + from->StrideB, + from->Type, + from->Size, + 0, + ac->count - ac->start); + + to->StrideB = 4 * sizeof(GLushort); + to->Type = GL_UNSIGNED_SHORT; + break; + + default: + ASSERT(0); + break; + } +} + + + +/* + * Functions to import array ranges with specified types and strides. + * For example, if the vertex data is GLshort[2] and we want GLfloat[3] + * we'll use an import function to do the data conversion. + */ + +static void import_texcoord( GLcontext *ctx, GLuint unit, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.TexCoord[unit]; + struct gl_client_array *to = &ac->Cache.TexCoord[unit]; + + ASSERT(unit < ctx->Const.MaxTextureCoordUnits); + + /* Limited choices at this stage: + */ + ASSERT(type == GL_FLOAT); + ASSERT(stride == 4*sizeof(GLfloat) || stride == 0); + ASSERT(ac->count - ac->start < ctx->Const.MaxArrayLockSize); + + _math_trans_4f( (GLfloat (*)[4]) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + from->Size, + 0, + ac->count - ac->start); + + to->Size = from->Size; + to->StrideB = 4 * sizeof(GLfloat); + to->Type = GL_FLOAT; + ac->IsCached.TexCoord[unit] = GL_TRUE; +} + +static void import_vertex( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.Vertex; + struct gl_client_array *to = &ac->Cache.Vertex; + + /* Limited choices at this stage: + */ + ASSERT(type == GL_FLOAT); + ASSERT(stride == 4*sizeof(GLfloat) || stride == 0); + + _math_trans_4f( (GLfloat (*)[4]) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + from->Size, + 0, + ac->count - ac->start); + + to->Size = from->Size; + to->StrideB = 4 * sizeof(GLfloat); + to->Type = GL_FLOAT; + ac->IsCached.Vertex = GL_TRUE; +} + +static void import_normal( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.Normal; + struct gl_client_array *to = &ac->Cache.Normal; + + /* Limited choices at this stage: + */ + ASSERT(type == GL_FLOAT); + ASSERT(stride == 3*sizeof(GLfloat) || stride == 0); + + _math_trans_3f( (GLfloat (*)[3]) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + 0, + ac->count - ac->start); + + to->StrideB = 3 * sizeof(GLfloat); + to->Type = GL_FLOAT; + ac->IsCached.Normal = GL_TRUE; +} + +static void import_color( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.Color; + struct gl_client_array *to = &ac->Cache.Color; + + import( ctx, type, to, from ); + + ac->IsCached.Color = GL_TRUE; +} + +static void import_index( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.Index; + struct gl_client_array *to = &ac->Cache.Index; + + /* Limited choices at this stage: + */ + ASSERT(type == GL_UNSIGNED_INT); + ASSERT(stride == sizeof(GLuint) || stride == 0); + + _math_trans_1ui( (GLuint *) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + 0, + ac->count - ac->start); + + to->StrideB = sizeof(GLuint); + to->Type = GL_UNSIGNED_INT; + ac->IsCached.Index = GL_TRUE; +} + +static void import_secondarycolor( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.SecondaryColor; + struct gl_client_array *to = &ac->Cache.SecondaryColor; + + import( ctx, type, to, from ); + + ac->IsCached.SecondaryColor = GL_TRUE; +} + +static void import_fogcoord( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.FogCoord; + struct gl_client_array *to = &ac->Cache.FogCoord; + + /* Limited choices at this stage: + */ + ASSERT(type == GL_FLOAT); + ASSERT(stride == sizeof(GLfloat) || stride == 0); + + _math_trans_1f( (GLfloat *) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + 0, + ac->count - ac->start); + + to->StrideB = sizeof(GLfloat); + to->Type = GL_FLOAT; + ac->IsCached.FogCoord = GL_TRUE; +} + +static void import_edgeflag( GLcontext *ctx, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.EdgeFlag; + struct gl_client_array *to = &ac->Cache.EdgeFlag; + + /* Limited choices at this stage: + */ + ASSERT(type == GL_UNSIGNED_BYTE); + ASSERT(stride == sizeof(GLubyte) || stride == 0); + + _math_trans_1ub( (GLubyte *) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + 0, + ac->count - ac->start); + + to->StrideB = sizeof(GLubyte); + to->Type = GL_UNSIGNED_BYTE; + ac->IsCached.EdgeFlag = GL_TRUE; +} + +static void import_attrib( GLcontext *ctx, GLuint index, + GLenum type, GLuint stride ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + struct gl_client_array *from = &ac->Raw.Attrib[index]; + struct gl_client_array *to = &ac->Cache.Attrib[index]; + + ASSERT(index < VERT_ATTRIB_MAX); + + /* Limited choices at this stage: + */ + ASSERT(type == GL_FLOAT); + ASSERT(stride == 4*sizeof(GLfloat) || stride == 0); + ASSERT(ac->count - ac->start < ctx->Const.MaxArrayLockSize); + + _math_trans_4f( (GLfloat (*)[4]) to->Ptr, + from->Ptr, + from->StrideB, + from->Type, + from->Size, + 0, + ac->count - ac->start); + + to->Size = from->Size; + to->StrideB = 4 * sizeof(GLfloat); + to->Type = GL_FLOAT; + ac->IsCached.Attrib[index] = GL_TRUE; +} + + + +/* + * Externals to request arrays with specific properties: + */ + + +struct gl_client_array *_ac_import_texcoord( GLcontext *ctx, + GLuint unit, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + ASSERT(unit < ctx->Const.MaxTextureCoordUnits); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_TEXCOORD(unit)) + reset_texcoord( ctx, unit ); + + /* Is the request impossible? + */ + if (reqsize != 0 && ac->Raw.TexCoord[unit].Size > (GLint) reqsize) + return 0; + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.TexCoord[unit].Type != type || + (reqstride != 0 && ac->Raw.TexCoord[unit].StrideB != (GLint)reqstride) || + reqwriteable) + { + if (!ac->IsCached.TexCoord[unit]) + import_texcoord(ctx, unit, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.TexCoord[unit]; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.TexCoord[unit]; + } +} + +struct gl_client_array *_ac_import_vertex( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_VERTEX) + reset_vertex( ctx ); + + /* Is the request impossible? + */ + if (reqsize != 0 && ac->Raw.Vertex.Size > (GLint) reqsize) + return 0; + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.Vertex.Type != type || + (reqstride != 0 && ac->Raw.Vertex.StrideB != (GLint) reqstride) || + reqwriteable) + { + if (!ac->IsCached.Vertex) + import_vertex(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.Vertex; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.Vertex; + } +} + +struct gl_client_array *_ac_import_normal( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_NORMAL) + reset_normal( ctx ); + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.Normal.Type != type || + (reqstride != 0 && ac->Raw.Normal.StrideB != (GLint) reqstride) || + reqwriteable) + { + if (!ac->IsCached.Normal) + import_normal(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.Normal; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.Normal; + } +} + +struct gl_client_array *_ac_import_color( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_COLOR0) + reset_color( ctx ); + + /* Is the request impossible? + */ + if (reqsize != 0 && ac->Raw.Color.Size > (GLint) reqsize) { + return 0; + } + + /* Do we need to pull in a copy of the client data: + */ + if ((type != 0 && ac->Raw.Color.Type != type) || + (reqstride != 0 && ac->Raw.Color.StrideB != (GLint) reqstride) || + reqwriteable) + { + if (!ac->IsCached.Color) + import_color(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.Color; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.Color; + } +} + +struct gl_client_array *_ac_import_index( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_INDEX) + reset_index( ctx ); + + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.Index.Type != type || + (reqstride != 0 && ac->Raw.Index.StrideB != (GLint) reqstride) || + reqwriteable) + { + if (!ac->IsCached.Index) + import_index(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.Index; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.Index; + } +} + +struct gl_client_array *_ac_import_secondarycolor( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_COLOR1) + reset_secondarycolor( ctx ); + + /* Is the request impossible? + */ + if (reqsize != 0 && ac->Raw.SecondaryColor.Size > (GLint) reqsize) + return 0; + + /* Do we need to pull in a copy of the client data: + */ + if ((type != 0 && ac->Raw.SecondaryColor.Type != type) || + (reqstride != 0 && ac->Raw.SecondaryColor.StrideB != (GLint)reqstride) || + reqwriteable) + { + if (!ac->IsCached.SecondaryColor) + import_secondarycolor(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.SecondaryColor; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.SecondaryColor; + } +} + +struct gl_client_array *_ac_import_fogcoord( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_FOGCOORD) + reset_fogcoord( ctx ); + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.FogCoord.Type != type || + (reqstride != 0 && ac->Raw.FogCoord.StrideB != (GLint) reqstride) || + reqwriteable) + { + if (!ac->IsCached.FogCoord) + import_fogcoord(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.FogCoord; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.FogCoord; + } +} + +struct gl_client_array *_ac_import_edgeflag( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_EDGEFLAG) + reset_edgeflag( ctx ); + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.EdgeFlag.Type != type || + (reqstride != 0 && ac->Raw.EdgeFlag.StrideB != (GLint) reqstride) || + reqwriteable) + { + if (!ac->IsCached.EdgeFlag) + import_edgeflag(ctx, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.EdgeFlag; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.EdgeFlag; + } +} + +/* GL_NV_vertex_program */ +struct gl_client_array *_ac_import_attrib( GLcontext *ctx, + GLuint index, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwriteable, + GLboolean *writeable ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + ASSERT(index < VERT_ATTRIB_MAX); + + /* Can we keep the existing version? + */ + if (ac->NewArrayState & _NEW_ARRAY_ATTRIB(index)) + reset_attrib( ctx, index ); + + /* Is the request impossible? + */ + if (reqsize != 0 && ac->Raw.Attrib[index].Size > (GLint) reqsize) + return NULL; + + /* Do we need to pull in a copy of the client data: + */ + if (ac->Raw.Attrib[index].Type != type || + (reqstride != 0 && ac->Raw.Attrib[index].StrideB != (GLint)reqstride) || + reqwriteable) + { + if (!ac->IsCached.Attrib[index]) + import_attrib(ctx, index, type, reqstride ); + *writeable = GL_TRUE; + return &ac->Cache.Attrib[index]; + } + else { + *writeable = GL_FALSE; + return &ac->Raw.Attrib[index]; + } +} + + +/* Clients must call this function to validate state and set bounds + * before importing any data: + */ +void _ac_import_range( GLcontext *ctx, GLuint start, GLuint count ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (!ctx->Array.LockCount) { + /* Not locked, discard cached data. Changes to lock + * status are caught via. _ac_invalidate_state(). + */ + ac->NewArrayState = _NEW_ARRAY_ALL; + ac->start = start; + ac->count = count; + } + else { + /* Locked, discard data for any disabled arrays. Require that + * the whole locked range always be dealt with, otherwise hard to + * maintain cached data in the face of clipping. + */ + ac->NewArrayState |= ~ctx->Array._Enabled; + ac->start = ctx->Array.LockFirst; + ac->count = ctx->Array.LockCount; + ASSERT(ac->start == start); /* hmm? */ + ASSERT(ac->count == count); + } +} + + + +/* Additional convienence function for importing the element list + * for glDrawElements() and glDrawRangeElements(). + */ +CONST void * +_ac_import_elements( GLcontext *ctx, + GLenum new_type, + GLuint count, + GLenum old_type, + CONST void *indices ) +{ + ACcontext *ac = AC_CONTEXT(ctx); + + if (old_type == new_type) + return indices; + + if (ac->elt_size < count * sizeof(GLuint)) { + if (ac->Elts) FREE(ac->Elts); + while (ac->elt_size < count * sizeof(GLuint)) + ac->elt_size *= 2; + ac->Elts = (GLuint *) MALLOC(ac->elt_size); + } + + switch (new_type) { + case GL_UNSIGNED_BYTE: + ASSERT(0); + return 0; + case GL_UNSIGNED_SHORT: + ASSERT(0); + return 0; + case GL_UNSIGNED_INT: { + GLuint *out = (GLuint *)ac->Elts; + GLuint i; + + switch (old_type) { + case GL_UNSIGNED_BYTE: { + CONST GLubyte *in = (CONST GLubyte *)indices; + for (i = 0 ; i < count ; i++) + out[i] = in[i]; + break; + } + case GL_UNSIGNED_SHORT: { + CONST GLushort *in = (CONST GLushort *)indices; + for (i = 0 ; i < count ; i++) + out[i] = in[i]; + break; + } + default: + ASSERT(0); + } + + return (CONST void *)out; + } + default: + ASSERT(0); + break; + } + + return 0; +} diff --git a/reactos/lib/mesa32/src/array_cache/acache.h b/reactos/lib/mesa32/src/array_cache/acache.h new file mode 100644 index 00000000000..2bb64f3656c --- /dev/null +++ b/reactos/lib/mesa32/src/array_cache/acache.h @@ -0,0 +1,132 @@ + +/* + * Mesa 3-D graphics library + * Version: 4.1 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +#ifndef _ARRAYCACHE_H +#define _ARRAYCACHE_H + +#include "mtypes.h" + + +extern GLboolean +_ac_CreateContext( GLcontext *ctx ); + +extern void +_ac_DestroyContext( GLcontext *ctx ); + +extern void +_ac_InvalidateState( GLcontext *ctx, GLuint new_state ); + +extern struct gl_client_array * +_ac_import_vertex( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_normal( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_color( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_index( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_secondarycolor( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_fogcoord( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_edgeflag( GLcontext *ctx, + GLenum type, + GLuint reqstride, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_texcoord( GLcontext *ctx, + GLuint unit, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwritable, + GLboolean *writable ); + +extern struct gl_client_array * +_ac_import_attrib( GLcontext *ctx, + GLuint index, + GLenum type, + GLuint reqstride, + GLuint reqsize, + GLboolean reqwritable, + GLboolean *writable ); + + +/* Clients must call this function to validate state and set bounds + * before importing any data: + */ +extern void +_ac_import_range( GLcontext *ctx, GLuint start, GLuint count ); + + +/* Additional convenience function: + */ +extern CONST void * +_ac_import_elements( GLcontext *ctx, + GLenum new_type, + GLuint count, + GLenum old_type, + CONST void *indices ); + + +#endif diff --git a/reactos/lib/mesa32/src/array_cache/array_cache.dsp b/reactos/lib/mesa32/src/array_cache/array_cache.dsp new file mode 100644 index 00000000000..5f1138dab5c --- /dev/null +++ b/reactos/lib/mesa32/src/array_cache/array_cache.dsp @@ -0,0 +1,108 @@ +# Microsoft Developer Studio Project File - Name="array_cache" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=array_cache - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "array_cache.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "array_cache.mak" CFG="array_cache - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "array_cache - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "array_cache - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "array_cache - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /I "../" /I "../main" /I "../glapi" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "array_cache - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /I "../" /I "../main" /I "../glapi" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "array_cache - Win32 Release" +# Name "array_cache - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\ac_context.c +# End Source File +# Begin Source File + +SOURCE=.\ac_import.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ac_context.h +# End Source File +# Begin Source File + +SOURCE=.\acache.h +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/lib/mesa32/src/drivers/beos/GLView.cpp b/reactos/lib/mesa32/src/drivers/beos/GLView.cpp new file mode 100644 index 00000000000..38da3161b30 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/beos/GLView.cpp @@ -0,0 +1,1427 @@ +/* $Id: GLView.cpp,v 1.1 2004/07/16 22:12:29 blight Exp $ */ + +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include +#include + +extern "C" { + +#include "glheader.h" +#include "buffers.h" +#include "bufferobj.h" +#include "context.h" +#include "colormac.h" +#include "depth.h" +#include "extensions.h" +#include "macros.h" +#include "matrix.h" +#include "mtypes.h" +#include "texformat.h" +#include "texobj.h" +#include "teximage.h" +#include "texstore.h" +#include "array_cache/acache.h" +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h" +#include "swrast/s_context.h" +#include "swrast/s_depth.h" +#include "swrast/s_lines.h" +#include "swrast/s_triangle.h" +#include "swrast/s_trispan.h" +#include "tnl/tnl.h" +#include "tnl/t_context.h" +#include "tnl/t_pipeline.h" + +} // extern "C" + +#include "GLView.h" + +// BeOS component ordering for B_RGBA32 bitmap format +#define BE_RCOMP 2 +#define BE_GCOMP 1 +#define BE_BCOMP 0 +#define BE_ACOMP 3 + +#define PACK_B_RGBA32(color) (color[BCOMP] | (color[GCOMP] << 8) | \ + (color[RCOMP] << 16) | (color[ACOMP] << 24)) + +#define PACK_B_RGB32(color) (color[BCOMP] | (color[GCOMP] << 8) | \ + (color[RCOMP] << 16) | 0xFF000000) + +#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord) - 1) + +// +// This object hangs off of the BGLView object. We have to use +// Be's BGLView class as-is to maintain binary compatibility (we +// can't add new members to it). Instead we just put all our data +// in this class and use BGLVIew::m_gc to point to it. +// +class MesaDriver +{ +public: + MesaDriver(); + ~MesaDriver(); + void Init(BGLView * bglview, GLcontext * c, GLvisual * v, GLframebuffer * b); + + void LockGL(); + void UnlockGL(); + void SwapBuffers() const; + void CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const; + void Draw(BRect updateRect) const; + +private: + MesaDriver(const MesaDriver &rhs); // copy constructor illegal + MesaDriver &operator=(const MesaDriver &rhs); // assignment oper. illegal + + GLcontext * m_glcontext; + GLvisual * m_glvisual; + GLframebuffer * m_glframebuffer; + + BGLView * m_bglview; + BBitmap * m_bitmap; + + GLchan m_clear_color[4]; // buffer clear color + GLuint m_clear_index; // buffer clear color index + GLint m_bottom; // used for flipping Y coords + GLuint m_width; + GLuint m_height; + + // Mesa Device Driver functions + static void UpdateState(GLcontext *ctx, GLuint new_state); + static void ClearIndex(GLcontext *ctx, GLuint index); + static void ClearColor(GLcontext *ctx, const GLfloat color[4]); + static void Clear(GLcontext *ctx, GLbitfield mask, + GLboolean all, GLint x, GLint y, + GLint width, GLint height); + static void ClearFront(GLcontext *ctx, GLboolean all, GLint x, GLint y, + GLint width, GLint height); + static void ClearBack(GLcontext *ctx, GLboolean all, GLint x, GLint y, + GLint width, GLint height); + static void Index(GLcontext *ctx, GLuint index); + static void Color(GLcontext *ctx, GLubyte r, GLubyte g, + GLubyte b, GLubyte a); + static void SetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, + GLenum mode); + static void GetBufferSize(GLframebuffer * framebuffer, GLuint *width, + GLuint *height); + static const GLubyte * GetString(GLcontext *ctx, GLenum name); + + // Front-buffer functions + static void WriteRGBASpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][4], + const GLubyte mask[]); + static void WriteRGBSpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][3], + const GLubyte mask[]); + static void WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLchan color[4], + const GLubyte mask[]); + static void WriteRGBAPixelsFront(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + CONST GLubyte rgba[][4], + const GLubyte mask[]); + static void WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLchan color[4], + const GLubyte mask[]); + static void WriteCI32SpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLuint index[], const GLubyte mask[]); + static void WriteCI8SpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLubyte index[], const GLubyte mask[]); + static void WriteMonoCISpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + GLuint colorIndex, const GLubyte mask[]); + static void WriteCI32PixelsFront(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + const GLuint index[], const GLubyte mask[]); + static void WriteMonoCIPixelsFront(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + GLuint colorIndex, const GLubyte mask[]); + static void ReadCI32SpanFront(const GLcontext *ctx, + GLuint n, GLint x, GLint y, GLuint index[]); + static void ReadRGBASpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + GLubyte rgba[][4]); + static void ReadCI32PixelsFront(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLuint indx[], const GLubyte mask[]); + static void ReadRGBAPixelsFront(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLubyte rgba[][4], const GLubyte mask[]); + + // Back buffer functions + static void WriteRGBASpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][4], + const GLubyte mask[]); + static void WriteRGBSpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][3], + const GLubyte mask[]); + static void WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLchan color[4], + const GLubyte mask[]); + static void WriteRGBAPixelsBack(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + CONST GLubyte rgba[][4], + const GLubyte mask[]); + static void WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLchan color[4], + const GLubyte mask[]); + static void WriteCI32SpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLuint index[], const GLubyte mask[]); + static void WriteCI8SpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, + const GLubyte index[], const GLubyte mask[]); + static void WriteMonoCISpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, GLuint colorIndex, + const GLubyte mask[]); + static void WriteCI32PixelsBack(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + const GLuint index[], const GLubyte mask[]); + static void WriteMonoCIPixelsBack(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLuint colorIndex, const GLubyte mask[]); + static void ReadCI32SpanBack(const GLcontext *ctx, + GLuint n, GLint x, GLint y, GLuint index[]); + static void ReadRGBASpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + GLubyte rgba[][4]); + static void ReadCI32PixelsBack(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLuint indx[], const GLubyte mask[]); + static void ReadRGBAPixelsBack(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLubyte rgba[][4], const GLubyte mask[]); + +}; + +//------------------------------------------------------------------ +// Public interface methods +//------------------------------------------------------------------ + + +// +// Input: rect - initial rectangle +// name - window name +// resizingMode - example: B_FOLLOW_NONE +// mode - usually 0 ? +// options - Bitwise-OR of BGL_* tokens +// +BGLView::BGLView(BRect rect, char *name, + ulong resizingMode, ulong mode, + ulong options) + :BView(rect, name, resizingMode, mode | B_WILL_DRAW | B_FRAME_EVENTS) // | B_FULL_UPDATE_ON_RESIZE) +{ + const GLboolean rgbFlag = (options & BGL_RGB) == BGL_RGB; + const GLboolean alphaFlag = (options & BGL_ALPHA) == BGL_ALPHA; + const GLboolean dblFlag = (options & BGL_DOUBLE) == BGL_DOUBLE; + const GLboolean stereoFlag = false; + const GLint depth = (options & BGL_DEPTH) ? 16 : 0; + const GLint stencil = (options & BGL_STENCIL) ? 8 : 0; + const GLint accum = (options & BGL_ACCUM) ? 16 : 0; + const GLint index = (options & BGL_INDEX) ? 32 : 0; + const GLint red = (options & BGL_RGB) ? 8 : 0; + const GLint green = (options & BGL_RGB) ? 8 : 0; + const GLint blue = (options & BGL_RGB) ? 8 : 0; + const GLint alpha = (options & BGL_RGB) ? 8 : 0; + + if (!rgbFlag) { + fprintf(stderr, "Mesa Warning: color index mode not supported\n"); + } + + // Allocate auxiliary data object + MesaDriver * md = new MesaDriver; + + // examine option flags and create gl_context struct + GLvisual * visual = _mesa_create_visual( rgbFlag, + dblFlag, + stereoFlag, + red, green, blue, alpha, + index, + depth, + stencil, + accum, accum, accum, accum, + 1 + ); + + // create core context + GLcontext * ctx = _mesa_create_context(visual, NULL, md, GL_FALSE); + + ctx->Driver.NewTextureObject = _mesa_new_texture_object; + ctx->Driver.DeleteTexture = _mesa_delete_texture_object; + + _mesa_initialize_context(ctx, visual, NULL, md, GL_FALSE); + + _mesa_enable_sw_extensions(ctx); + _mesa_enable_1_3_extensions(ctx); + _mesa_enable_1_4_extensions(ctx); + _mesa_enable_1_5_extensions(ctx); + + + + // create core framebuffer + GLframebuffer * buffer = _mesa_create_framebuffer(visual, + depth > 0 ? GL_TRUE : GL_FALSE, + stencil > 0 ? GL_TRUE: GL_FALSE, + accum > 0 ? GL_TRUE : GL_FALSE, + alphaFlag + ); + + /* Initialize the software rasterizer and helper modules. + */ + _swrast_CreateContext(ctx); + _ac_CreateContext(ctx); + _tnl_CreateContext(ctx); + _swsetup_CreateContext(ctx); + _swsetup_Wakeup(ctx); + + md->Init(this, ctx, visual, buffer ); + + // Hook aux data into BGLView object + m_gc = md; +} + + +BGLView::~BGLView() +{ + printf("BGLView destructor\n"); + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + delete md; +} + +void BGLView::LockGL() +{ + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->LockGL(); +} + +void BGLView::UnlockGL() +{ + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->UnlockGL(); +} + +void BGLView::SwapBuffers() +{ + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->SwapBuffers(); +} + + +void BGLView::CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height) +{ + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->CopySubBuffer(x, y, width, height); +} + + +BView * BGLView::EmbeddedView() +{ + // XXX to do + return NULL; +} + +status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest) +{ + // XXX to do + printf("BGLView::CopyPixelsOut() not implemented yet!\n"); + return B_UNSUPPORTED; +} + + +status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest) +{ + // XXX to do + printf("BGLView::CopyPixelsIn() not implemented yet!\n"); + return B_UNSUPPORTED; +} + +void BGLView::ErrorCallback(unsigned long errorCode) // GLenum errorCode) +{ + // XXX to do + printf("BGLView::ErrorCallback() not implemented yet!\n"); + return; +} + +void BGLView::Draw(BRect updateRect) +{ + // printf("BGLView::Draw()\n"); + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->Draw(updateRect); +} + +void BGLView::AttachedToWindow() +{ + BView::AttachedToWindow(); + + // don't paint window background white when resized + SetViewColor(B_TRANSPARENT_32_BIT); +} + +void BGLView::AllAttached() +{ + BView::AllAttached(); +// printf("BGLView AllAttached\n"); +} + +void BGLView::DetachedFromWindow() +{ + BView::DetachedFromWindow(); +} + +void BGLView::AllDetached() +{ + BView::AllDetached(); +// printf("BGLView AllDetached"); +} + +void BGLView::FrameResized(float width, float height) +{ + return BView::FrameResized(width, height); +} + +status_t BGLView::Perform(perform_code d, void *arg) +{ + return BView::Perform(d, arg); +} + + +status_t BGLView::Archive(BMessage *data, bool deep) const +{ + return BView::Archive(data, deep); +} + +void BGLView::MessageReceived(BMessage *msg) +{ + BView::MessageReceived(msg); +} + +void BGLView::SetResizingMode(uint32 mode) +{ + BView::SetResizingMode(mode); +} + +void BGLView::Show() +{ +// printf("BGLView Show\n"); + BView::Show(); +} + +void BGLView::Hide() +{ +// printf("BGLView Hide\n"); + BView::Hide(); +} + +BHandler *BGLView::ResolveSpecifier(BMessage *msg, int32 index, + BMessage *specifier, int32 form, + const char *property) +{ + return BView::ResolveSpecifier(msg, index, specifier, form, property); +} + +status_t BGLView::GetSupportedSuites(BMessage *data) +{ + return BView::GetSupportedSuites(data); +} + +void BGLView::DirectConnected( direct_buffer_info *info ) +{ + // XXX to do +} + +void BGLView::EnableDirectMode( bool enabled ) +{ + // XXX to do +} + + + +//---- private methods ---------- + +void BGLView::_ReservedGLView1() {} +void BGLView::_ReservedGLView2() {} +void BGLView::_ReservedGLView3() {} +void BGLView::_ReservedGLView4() {} +void BGLView::_ReservedGLView5() {} +void BGLView::_ReservedGLView6() {} +void BGLView::_ReservedGLView7() {} +void BGLView::_ReservedGLView8() {} + +#if 0 +BGLView::BGLView(const BGLView &v) + : BView(v) +{ + // XXX not sure how this should work + printf("Warning BGLView::copy constructor not implemented\n"); +} +#endif + + +BGLView &BGLView::operator=(const BGLView &v) +{ + printf("Warning BGLView::operator= not implemented\n"); + return *this; +} + +void BGLView::dither_front() +{ + // no-op +} + +bool BGLView::confirm_dither() +{ + // no-op + return false; +} + +void BGLView::draw(BRect r) +{ + // XXX no-op ??? +} + +/* Direct Window stuff */ +void BGLView::drawScanline( int x1, int x2, int y, void *data ) +{ + // no-op +} + +void BGLView::scanlineHandler(struct rasStateRec *state, + GLint x1, GLint x2) +{ + // no-op +} + +void BGLView::lock_draw() +{ + // no-op +} + +void BGLView::unlock_draw() +{ + // no-op +} + +bool BGLView::validateView() +{ + // no-op + return true; +} + +// #pragma mark - + +MesaDriver::MesaDriver() +{ + m_glcontext = NULL; + m_glvisual = NULL; + m_glframebuffer = NULL; + m_bglview = NULL; + m_bitmap = NULL; + + m_clear_color[BE_RCOMP] = 0; + m_clear_color[BE_GCOMP] = 0; + m_clear_color[BE_BCOMP] = 0; + m_clear_color[BE_ACOMP] = 0; + + m_clear_index = 0; +} + + +MesaDriver::~MesaDriver() +{ + _mesa_destroy_visual(m_glvisual); + _mesa_destroy_framebuffer(m_glframebuffer); + _mesa_destroy_context(m_glcontext); + +} + + +void MesaDriver::Init(BGLView * bglview, GLcontext * ctx, GLvisual * visual, GLframebuffer * framebuffer) +{ + m_bglview = bglview; + m_glcontext = ctx; + m_glvisual = visual; + m_glframebuffer = framebuffer; + + MesaDriver * md = (MesaDriver *) ctx->DriverCtx; + struct swrast_device_driver * swdd = _swrast_GetDeviceDriverReference( ctx ); + TNLcontext * tnl = TNL_CONTEXT(ctx); + + assert(md->m_glcontext == ctx ); + + // Use default TCL pipeline + tnl->Driver.RunPipeline = _tnl_run_pipeline; + + ctx->Driver.GetString = MesaDriver::GetString; + ctx->Driver.UpdateState = MesaDriver::UpdateState; + ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; + ctx->Driver.GetBufferSize = MesaDriver::GetBufferSize; + + ctx->Driver.Accum = _swrast_Accum; + ctx->Driver.Bitmap = _swrast_Bitmap; + ctx->Driver.Clear = MesaDriver::Clear; + // ctx->Driver.ClearIndex = MesaDriver::ClearIndex; + // ctx->Driver.ClearColor = MesaDriver::ClearColor; + ctx->Driver.CopyPixels = _swrast_CopyPixels; + ctx->Driver.DrawPixels = _swrast_DrawPixels; + ctx->Driver.ReadPixels = _swrast_ReadPixels; + ctx->Driver.DrawBuffer = _swrast_DrawBuffer; + + ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; + ctx->Driver.TexImage1D = _mesa_store_teximage1d; + ctx->Driver.TexImage2D = _mesa_store_teximage2d; + ctx->Driver.TexImage3D = _mesa_store_teximage3d; + ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; + ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; + ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; + ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; + + ctx->Driver.CompressedTexImage1D = _mesa_store_compressed_teximage1d; + ctx->Driver.CompressedTexImage2D = _mesa_store_compressed_teximage2d; + ctx->Driver.CompressedTexImage3D = _mesa_store_compressed_teximage3d; + ctx->Driver.CompressedTexSubImage1D = _mesa_store_compressed_texsubimage1d; + ctx->Driver.CompressedTexSubImage2D = _mesa_store_compressed_texsubimage2d; + ctx->Driver.CompressedTexSubImage3D = _mesa_store_compressed_texsubimage3d; + + ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; + ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; + ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; + ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; + ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; + ctx->Driver.CopyColorTable = _swrast_CopyColorTable; + ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; + ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; + ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; + + swdd->SetBuffer = MesaDriver::SetBuffer; +} + + +void MesaDriver::LockGL() +{ + m_bglview->LockLooper(); + + UpdateState(m_glcontext, 0); + _mesa_make_current(m_glcontext, m_glframebuffer); +} + + +void MesaDriver::UnlockGL() +{ + m_bglview->UnlockLooper(); + // Could call _mesa_make_current(NULL, NULL) but it would just + // hinder performance +} + + +void MesaDriver::SwapBuffers() const +{ + // _mesa_notifySwapBuffers(m_glcontext); + + if (m_bitmap) { + m_bglview->LockLooper(); + m_bglview->DrawBitmap(m_bitmap, BPoint(0, 0)); + m_bglview->UnlockLooper(); + }; +} + + +void MesaDriver::CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const +{ + if (m_bitmap) { + // Source bitmap and view's bitmap are same size. + // Source and dest rectangle are the same. + // Note (x,y) = (0,0) is the lower-left corner, have to flip Y + BRect srcAndDest; + srcAndDest.left = x; + srcAndDest.right = x + width - 1; + srcAndDest.bottom = m_bottom - y; + srcAndDest.top = srcAndDest.bottom - height + 1; + m_bglview->DrawBitmap(m_bitmap, srcAndDest, srcAndDest); + } +} + + +void MesaDriver::Draw(BRect updateRect) const +{ + if (m_bitmap) + m_bglview->DrawBitmap(m_bitmap, updateRect, updateRect); +} + + +void MesaDriver::UpdateState( GLcontext *ctx, GLuint new_state ) +{ + struct swrast_device_driver * swdd = _swrast_GetDeviceDriverReference( ctx ); + + _swrast_InvalidateState( ctx, new_state ); + _swsetup_InvalidateState( ctx, new_state ); + _ac_InvalidateState( ctx, new_state ); + _tnl_InvalidateState( ctx, new_state ); + + if (ctx->Color.DrawBuffer == GL_FRONT) { + /* read/write front buffer */ + swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanFront; + swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanFront; + swdd->WriteRGBAPixels = MesaDriver::WriteRGBAPixelsFront; + swdd->WriteMonoRGBASpan = MesaDriver::WriteMonoRGBASpanFront; + swdd->WriteMonoRGBAPixels = MesaDriver::WriteMonoRGBAPixelsFront; + swdd->WriteCI32Span = MesaDriver::WriteCI32SpanFront; + swdd->WriteCI8Span = MesaDriver::WriteCI8SpanFront; + swdd->WriteMonoCISpan = MesaDriver::WriteMonoCISpanFront; + swdd->WriteCI32Pixels = MesaDriver::WriteCI32PixelsFront; + swdd->WriteMonoCIPixels = MesaDriver::WriteMonoCIPixelsFront; + swdd->ReadRGBASpan = MesaDriver::ReadRGBASpanFront; + swdd->ReadRGBAPixels = MesaDriver::ReadRGBAPixelsFront; + swdd->ReadCI32Span = MesaDriver::ReadCI32SpanFront; + swdd->ReadCI32Pixels = MesaDriver::ReadCI32PixelsFront; + } + else { + /* read/write back buffer */ + swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanBack; + swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanBack; + swdd->WriteRGBAPixels = MesaDriver::WriteRGBAPixelsBack; + swdd->WriteMonoRGBASpan = MesaDriver::WriteMonoRGBASpanBack; + swdd->WriteMonoRGBAPixels = MesaDriver::WriteMonoRGBAPixelsBack; + swdd->WriteCI32Span = MesaDriver::WriteCI32SpanBack; + swdd->WriteCI8Span = MesaDriver::WriteCI8SpanBack; + swdd->WriteMonoCISpan = MesaDriver::WriteMonoCISpanBack; + swdd->WriteCI32Pixels = MesaDriver::WriteCI32PixelsBack; + swdd->WriteMonoCIPixels = MesaDriver::WriteMonoCIPixelsBack; + swdd->ReadRGBASpan = MesaDriver::ReadRGBASpanBack; + swdd->ReadRGBAPixels = MesaDriver::ReadRGBAPixelsBack; + swdd->ReadCI32Span = MesaDriver::ReadCI32SpanBack; + swdd->ReadCI32Pixels = MesaDriver::ReadCI32PixelsBack; + } +} + + +void MesaDriver::ClearIndex(GLcontext *ctx, GLuint index) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + md->m_clear_index = index; +} + + +void MesaDriver::ClearColor(GLcontext *ctx, const GLfloat color[4]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_RCOMP], color[0]); + CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_GCOMP], color[1]); + CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_BCOMP], color[2]); + CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_ACOMP], color[3]); + assert(md->m_bglview); +} + + +void MesaDriver::Clear(GLcontext *ctx, GLbitfield mask, + GLboolean all, GLint x, GLint y, + GLint width, GLint height) +{ + if (mask & DD_FRONT_LEFT_BIT) + ClearFront(ctx, all, x, y, width, height); + if (mask & DD_BACK_LEFT_BIT) + ClearBack(ctx, all, x, y, width, height); + + mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT); + if (mask) + _swrast_Clear( ctx, mask, all, x, y, width, height ); + + return; +} + + +void MesaDriver::ClearFront(GLcontext *ctx, + GLboolean all, GLint x, GLint y, + GLint width, GLint height) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + + bglview->SetHighColor(md->m_clear_color[BE_RCOMP], + md->m_clear_color[BE_GCOMP], + md->m_clear_color[BE_BCOMP], + md->m_clear_color[BE_ACOMP]); + bglview->SetLowColor(md->m_clear_color[BE_RCOMP], + md->m_clear_color[BE_GCOMP], + md->m_clear_color[BE_BCOMP], + md->m_clear_color[BE_ACOMP]); + if (all) { + BRect b = bglview->Bounds(); + bglview->FillRect(b); + } + else { + // XXX untested + BRect b; + b.left = x; + b.right = x + width; + b.bottom = md->m_height - y - 1; + b.top = b.bottom - height; + bglview->FillRect(b); + } + + // restore drawing color +#if 0 + bglview->SetHighColor(md->mColor[BE_RCOMP], + md->mColor[BE_GCOMP], + md->mColor[BE_BCOMP], + md->mColor[BE_ACOMP]); + bglview->SetLowColor(md->mColor[BE_RCOMP], + md->mColor[BE_GCOMP], + md->mColor[BE_BCOMP], + md->mColor[BE_ACOMP]); +#endif +} + + +void MesaDriver::ClearBack(GLcontext *ctx, + GLboolean all, GLint x, GLint y, + GLint width, GLint height) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + BBitmap *bitmap = md->m_bitmap; + assert(bitmap); + GLuint *start = (GLuint *) bitmap->Bits(); + const GLuint *clearPixelPtr = (const GLuint *) md->m_clear_color; + const GLuint clearPixel = *clearPixelPtr; + + if (all) { + const int numPixels = md->m_width * md->m_height; + if (clearPixel == 0) { + memset(start, 0, numPixels * 4); + } + else { + for (int i = 0; i < numPixels; i++) { + start[i] = clearPixel; + } + } + } + else { + // XXX untested + start += y * md->m_width + x; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + start[j] = clearPixel; + } + start += md->m_width; + } + } +} + + +void MesaDriver::SetBuffer(GLcontext *ctx, GLframebuffer *buffer, + GLenum mode) +{ + /* TODO */ + (void) ctx; + (void) buffer; + (void) mode; +} + +void MesaDriver::GetBufferSize(GLframebuffer * framebuffer, GLuint *width, + GLuint *height) +{ + GET_CURRENT_CONTEXT(ctx); + if (!ctx) + return; + + MesaDriver * md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + + BRect b = bglview->Bounds(); + *width = (GLuint) b.IntegerWidth() + 1; // (b.right - b.left + 1); + *height = (GLuint) b.IntegerHeight() + 1; // (b.bottom - b.top + 1); + md->m_bottom = (GLint) b.bottom; + + if (ctx->Visual.doubleBufferMode) { + if (*width != md->m_width || *height != md->m_height) { + // allocate new size of back buffer bitmap + if (md->m_bitmap) + delete md->m_bitmap; + BRect rect(0.0, 0.0, *width - 1, *height - 1); + md->m_bitmap = new BBitmap(rect, B_RGBA32); + } + } + else + { + md->m_bitmap = NULL; + } + + md->m_width = *width; + md->m_height = *height; +} + + +const GLubyte *MesaDriver::GetString(GLcontext *ctx, GLenum name) +{ + switch (name) { + case GL_RENDERER: + return (const GLubyte *) "Mesa BGLView (software)"; + default: + // Let core library handle all other cases + return NULL; + } +} + + +// Plot a pixel. (0,0) is upper-left corner +// This is only used when drawing to the front buffer. +inline void Plot(BGLView *bglview, int x, int y) +{ + // XXX There's got to be a better way! + BPoint p(x, y), q(x+1, y); + bglview->StrokeLine(p, q); +} + + +void MesaDriver::WriteRGBASpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][4], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + int flippedY = md->m_bottom - y; + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); + Plot(bglview, x++, flippedY); + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); + Plot(bglview, x++, flippedY); + } + } +} + +void MesaDriver::WriteRGBSpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][3], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + int flippedY = md->m_bottom - y; + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); + Plot(bglview, x++, flippedY); + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); + Plot(bglview, x++, flippedY); + } + } +} + +void MesaDriver::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLchan color[4], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + int flippedY = md->m_bottom - y; + bglview->SetHighColor(color[RCOMP], color[GCOMP], color[BCOMP]); + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + Plot(bglview, x++, flippedY); + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + Plot(bglview, x++, flippedY); + } + } +} + +void MesaDriver::WriteRGBAPixelsFront(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + CONST GLubyte rgba[][4], + const GLubyte mask[] ) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); + Plot(bglview, x[i], md->m_bottom - y[i]); + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); + Plot(bglview, x[i], md->m_bottom - y[i]); + } + } +} + + +void MesaDriver::WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLchan color[4], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + // plot points using current color + bglview->SetHighColor(color[RCOMP], color[GCOMP], color[BCOMP]); + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + Plot(bglview, x[i], md->m_bottom - y[i]); + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + Plot(bglview, x[i], md->m_bottom - y[i]); + } + } +} + + +void MesaDriver::WriteCI32SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, + const GLuint index[], const GLubyte mask[] ) +{ + // XXX to do +} + +void MesaDriver::WriteCI8SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, + const GLubyte index[], const GLubyte mask[] ) +{ + // XXX to do +} + +void MesaDriver::WriteMonoCISpanFront( const GLcontext *ctx, GLuint n, + GLint x, GLint y, + GLuint colorIndex, const GLubyte mask[] ) +{ + // XXX to do +} + + +void MesaDriver::WriteCI32PixelsFront( const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLuint index[], const GLubyte mask[] ) +{ + // XXX to do +} + +void MesaDriver::WriteMonoCIPixelsFront( const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + GLuint colorIndex, const GLubyte mask[] ) +{ + // XXX to do +} + + +void MesaDriver::ReadCI32SpanFront( const GLcontext *ctx, + GLuint n, GLint x, GLint y, GLuint index[] ) +{ + printf("ReadCI32SpanFront() not implemented yet!\n"); + // XXX to do +} + + +void MesaDriver::ReadRGBASpanFront( const GLcontext *ctx, GLuint n, + GLint x, GLint y, GLubyte rgba[][4] ) +{ + printf("ReadRGBASpanFront() not implemented yet!\n"); + // XXX to do +} + + +void MesaDriver::ReadCI32PixelsFront( const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLuint indx[], const GLubyte mask[] ) +{ + printf("ReadCI32PixelsFront() not implemented yet!\n"); + // XXX to do +} + + +void MesaDriver::ReadRGBAPixelsFront( const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLubyte rgba[][4], const GLubyte mask[] ) +{ + printf("ReadRGBAPixelsFront() not implemented yet!\n"); + // XXX to do +} + + + + +void MesaDriver::WriteRGBASpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][4], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteRGBASpanBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + int row = md->m_bottom - y; + uint8 * ptr = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + x * 4; + uint32 * pixel = (uint32 *) ptr; + + if (mask) { + while(n--) { + if (*mask++) + *pixel = PACK_B_RGBA32(rgba[0]); + pixel++; + rgba++; + }; + } else { + while(n--) { + *pixel++ = PACK_B_RGBA32(rgba[0]); + rgba++; + }; + }; + } + + +void MesaDriver::WriteRGBSpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgb[][3], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteRGBSpanBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + int row = md->m_bottom - y; + uint8 * ptr = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + x * 4; + uint32 * pixel = (uint32 *) ptr; + + if (mask) { + while(n--) { + if (*mask++) + *pixel = PACK_B_RGB32(rgb[0]); + pixel++; + rgb++; + }; + } else { + while(n--) { + *pixel++ = PACK_B_RGB32(rgb[0]); + rgb++; + }; + }; +} + + + + +void MesaDriver::WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLchan color[4], const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteMonoRGBASpanBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + int row = md->m_bottom - y; + uint8 * ptr = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + x * 4; + uint32 * pixel = (uint32 *) ptr; + uint32 pixel_color = PACK_B_RGBA32(color); + + if (mask) { + while(n--) { + if (*mask++) + *pixel = pixel_color; + pixel++; + }; + } else { + while(n--) { + *pixel++ = pixel_color; + }; + }; +} + + +void MesaDriver::WriteRGBAPixelsBack(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + CONST GLubyte rgba[][4], + const GLubyte mask[] ) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteRGBAPixelsBack() called.\n"); + already_called = true; + } + + assert(bitmap); +#if 0 + while(n--) { + if (*mask++) { + int row = md->m_bottom - *y; + uint8 * pixel = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + *x * 4; + *((uint32 *) pixel) = PACK_B_RGBA32(rgba[0]); + }; + x++; + y++; + rgba++; + }; +#else + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + pixel[BE_RCOMP] = rgba[i][RCOMP]; + pixel[BE_GCOMP] = rgba[i][GCOMP]; + pixel[BE_BCOMP] = rgba[i][BCOMP]; + pixel[BE_ACOMP] = rgba[i][ACOMP]; + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + pixel[BE_RCOMP] = rgba[i][RCOMP]; + pixel[BE_GCOMP] = rgba[i][GCOMP]; + pixel[BE_BCOMP] = rgba[i][BCOMP]; + pixel[BE_ACOMP] = rgba[i][ACOMP]; + } + } +#endif +} + + +void MesaDriver::WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLchan color[4], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteMonoRGBAPixelsBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + uint32 pixel_color = PACK_B_RGBA32(color); +#if 0 + while(n--) { + if (*mask++) { + int row = md->m_bottom - *y; + uint8 * pixel = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + *x * 4; + + *((uint32 *) pixel) = pixel_color; + }; + x++; + y++; + }; +#else + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + GLubyte * ptr = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + *((uint32 *) ptr) = pixel_color; + } + } + } + else { + for (GLuint i = 0; i < n; i++) { + GLubyte * ptr = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + *((uint32 *) ptr) = pixel_color; + } + } +#endif +} + + +void MesaDriver::WriteCI32SpanBack( const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLuint index[], const GLubyte mask[] ) +{ + // XXX to do +} + +void MesaDriver::WriteCI8SpanBack( const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLubyte index[], const GLubyte mask[] ) +{ + // XXX to do +} + +void MesaDriver::WriteMonoCISpanBack( const GLcontext *ctx, GLuint n, + GLint x, GLint y, + GLuint colorIndex, const GLubyte mask[] ) +{ + // XXX to do +} + + +void MesaDriver::WriteCI32PixelsBack( const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLuint index[], const GLubyte mask[] ) +{ + // XXX to do +} + +void MesaDriver::WriteMonoCIPixelsBack( const GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + GLuint colorIndex, const GLubyte mask[] ) +{ + // XXX to do +} + + +void MesaDriver::ReadCI32SpanBack( const GLcontext *ctx, + GLuint n, GLint x, GLint y, GLuint index[] ) +{ + // XXX to do +} + + +void MesaDriver::ReadRGBASpanBack( const GLcontext *ctx, GLuint n, + GLint x, GLint y, GLubyte rgba[][4] ) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + const BBitmap *bitmap = md->m_bitmap; + assert(bitmap); + int row = md->m_bottom - y; + const GLubyte *pixel = (GLubyte *) bitmap->Bits() + + (row * bitmap->BytesPerRow()) + x * 4; + + for (GLuint i = 0; i < n; i++) { + rgba[i][RCOMP] = pixel[BE_RCOMP]; + rgba[i][GCOMP] = pixel[BE_GCOMP]; + rgba[i][BCOMP] = pixel[BE_BCOMP]; + rgba[i][ACOMP] = pixel[BE_ACOMP]; + pixel += 4; + } +} + + +void MesaDriver::ReadCI32PixelsBack( const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLuint indx[], const GLubyte mask[] ) +{ + // XXX to do +} + + +void MesaDriver::ReadRGBAPixelsBack( const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLubyte rgba[][4], const GLubyte mask[] ) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + const BBitmap *bitmap = md->m_bitmap; + assert(bitmap); + + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + rgba[i][RCOMP] = pixel[BE_RCOMP]; + rgba[i][GCOMP] = pixel[BE_GCOMP]; + rgba[i][BCOMP] = pixel[BE_BCOMP]; + rgba[i][ACOMP] = pixel[BE_ACOMP]; + }; + }; + } else { + for (GLuint i = 0; i < n; i++) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + rgba[i][RCOMP] = pixel[BE_RCOMP]; + rgba[i][GCOMP] = pixel[BE_GCOMP]; + rgba[i][BCOMP] = pixel[BE_BCOMP]; + rgba[i][ACOMP] = pixel[BE_ACOMP]; + }; + }; +} + + + diff --git a/reactos/lib/mesa32/src/drivers/beos/GLView.h b/reactos/lib/mesa32/src/drivers/beos/GLView.h new file mode 100644 index 00000000000..595000bb56c --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/beos/GLView.h @@ -0,0 +1,196 @@ +/******************************************************************************* +/ +/ File: GLView.h +/ +/ Copyright 1993-98, Be Incorporated, All Rights Reserved. +/ +*******************************************************************************/ + +#ifndef BGLVIEW_H +#define BGLVIEW_H + +// added by Brian Paul: +#ifndef BGL_RGB +#define BGL_RGB 0 +#define BGL_INDEX 1 +#define BGL_SINGLE 0 +#define BGL_DOUBLE 2 +#define BGL_DIRECT 0 +#define BGL_INDIRECT 4 +#define BGL_ACCUM 8 +#define BGL_ALPHA 16 +#define BGL_DEPTH 32 +#define BGL_OVERLAY 64 +#define BGL_UNDERLAY 128 +#define BGL_STENCIL 512 +#endif + + +#include +#include +#include +#include +#include +#include +#include + +class BGLView : public BView { +public: + + BGLView(BRect rect, char *name, + ulong resizingMode, ulong mode, + ulong options); + virtual ~BGLView(); + + void LockGL(); + void UnlockGL(); + void SwapBuffers(); + + // Added for Mesa (can't be virtual!) + void CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height); + + BView * EmbeddedView(); + status_t CopyPixelsOut(BPoint source, BBitmap *dest); + status_t CopyPixelsIn(BBitmap *source, BPoint dest); + + virtual void ErrorCallback(unsigned long errorCode); // GLenum errorCode); + + virtual void Draw(BRect updateRect); + + virtual void AttachedToWindow(); + virtual void AllAttached(); + virtual void DetachedFromWindow(); + virtual void AllDetached(); + + virtual void FrameResized(float width, float height); + virtual status_t Perform(perform_code d, void *arg); + + /* The public methods below, for the moment, + are just pass-throughs to BView */ + + virtual status_t Archive(BMessage *data, bool deep = true) const; + + virtual void MessageReceived(BMessage *msg); + virtual void SetResizingMode(uint32 mode); + + virtual void Show(); + virtual void Hide(); + + virtual BHandler *ResolveSpecifier(BMessage *msg, int32 index, + BMessage *specifier, int32 form, + const char *property); + virtual status_t GetSupportedSuites(BMessage *data); + + /* New public functions */ + void DirectConnected( direct_buffer_info *info ); + void EnableDirectMode( bool enabled ); + +private: + + virtual void _ReservedGLView1(); + virtual void _ReservedGLView2(); + virtual void _ReservedGLView3(); + virtual void _ReservedGLView4(); + virtual void _ReservedGLView5(); + virtual void _ReservedGLView6(); + virtual void _ReservedGLView7(); + virtual void _ReservedGLView8(); + + BGLView(const BGLView &); + BGLView &operator=(const BGLView &); + + void dither_front(); + bool confirm_dither(); + void draw(BRect r); + + void * m_gc; + uint32 m_options; + uint32 m_ditherCount; + BLocker m_drawLock; + BLocker m_displayLock; +#if OLD_GLVIEW + BView * m_embeddedFront; + BView * m_embeddedBack; +#else + void * m_clip_info; + void * _reserved1; +#endif + BBitmap * m_ditherMap; + BRect m_bounds; + int16 * m_errorBuffer[2]; + uint64 _reserved[8]; + + /* Direct Window stuff */ +private: + void drawScanline( int x1, int x2, int y, void *data ); + static void scanlineHandler(struct rasStateRec *state, GLint x1, GLint x2); + void lock_draw(); + void unlock_draw(); + bool validateView(); +}; + + + +class BGLScreen : public BWindowScreen { +public: + BGLScreen(char *name, + ulong screenMode, ulong options, + status_t *error, bool debug=false); + ~BGLScreen(); + + void LockGL(); + void UnlockGL(); + void SwapBuffers(); + virtual void ErrorCallback(GLenum errorCode); + + virtual void ScreenConnected(bool connected); + virtual void FrameResized(float width, float height); + virtual status_t Perform(perform_code d, void *arg); + + /* The public methods below, for the moment, + are just pass-throughs to BWindowScreen */ + + virtual status_t Archive(BMessage *data, bool deep = true) const; + virtual void MessageReceived(BMessage *msg); + + virtual void Show(); + virtual void Hide(); + + virtual BHandler *ResolveSpecifier(BMessage *msg, + int32 index, + BMessage *specifier, + int32 form, + const char *property); + virtual status_t GetSupportedSuites(BMessage *data); + +private: + + virtual void _ReservedGLScreen1(); + virtual void _ReservedGLScreen2(); + virtual void _ReservedGLScreen3(); + virtual void _ReservedGLScreen4(); + virtual void _ReservedGLScreen5(); + virtual void _ReservedGLScreen6(); + virtual void _ReservedGLScreen7(); + virtual void _ReservedGLScreen8(); + + BGLScreen(const BGLScreen &); + BGLScreen &operator=(const BGLScreen &); + + void * m_gc; + long m_options; + BLocker m_drawLock; + + int32 m_colorSpace; + uint32 m_screen_mode; + + uint64 _reserved[7]; +}; + + +#endif + + + + + diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd.c b/reactos/lib/mesa32/src/drivers/common/t_dd.c new file mode 100644 index 00000000000..731da5c320d --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd.c @@ -0,0 +1,58 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +static void copy_pv_rgba4_spec5( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + i810ContextPtr imesa = I810_CONTEXT( ctx ); + GLubyte *i810verts = (GLubyte *)imesa->verts; + GLuint shift = imesa->vertex_stride_shift; + i810Vertex *dst = (i810Vertex *)(i810verts + (edst << shift)); + i810Vertex *src = (i810Vertex *)(i810verts + (esrc << shift)); + dst->ui[4] = src->ui[4]; + dst->ui[5] = src->ui[5]; +} + +static void copy_pv_rgba4( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + i810ContextPtr imesa = I810_CONTEXT( ctx ); + GLubyte *i810verts = (GLubyte *)imesa->verts; + GLuint shift = imesa->vertex_stride_shift; + i810Vertex *dst = (i810Vertex *)(i810verts + (edst << shift)); + i810Vertex *src = (i810Vertex *)(i810verts + (esrc << shift)); + dst->ui[4] = src->ui[4]; +} + +static void copy_pv_rgba3( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + i810ContextPtr imesa = I810_CONTEXT( ctx ); + GLubyte *i810verts = (GLubyte *)imesa->verts; + GLuint shift = imesa->vertex_stride_shift; + i810Vertex *dst = (i810Vertex *)(i810verts + (edst << shift)); + i810Vertex *src = (i810Vertex *)(i810verts + (esrc << shift)); + dst->ui[3] = src->ui[3]; +} diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp.h b/reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp.h new file mode 100644 index 00000000000..10ff1df5f0b --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp.h @@ -0,0 +1,1093 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + + +/* Template for render stages which build and emit vertices directly + * to fixed-size dma buffers. Useful for rendering strips and other + * native primitives where clipping and per-vertex tweaks such as + * those in t_dd_tritmp.h are not required. + * + * Produces code for both inline triangles and indexed triangles. + * Where various primitive types are unaccelerated by hardware, the + * code attempts to fallback to other primitive types (quadstrips to + * tristrips, lineloops to linestrips), or to indexed vertices. + * Ultimately, a FALLBACK() macro is invoked if there is no way to + * render the primitive natively. + */ + +#if !defined(HAVE_TRIANGLES) +#error "must have at least triangles to use render template" +#endif + +#if !HAVE_ELTS +#define ELTS_VARS +#define ALLOC_ELTS( nr ) +#define EMIT_ELT( offset, elt ) +#define EMIT_TWO_ELTS( offset, elt0, elt1 ) +#define INCR_ELTS( nr ) +#define ELT_INIT(prim) +#define GET_CURRENT_VB_MAX_ELTS() 0 +#define GET_SUBSEQUENT_VB_MAX_ELTS() 0 +#define ALLOC_ELTS_NEW_PRIMITIVE(nr) +#define RELEASE_ELT_VERTS() +#define EMIT_INDEXED_VERTS( ctx, start, count ) +#endif + +#ifndef EMIT_TWO_ELTS +#define EMIT_TWO_ELTS( offset, elt0, elt1 ) \ +do { \ + EMIT_ELT( offset, elt0 ); \ + EMIT_ELT( offset+1, elt1 ); \ +} while (0) +#endif + +#ifndef FINISH +#define FINISH +#endif + +/**********************************************************************/ +/* Render whole begin/end objects */ +/**********************************************************************/ + + + +static GLboolean TAG(emit_elt_verts)( GLcontext *ctx, + GLuint start, GLuint count ) +{ + if (HAVE_ELTS) { + LOCAL_VARS; + GLuint nr = count - start; + + if ( nr >= GET_SUBSEQUENT_VB_MAX_VERTS() ) /* assumes same packing for + * indexed and regualar verts + */ + return GL_FALSE; + + NEW_PRIMITIVE(); /* finish last prim */ + EMIT_INDEXED_VERTS( ctx, start, count ); + return GL_TRUE; + } else { + return GL_FALSE; + } +} + +#if (HAVE_ELTS) +static void TAG(emit_elts)( GLcontext *ctx, GLuint *elts, GLuint nr ) +{ + GLint i; + LOCAL_VARS; + ELTS_VARS; + + ALLOC_ELTS( nr ); + + for ( i = 0 ; i < nr ; i+=2, elts += 2 ) { + EMIT_TWO_ELTS( 0, elts[0], elts[1] ); + INCR_ELTS( 2 ); + } +} +#endif + + +/*********************************************************************** + * Render non-indexed primitives. + ***********************************************************************/ + + + +static void TAG(render_points_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_POINTS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + GLuint j, nr; + + INIT( GL_POINTS ); + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + FINISH; + + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + +static void TAG(render_lines_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_LINES) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + GLuint j, nr; + + INIT( GL_LINES ); + + /* Emit whole number of lines in total and in each buffer: + */ + count -= (count-start) & 1; + currentsz -= currentsz & 1; + dmasz -= dmasz & 1; + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + FINISH; + + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_line_strip_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_LINE_STRIPS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + GLuint j, nr; + + NEW_PRIMITIVE(); /* always a new primitive */ + INIT( GL_LINE_STRIP ); + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j + 1 < count; j += nr - 1 ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + FINISH; + + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_line_loop_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_LINE_STRIPS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + GLuint j, nr; + + NEW_PRIMITIVE(); + INIT( GL_LINE_STRIP ); + + if (flags & PRIM_BEGIN) + j = start; + else + j = start + 1; + + /* Ensure last vertex won't wrap buffers: + */ + currentsz--; + dmasz--; + + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + if (j + 1 < count) { + for ( ; j + 1 < count; j += nr - 1 ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + if (start < count - 1 && (flags & PRIM_END)) + EMIT_VERTS( ctx, start, 1 ); + } + else if (start + 1 < count && (flags & PRIM_END)) { + EMIT_VERTS( ctx, start+1, 1 ); + EMIT_VERTS( ctx, start, 1 ); + } + + FINISH; + + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_triangles_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/3) * 3; + int currentsz = (GET_CURRENT_VB_MAX_VERTS()/3) * 3; + GLuint j, nr; + + INIT(GL_TRIANGLES); + + /* Emit whole number of tris in total. dmasz is already a multiple + * of 3. + */ + count -= (count-start)%3; + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + FINISH; +} + + + +static void TAG(render_tri_strip_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz; + + INIT(GL_TRIANGLE_STRIP); + NEW_PRIMITIVE(); + + currentsz = GET_CURRENT_VB_MAX_VERTS(); + + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + /* From here on emit even numbers of tris when wrapping over buffers: + */ + dmasz -= (dmasz & 1); + currentsz -= (currentsz & 1); + + for (j = start ; j + 2 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + FINISH; + + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + +static void TAG(render_tri_fan_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_TRI_FANS) { + LOCAL_VARS; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + + NEW_PRIMITIVE(); + INIT(GL_TRIANGLE_FAN); + + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { + nr = MIN2( currentsz, count - j + 1 ); + EMIT_VERTS( ctx, start, 1 ); + EMIT_VERTS( ctx, j, nr - 1 ); + currentsz = dmasz; + } + + FINISH; + + } + else { + /* Could write code to emit these as indexed vertices (for the + * g400, for instance). + */ + VERT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_poly_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_POLYGONS) { + LOCAL_VARS; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + + NEW_PRIMITIVE(); + INIT(GL_POLYGON); + + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + for (j = start + 1 ; j + 1 < count ; j += nr - 1 ) { + nr = MIN2( currentsz, count - j + 1 ); + EMIT_VERTS( ctx, start, 1 ); + EMIT_VERTS( ctx, j, nr - 1 ); + currentsz = dmasz; + } + + FINISH; + + } + else if (HAVE_TRI_FANS && !(ctx->_TriangleCaps & DD_FLATSHADE)) { + TAG(render_tri_fan_verts)( ctx, start, count, flags ); + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + +static void TAG(render_quad_strip_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + GLuint j, nr; + + if (HAVE_QUAD_STRIPS) { + LOCAL_VARS; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz; + + INIT(GL_QUAD_STRIP); + NEW_PRIMITIVE(); + + currentsz = GET_CURRENT_VB_MAX_VERTS(); + + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + dmasz -= (dmasz & 2); + currentsz -= (currentsz & 2); + + for (j = start ; j + 3 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + FINISH; + + } else if (HAVE_TRI_STRIPS && (ctx->_TriangleCaps & DD_FLATSHADE)) { + if (TAG(emit_elt_verts)( ctx, start, count )) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint j, nr; + + /* Simulate flat-shaded quadstrips using indexed vertices: + */ + NEW_PRIMITIVE(); + ELT_INIT( GL_TRIANGLES ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 1; + count -= (count-start) & 1; + currentsz -= currentsz & 1; + + if (currentsz < 12) + currentsz = dmasz; + + currentsz = currentsz/6*2; + dmasz = dmasz/6*2; + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + if (nr >= 4) { + GLint quads = (nr/2)-1; + GLint i; + ELTS_VARS; + + NEW_PRIMITIVE(); + ALLOC_ELTS_NEW_PRIMITIVE( quads*6 ); + + for ( i = j-start ; i < j-start+quads*2 ; i+=2 ) { + EMIT_TWO_ELTS( 0, (i+0), (i+1) ); + EMIT_TWO_ELTS( 2, (i+2), (i+1) ); + EMIT_TWO_ELTS( 4, (i+3), (i+2) ); + INCR_ELTS( 6 ); + } + + NEW_PRIMITIVE(); + } + currentsz = dmasz; + } + + RELEASE_ELT_VERTS(); + } + else { + /* Vertices won't fit in a single buffer or elts not available, + * VERT_FALLBACK. + */ + VERT_FALLBACK( ctx, start, count, flags ); + } + } + else if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); + + /* Emit smooth-shaded quadstrips as tristrips: + */ + NEW_PRIMITIVE(); + INIT( GL_TRIANGLE_STRIP ); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 1; + currentsz -= currentsz & 1; + count -= (count-start) & 1; + + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + + FINISH; + + } else { + VERT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_quads_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_QUADS) { + LOCAL_VARS; + int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/4) * 4; + int currentsz = (GET_CURRENT_VB_MAX_VERTS()/4) * 4; + GLuint j, nr; + + INIT(GL_QUADS); + + /* Emit whole number of quads in total. dmasz is already a multiple + * of 4. + */ + count -= (count-start)%4; + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + FINISH; + } else if (TAG(emit_elt_verts)( ctx, start, count )) { + /* Hardware doesn't have a quad primitive type -- try to + * simulate it using indexed vertices and the triangle + * primitive: + */ + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint j, nr; + + NEW_PRIMITIVE(); + ELT_INIT( GL_TRIANGLES ); + currentsz = GET_CURRENT_VB_MAX_ELTS(); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 3; + count -= (count-start) & 3; + currentsz -= currentsz & 3; + + /* Adjust for rendering as triangles: + */ + currentsz = currentsz/6*4; + dmasz = dmasz/6*4; + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr ) { + nr = MIN2( currentsz, count - j ); + if (nr >= 4) { + GLint quads = nr/4; + GLint i; + ELTS_VARS; + + NEW_PRIMITIVE(); + ALLOC_ELTS_NEW_PRIMITIVE( quads*6 ); + + for ( i = j-start ; i < j-start+quads*4 ; i+=4 ) { + EMIT_TWO_ELTS( 0, (i+0), (i+1) ); + EMIT_TWO_ELTS( 2, (i+3), (i+1) ); + EMIT_TWO_ELTS( 4, (i+2), (i+3) ); + INCR_ELTS( 6 ); + } + + NEW_PRIMITIVE(); + } + currentsz = dmasz; + } + + RELEASE_ELT_VERTS(); + } + else { + /* Vertices won't fit in a single buffer, fallback. + */ + VERT_FALLBACK( ctx, start, count, flags ); + } +} + +static void TAG(render_noop)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ +} + + + + +static render_func TAG(render_tab_verts)[GL_POLYGON+2] = +{ + TAG(render_points_verts), + TAG(render_lines_verts), + TAG(render_line_loop_verts), + TAG(render_line_strip_verts), + TAG(render_triangles_verts), + TAG(render_tri_strip_verts), + TAG(render_tri_fan_verts), + TAG(render_quads_verts), + TAG(render_quad_strip_verts), + TAG(render_poly_verts), + TAG(render_noop), +}; + + +/**************************************************************************** + * Render elts using hardware indexed verts * + ****************************************************************************/ + +#if (HAVE_ELTS) +static void TAG(render_points_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_POINTS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + GLuint j, nr; + + ELT_INIT( GL_POINTS ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr ) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + ELT_FALLBACK( ctx, start, count, flags ); + } +} + + + +static void TAG(render_lines_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_LINES) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + GLuint j, nr; + + ELT_INIT( GL_LINES ); + + /* Emit whole number of lines in total and in each buffer: + */ + count -= (count-start) & 1; + currentsz -= currentsz & 1; + dmasz -= dmasz & 1; + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr ) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + ELT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_line_strip_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_LINE_STRIPS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + GLuint j, nr; + + NEW_PRIMITIVE(); /* always a new primitive */ + ELT_INIT( GL_LINE_STRIP ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j + 1 < count; j += nr - 1 ) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + /* TODO: Try to emit as indexed lines. + */ + ELT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_line_loop_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_LINE_STRIPS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + GLuint j, nr; + + NEW_PRIMITIVE(); + ELT_INIT( GL_LINE_STRIP ); + + if (flags & PRIM_BEGIN) + j = start; + else + j = start + 1; + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + /* Ensure last vertex doesn't wrap: + */ + currentsz--; + dmasz--; + + for ( ; j + 1 < count; j += nr - 1 ) { + nr = MIN2( currentsz, count - j ); +/* NEW_PRIMITIVE(); */ + TAG(emit_elts)( ctx, elts+j, nr ); + currentsz = dmasz; + } + + if (flags & PRIM_END) + TAG(emit_elts)( ctx, elts+start, 1 ); + + NEW_PRIMITIVE(); + } else { + /* TODO: Try to emit as indexed lines */ + ELT_FALLBACK( ctx, start, count, flags ); + } +} + + +/* For verts, we still eliminate the copy from main memory to dma + * buffers. For elts, this is probably no better (worse?) than the + * standard path. + */ +static void TAG(render_triangles_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/3*3; + int currentsz; + GLuint j, nr; + + NEW_PRIMITIVE(); + ELT_INIT( GL_TRIANGLES ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + + /* Emit whole number of tris in total. dmasz is already a multiple + * of 3. + */ + count -= (count-start)%3; + currentsz -= currentsz%3; + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j < count; j += nr) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } +} + + + +static void TAG(render_tri_strip_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + GLuint j, nr; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + + NEW_PRIMITIVE(); + ELT_INIT( GL_TRIANGLE_STRIP ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + /* Keep the same winding over multiple buffers: + */ + dmasz -= (dmasz & 1); + currentsz -= (currentsz & 1); + + for (j = start ; j + 2 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + /* TODO: try to emit as indexed triangles */ + ELT_FALLBACK( ctx, start, count, flags ); + } +} + +static void TAG(render_tri_fan_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_TRI_FANS) { + LOCAL_VARS; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + + NEW_PRIMITIVE(); + ELT_INIT( GL_TRIANGLE_FAN ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { + nr = MIN2( currentsz, count - j + 1 ); + TAG(emit_elts)( ctx, elts+start, 1 ); + TAG(emit_elts)( ctx, elts+j, nr - 1 ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + /* TODO: try to emit as indexed triangles */ + ELT_FALLBACK( ctx, start, count, flags ); + } +} + + +static void TAG(render_poly_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_POLYGONS && 0) { + } else if (HAVE_TRI_FANS && !(ctx->_TriangleCaps & DD_FLATSHADE)) { + LOCAL_VARS; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + + NEW_PRIMITIVE(); + ELT_INIT( GL_TRIANGLE_FAN ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) { + NEW_BUFFER(); + currentsz = dmasz; + } + + for (j = start + 1 ; j + 1 < count ; j += nr - 1 ) { + nr = MIN2( currentsz, count - j + 1 ); + TAG(emit_elts)( ctx, elts+start, 1 ); + TAG(emit_elts)( ctx, elts+j, nr - 1 ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + ELT_FALLBACK( ctx, start, count, flags ); + } +} + +static void TAG(render_quad_strip_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_QUAD_STRIPS && 0) { + } + else if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint j, nr; + + NEW_PRIMITIVE(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 1; + count -= (count-start) & 1; + currentsz -= currentsz & 1; + + if (currentsz < 12) + currentsz = dmasz; + + if (ctx->_TriangleCaps & DD_FLATSHADE) { + ELT_INIT( GL_TRIANGLES ); + + currentsz = currentsz/6*2; + dmasz = dmasz/6*2; + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + + if (nr >= 4) + { + GLint i; + GLint quads = (nr/2)-1; + ELTS_VARS; + + + NEW_PRIMITIVE(); + ALLOC_ELTS_NEW_PRIMITIVE( quads*6 ); + + for ( i = j-start ; i < j-start+quads ; i++, elts += 2 ) { + EMIT_TWO_ELTS( 0, elts[0], elts[1] ); + EMIT_TWO_ELTS( 2, elts[2], elts[1] ); + EMIT_TWO_ELTS( 4, elts[3], elts[2] ); + INCR_ELTS( 6 ); + } + + NEW_PRIMITIVE(); + } + + currentsz = dmasz; + } + } + else { + ELT_INIT( GL_TRIANGLE_STRIP ); + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } + } +} + + +static void TAG(render_quads_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (HAVE_QUADS && 0) { + } else { + LOCAL_VARS; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; + GLuint j, nr; + + ELT_INIT( GL_TRIANGLES ); + currentsz = GET_CURRENT_VB_MAX_ELTS(); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 3; + count -= (count-start) & 3; + currentsz -= currentsz & 3; + + /* Adjust for rendering as triangles: + */ + currentsz = currentsz/6*4; + dmasz = dmasz/6*4; + + if (currentsz < 8) + currentsz = dmasz; + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + + if (nr >= 4) + { + GLint quads = nr/4; + GLint i; + ELTS_VARS; + NEW_PRIMITIVE(); + ALLOC_ELTS_NEW_PRIMITIVE( quads * 6 ); + + for ( i = j-start ; i < j-start+quads ; i++, elts += 4 ) { + EMIT_TWO_ELTS( 0, elts[0], elts[1] ); + EMIT_TWO_ELTS( 2, elts[3], elts[1] ); + EMIT_TWO_ELTS( 4, elts[2], elts[3] ); + INCR_ELTS( 6 ); + } + } + + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } +} + + + +static render_func TAG(render_tab_elts)[GL_POLYGON+2] = +{ + TAG(render_points_elts), + TAG(render_lines_elts), + TAG(render_line_loop_elts), + TAG(render_line_strip_elts), + TAG(render_triangles_elts), + TAG(render_tri_strip_elts), + TAG(render_tri_fan_elts), + TAG(render_quads_elts), + TAG(render_quad_strip_elts), + TAG(render_poly_elts), + TAG(render_noop), +}; +#endif diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp2.h b/reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp2.h new file mode 100644 index 00000000000..dd0286b453b --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_dmatmp2.h @@ -0,0 +1,935 @@ + +/* + * Mesa 3-D graphics library + * Version: 4.0.3 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + + +/* Template for render stages which build and emit vertices directly + * to fixed-size dma buffers. Useful for rendering strips and other + * native primitives where clipping and per-vertex tweaks such as + * those in t_dd_tritmp.h are not required. + * + */ + +#if !HAVE_TRIANGLES || !HAVE_POINTS || !HAVE_LINES +#error "must have points, lines & triangles to use render template" +#endif + +#if !HAVE_TRI_STRIPS || !HAVE_TRI_FANS +#error "must have tri strip and fans to use render template" +#endif + +#if !HAVE_LINE_STRIPS +#error "must have line strips to use render template" +#endif + +#if !HAVE_POLYGONS +#error "must have polygons to use render template" +#endif + +#if !HAVE_ELTS +#error "must have elts to use render template" +#endif + + +#ifndef EMIT_TWO_ELTS +#define EMIT_TWO_ELTS( dest, offset, elt0, elt1 ) \ +do { \ + (dest)[offset] = (elt0); \ + (dest)[offset+1] = (elt1); \ +} while (0) +#endif + + +/**********************************************************************/ +/* Render whole begin/end objects */ +/**********************************************************************/ + + +static ELT_TYPE *TAG(emit_elts)( GLcontext *ctx, + ELT_TYPE *dest, + GLuint *elts, GLuint nr ) +{ + GLint i; + LOCAL_VARS; + + for ( i = 0 ; i+1 < nr ; i+=2, elts += 2 ) { + EMIT_TWO_ELTS( dest, 0, elts[0], elts[1] ); + dest += 2; + } + if (i < nr) { + EMIT_ELT( dest, 0, elts[0] ); + dest += 1; + } + + return dest; +} + +static ELT_TYPE *TAG(emit_consecutive_elts)( GLcontext *ctx, + ELT_TYPE *dest, + GLuint start, GLuint nr ) +{ + GLint i; + LOCAL_VARS; + + for ( i = 0 ; i+1 < nr ; i+=2, start += 2 ) { + EMIT_TWO_ELTS( dest, 0, start, start+1 ); + dest += 2; + } + if (i < nr) { + EMIT_ELT( dest, 0, start ); + dest += 1; + } + + return dest; +} + +/*********************************************************************** + * Render non-indexed primitives. + ***********************************************************************/ + + + +static void TAG(render_points_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (start < count) { + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + EMIT_PRIM( ctx, GL_POINTS, HW_POINTS, start, count ); + } +} + +static void TAG(render_lines_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + count -= (count-start) & 1; + + if (start+1 >= count) + return; + + if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) { + RESET_STIPPLE(); + AUTO_STIPPLE( GL_TRUE ); + } + + EMIT_PRIM( ctx, GL_LINES, HW_LINES, start, count ); + + if ((flags & PRIM_END) && ctx->Line.StippleFlag) + AUTO_STIPPLE( GL_FALSE ); +} + + +static void TAG(render_line_strip_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + if (start+1 >= count) + return; + + if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) + RESET_STIPPLE(); + + + if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_LINES )) + { + int dmasz = GET_MAX_HW_ELTS(); + GLuint j, nr; + + ELT_INIT( GL_LINES, HW_LINES ); + + /* Emit whole number of lines in each full buffer. + */ + dmasz = dmasz/2; + + + for (j = start; j + 1 < count; j += nr - 1 ) { + ELT_TYPE *dest; + GLint i; + + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( (nr-1)*2 ); + + for ( i = j ; i+1 < j+nr ; i+=1 ) { + EMIT_TWO_ELTS( dest, 0, (i+0), (i+1) ); + dest += 2; + } + + CLOSE_ELTS(); + } + } + else + EMIT_PRIM( ctx, GL_LINE_STRIP, HW_LINE_STRIP, start, count ); +} + + +static void TAG(render_line_loop_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + GLuint j, nr; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + if (flags & PRIM_BEGIN) { + j = start; + if (ctx->Line.StippleFlag) + RESET_STIPPLE( ); + } + else + j = start + 1; + + if (flags & PRIM_END) { + + if (start+1 >= count) + return; + + if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_LINES )) { + int dmasz = GET_MAX_HW_ELTS(); + + ELT_INIT( GL_LINES, HW_LINES ); + + /* Emit whole number of lines in each full buffer. + */ + dmasz = dmasz/2; + + /* Ensure last vertex doesn't wrap: + */ + dmasz--; + + for (; j + 1 < count; ) { + GLint i; + ELT_TYPE *dest; + + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr*2 ); /* allocs room for 1 more line */ + + for ( i = 0 ; i < nr - 1 ; i+=1 ) { + EMIT_TWO_ELTS( dest, 0, (j+i), (j+i+1) ); + dest += 2; + } + + j += nr - 1; + + /* Emit 1 more line into space alloced above */ + if (j + 1 >= count) { + EMIT_TWO_ELTS( dest, 0, (j), (start) ); + dest += 2; + } + + CLOSE_ELTS(); + } + } + else + { + int dmasz = GET_MAX_HW_ELTS() - 1; + + ELT_INIT( GL_LINE_STRIP, HW_LINE_STRIP ); + + for ( ; j + 1 < count; ) { + nr = MIN2( dmasz, count - j ); + if (j + nr < count) { + ELT_TYPE *dest = ALLOC_ELTS( nr ); + dest = TAG(emit_consecutive_elts)( ctx, dest, j, nr ); + j += nr - 1; + CLOSE_ELTS(); + } + else if (nr) { + ELT_TYPE *dest = ALLOC_ELTS( nr + 1 ); + dest = TAG(emit_consecutive_elts)( ctx, dest, j, nr ); + dest = TAG(emit_consecutive_elts)( ctx, dest, start, 1 ); + j += nr; + CLOSE_ELTS(); + } + } + } + } else { + TAG(render_line_strip_verts)( ctx, j, count, flags ); + } +} + + +static void TAG(render_triangles_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + count -= (count-start)%3; + + if (start+2 >= count) { + return; + } + + /* need a PREFER_DISCRETE_ELT_PRIM here too.. + */ + EMIT_PRIM( ctx, GL_TRIANGLES, HW_TRIANGLES, start, count ); +} + + + +static void TAG(render_tri_strip_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + if (start + 2 >= count) + return; + + if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_TRIANGLES )) + { + int dmasz = GET_MAX_HW_ELTS(); + int parity = 0; + GLuint j, nr; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + /* Emit even number of tris in each full buffer. + */ + dmasz = dmasz/3; + dmasz -= dmasz & 1; + + for (j = start; j + 2 < count; j += nr - 2 ) { + ELT_TYPE *dest; + GLint i; + + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( (nr-2)*3 ); + + for ( i = j ; i+2 < j+nr ; i++, parity^=1 ) { + EMIT_ELT( dest, 0, (i+0+parity) ); + EMIT_ELT( dest, 1, (i+1-parity) ); + EMIT_ELT( dest, 2, (i+2) ); + dest += 3; + } + + CLOSE_ELTS(); + } + } + else if (HAVE_TRI_STRIP_1) + EMIT_PRIM( ctx, GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_1, start, count ); + else { + /* Emit the first triangle with elts, then the rest as a regular strip. + * TODO: Make this unlikely in t_imm_api.c + */ + ELT_TYPE *dest; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + dest = ALLOC_ELTS( 3 ); + EMIT_ELT( dest, 0, (start+1) ); + EMIT_ELT( dest, 1, (start+0) ); + EMIT_ELT( dest, 2, (start+2) ); + dest += 3; + CLOSE_ELTS(); + + start++; + if (start + 2 >= count) + return; + + EMIT_PRIM( ctx, GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0, start, + count ); + } +} + +static void TAG(render_tri_fan_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + if (start+2 >= count) + return; + + if (PREFER_DISCRETE_ELT_PRIM( count-start, HW_TRIANGLES )) + { + int dmasz = GET_MAX_HW_ELTS(); + GLuint j, nr; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + dmasz = dmasz/3; + + for (j = start + 1; j + 1 < count; j += nr - 1 ) { + ELT_TYPE *dest; + GLint i; + + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( (nr-1)*3 ); + + for ( i = j ; i+1 < j+nr ; i++ ) { + EMIT_ELT( dest, 0, (start) ); + EMIT_ELT( dest, 1, (i) ); + EMIT_ELT( dest, 2, (i+1) ); + dest += 3; + } + + CLOSE_ELTS(); + } + } + else { + EMIT_PRIM( ctx, GL_TRIANGLE_FAN, HW_TRIANGLE_FAN, start, count ); + } +} + + +static void TAG(render_poly_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + if (start+2 >= count) + return; + + EMIT_PRIM( ctx, GL_POLYGON, HW_POLYGON, start, count ); +} + +static void TAG(render_quad_strip_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + count -= (count-start) & 1; + + if (start+3 >= count) + return; + + if (HAVE_QUAD_STRIPS) { + EMIT_PRIM( ctx, GL_QUAD_STRIP, HW_QUAD_STRIP, start, count ); + } + else if (ctx->_TriangleCaps & DD_FLATSHADE) { + LOCAL_VARS; + int dmasz = GET_MAX_HW_ELTS(); + GLuint j, nr; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz = (dmasz/6)*2; + + for (j = start; j + 3 < count; j += nr - 2 ) { + ELT_TYPE *dest; + GLint quads, i; + + nr = MIN2( dmasz, count - j ); + quads = (nr/2)-1; + dest = ALLOC_ELTS( quads*6 ); + + for ( i = j ; i < j+quads*2 ; i+=2 ) { + EMIT_TWO_ELTS( dest, 0, (i+0), (i+1) ); + EMIT_TWO_ELTS( dest, 2, (i+2), (i+1) ); + EMIT_TWO_ELTS( dest, 4, (i+3), (i+2) ); + dest += 6; + } + + CLOSE_ELTS(); + } + } + else { + EMIT_PRIM( ctx, GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0, start, count ); + } +} + + +static void TAG(render_quads_verts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + count -= (count-start)%4; + + if (start+3 >= count) + return; + + if (HAVE_QUADS) { + EMIT_PRIM( ctx, HW_QUADS, GL_QUADS, start, count ); + } + else { + /* Hardware doesn't have a quad primitive type -- simulate it + * using indexed vertices and the triangle primitive: + */ + LOCAL_VARS; + int dmasz = GET_MAX_HW_ELTS(); + GLuint j, nr; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + /* Adjust for rendering as triangles: + */ + dmasz = (dmasz/6)*4; + + for (j = start; j < count; j += nr ) { + ELT_TYPE *dest; + GLint quads, i; + + nr = MIN2( dmasz, count - j ); + quads = nr/4; + dest = ALLOC_ELTS( quads*6 ); + + for ( i = j ; i < j+quads*4 ; i+=4 ) { + EMIT_TWO_ELTS( dest, 0, (i+0), (i+1) ); + EMIT_TWO_ELTS( dest, 2, (i+3), (i+1) ); + EMIT_TWO_ELTS( dest, 4, (i+2), (i+3) ); + dest += 6; + } + + CLOSE_ELTS(); + } + } +} + +static void TAG(render_noop)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ +} + + + + +static render_func TAG(render_tab_verts)[GL_POLYGON+2] = +{ + TAG(render_points_verts), + TAG(render_lines_verts), + TAG(render_line_loop_verts), + TAG(render_line_strip_verts), + TAG(render_triangles_verts), + TAG(render_tri_strip_verts), + TAG(render_tri_fan_verts), + TAG(render_quads_verts), + TAG(render_quad_strip_verts), + TAG(render_poly_verts), + TAG(render_noop), +}; + + +/**************************************************************************** + * Render elts using hardware indexed verts * + ****************************************************************************/ + +static void TAG(render_points_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + int dmasz = GET_MAX_HW_ELTS(); + GLuint *elts = GET_MESA_ELTS(); + GLuint j, nr; + ELT_TYPE *dest; + + ELT_INIT( GL_POINTS, HW_POINTS ); + + for (j = start; j < count; j += nr ) { + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + CLOSE_ELTS(); + } +} + + + +static void TAG(render_lines_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + int dmasz = GET_MAX_HW_ELTS(); + GLuint *elts = GET_MESA_ELTS(); + GLuint j, nr; + ELT_TYPE *dest; + + if (start+1 >= count) + return; + + if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) { + RESET_STIPPLE(); + AUTO_STIPPLE( GL_TRUE ); + } + + ELT_INIT( GL_LINES, HW_LINES ); + + /* Emit whole number of lines in total and in each buffer: + */ + count -= (count-start) & 1; + dmasz -= dmasz & 1; + + for (j = start; j < count; j += nr ) { + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + CLOSE_ELTS(); + } + + if ((flags & PRIM_END) && ctx->Line.StippleFlag) + AUTO_STIPPLE( GL_FALSE ); +} + + +static void TAG(render_line_strip_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + int dmasz = GET_MAX_HW_ELTS(); + GLuint *elts = GET_MESA_ELTS(); + GLuint j, nr; + ELT_TYPE *dest; + + if (start+1 >= count) + return; + + ELT_INIT( GL_LINE_STRIP, HW_LINE_STRIP ); + + if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) + RESET_STIPPLE(); + + for (j = start; j + 1 < count; j += nr - 1 ) { + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + CLOSE_ELTS(); + } +} + + +static void TAG(render_line_loop_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + int dmasz = GET_MAX_HW_ELTS(); + GLuint *elts = GET_MESA_ELTS(); + GLuint j, nr; + ELT_TYPE *dest; + + if (0) fprintf(stderr, "%s\n", __FUNCTION__); + + if (flags & PRIM_BEGIN) + j = start; + else + j = start + 1; + + + if (flags & PRIM_END) { + if (start+1 >= count) + return; + } + else { + if (j+1 >= count) + return; + } + + ELT_INIT( GL_LINE_STRIP, HW_LINE_STRIP ); + + if ((flags & PRIM_BEGIN) && ctx->Line.StippleFlag) + RESET_STIPPLE(); + + + /* Ensure last vertex doesn't wrap: + */ + dmasz--; + + for ( ; j + 1 < count; ) { + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr+1 ); /* Reserve possible space for last elt */ + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + j += nr - 1; + if (j + 1 >= count && (flags & PRIM_END)) { + dest = TAG(emit_elts)( ctx, dest, elts+start, 1 ); + } + CLOSE_ELTS(); + } +} + + +static void TAG(render_triangles_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + GLuint *elts = GET_MESA_ELTS(); + int dmasz = GET_MAX_HW_ELTS()/3*3; + GLuint j, nr; + ELT_TYPE *dest; + + if (start+2 >= count) + return; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + + /* Emit whole number of tris in total. dmasz is already a multiple + * of 3. + */ + count -= (count-start)%3; + + for (j = start; j < count; j += nr) { + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + CLOSE_ELTS(); + } +} + + + +static void TAG(render_tri_strip_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + GLuint j, nr; + GLuint *elts = GET_MESA_ELTS(); + int dmasz = GET_MAX_HW_ELTS(); + ELT_TYPE *dest; + + if (start+2 >= count) + return; + + ELT_INIT( GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0 ); + + /* Keep the same winding over multiple buffers: + */ + dmasz -= (dmasz & 1); + + for (j = start ; j + 2 < count; j += nr - 2 ) { + nr = MIN2( dmasz, count - j ); + + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + CLOSE_ELTS(); + } +} + +static void TAG(render_tri_fan_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + GLuint *elts = GET_MESA_ELTS(); + GLuint j, nr; + int dmasz = GET_MAX_HW_ELTS(); + ELT_TYPE *dest; + + if (start+2 >= count) + return; + + ELT_INIT( GL_TRIANGLE_FAN, HW_TRIANGLE_FAN ); + + for (j = start + 1 ; j + 1 < count; j += nr - 1 ) { + nr = MIN2( dmasz, count - j + 1 ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+start, 1 ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr - 1 ); + CLOSE_ELTS(); + } +} + + +static void TAG(render_poly_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + GLuint *elts = GET_MESA_ELTS(); + GLuint j, nr; + int dmasz = GET_MAX_HW_ELTS(); + ELT_TYPE *dest; + + if (start+2 >= count) + return; + + ELT_INIT( GL_POLYGON, HW_POLYGON ); + + for (j = start + 1 ; j + 1 < count ; j += nr - 1 ) { + nr = MIN2( dmasz, count - j + 1 ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+start, 1 ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr - 1 ); + CLOSE_ELTS(); + } +} + +static void TAG(render_quad_strip_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (start+3 >= count) + return; + + if (HAVE_QUAD_STRIPS && 0) { + } + else { + LOCAL_VARS; + GLuint *elts = GET_MESA_ELTS(); + int dmasz = GET_MAX_HW_ELTS(); + GLuint j, nr; + ELT_TYPE *dest; + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 1; + count -= (count-start) & 1; + + if (ctx->_TriangleCaps & DD_FLATSHADE) { + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + dmasz = dmasz/6*2; + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( dmasz, count - j ); + + if (nr >= 4) + { + GLint quads = (nr/2)-1; + ELT_TYPE *dest = ALLOC_ELTS( quads*6 ); + GLint i; + + for ( i = j-start ; i < j-start+quads ; i++, elts += 2 ) { + EMIT_TWO_ELTS( dest, 0, elts[0], elts[1] ); + EMIT_TWO_ELTS( dest, 2, elts[2], elts[1] ); + EMIT_TWO_ELTS( dest, 4, elts[3], elts[2] ); + dest += 6; + } + + CLOSE_ELTS(); + } + } + } + else { + ELT_INIT( GL_TRIANGLE_STRIP, HW_TRIANGLE_STRIP_0 ); + + for (j = start; j + 3 < count; j += nr - 2 ) { + nr = MIN2( dmasz, count - j ); + dest = ALLOC_ELTS( nr ); + dest = TAG(emit_elts)( ctx, dest, elts+j, nr ); + CLOSE_ELTS(); + } + } + } +} + + +static void TAG(render_quads_elts)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + if (start+3 >= count) + return; + + if (HAVE_QUADS && 0) { + } else { + LOCAL_VARS; + GLuint *elts = GET_MESA_ELTS(); + int dmasz = GET_MAX_HW_ELTS(); + GLuint j, nr; + + ELT_INIT( GL_TRIANGLES, HW_TRIANGLES ); + + /* Emit whole number of quads in total, and in each buffer. + */ + dmasz -= dmasz & 3; + count -= (count-start) & 3; + + /* Adjust for rendering as triangles: + */ + dmasz = dmasz/6*4; + + for (j = start; j + 3 < count; j += nr ) { + nr = MIN2( dmasz, count - j ); + + { + GLint quads = nr/4; + ELT_TYPE *dest = ALLOC_ELTS( quads * 6 ); + GLint i; + + for ( i = j-start ; i < j-start+quads ; i++, elts += 4 ) { + EMIT_TWO_ELTS( dest, 0, elts[0], elts[1] ); + EMIT_TWO_ELTS( dest, 2, elts[3], elts[1] ); + EMIT_TWO_ELTS( dest, 4, elts[2], elts[3] ); + dest += 6; + } + + CLOSE_ELTS(); + } + } + } +} + + + +static render_func TAG(render_tab_elts)[GL_POLYGON+2] = +{ + TAG(render_points_elts), + TAG(render_lines_elts), + TAG(render_line_loop_elts), + TAG(render_line_strip_elts), + TAG(render_triangles_elts), + TAG(render_tri_strip_elts), + TAG(render_tri_fan_elts), + TAG(render_quads_elts), + TAG(render_quad_strip_elts), + TAG(render_poly_elts), + TAG(render_noop), +}; diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_rendertmp.h b/reactos/lib/mesa32/src/drivers/common/t_dd_rendertmp.h new file mode 100644 index 00000000000..b9f030195d5 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_rendertmp.h @@ -0,0 +1,434 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + + +#ifndef POSTFIX +#define POSTFIX +#endif + +#ifndef INIT +#define INIT(x) +#endif + +#ifndef NEED_EDGEFLAG_SETUP +#define NEED_EDGEFLAG_SETUP 0 +#define EDGEFLAG_GET(a) 0 +#define EDGEFLAG_SET(a,b) (void)b +#endif + +#ifndef RESET_STIPPLE +#define RESET_STIPPLE +#endif + +#ifndef RESET_OCCLUSION +#define RESET_OCCLUSION +#endif + +#ifndef TEST_PRIM_END +#define TEST_PRIM_END(flags) (flags & PRIM_END) +#define TEST_PRIM_BEGIN(flags) (flags & PRIM_BEGIN) +#define TEST_PRIM_PARITY(flags) (flags & PRIM_PARITY) +#endif + +#ifndef ELT +#define ELT(x) x +#endif + +#ifndef RENDER_TAB_QUALIFIER +#define RENDER_TAB_QUALIFIER static +#endif + +static void TAG(render_points)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + LOCAL_VARS; + (void) flags; + + RESET_OCCLUSION; + INIT(GL_POINTS); + RENDER_POINTS( start, count ); + POSTFIX; +} + +static void TAG(render_lines)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) +{ + GLuint j; + LOCAL_VARS; + (void) flags; + + RESET_OCCLUSION; + INIT(GL_LINES); + for (j=start+1; j + */ + + +/* Template for building functions to plug into the driver interface + * of t_vb_render.c: + * ctx->Driver.QuadFunc + * ctx->Driver.TriangleFunc + * ctx->Driver.LineFunc + * ctx->Driver.PointsFunc + * + * DO_TWOSIDE: Plug back-color values from the VB into backfacing triangles, + * and restore vertices afterwards. + * DO_OFFSET: Calculate offset for triangles and adjust vertices. Restore + * vertices after rendering. + * DO_FLAT: For hardware without native flatshading, copy provoking colors + * into the other vertices. Restore after rendering. + * DO_UNFILLED: Decompose triangles to lines and points where appropriate. + * + * HAVE_RGBA: Vertices have rgba values (otherwise index values). + * HAVE_SPEC: Vertices have secondary rgba values. + * + * VERT_X(v): Alias for vertex x value. + * VERT_Y(v): Alias for vertex y value. + * VERT_Z(v): Alias for vertex z value. + * DEPTH_SCALE: Scale for offset. + * + * VERTEX: Hardware vertex type. + * GET_VERTEX(n): Retreive vertex with index n. + * AREA_IS_CCW(a): Return true if triangle with signed area a is ccw. + * + * VERT_SET_RGBA: Assign vertex rgba from VB color. + * VERT_COPY_RGBA: Copy vertex rgba another vertex. + * VERT_SAVE_RGBA: Save vertex rgba to a local variable. + * VERT_RESTORE_RGBA: Restore vertex rgba from a local variable. + * --> Similar for IND and SPEC. + * + * LOCAL_VARS(n): (At least) define local vars for save/restore rgba. + * + */ + +#if HAVE_RGBA +#define VERT_SET_IND( v, c ) (void) c +#define VERT_COPY_IND( v0, v1 ) +#define VERT_SAVE_IND( idx ) +#define VERT_RESTORE_IND( idx ) +#if HAVE_BACK_COLORS +#define VERT_SET_RGBA( v, c ) +#endif +#else +#define VERT_SET_RGBA( v, c ) (void) c +#define VERT_COPY_RGBA( v0, v1 ) +#define VERT_SAVE_RGBA( idx ) +#define VERT_RESTORE_RGBA( idx ) +#if HAVE_BACK_COLORS +#define VERT_SET_IND( v, c ) +#endif +#endif + +#if !HAVE_SPEC +#define VERT_SET_SPEC( v, c ) (void) c +#define VERT_COPY_SPEC( v0, v1 ) +#define VERT_SAVE_SPEC( idx ) +#define VERT_RESTORE_SPEC( idx ) +#if HAVE_BACK_COLORS +#define VERT_COPY_SPEC1( v ) +#endif +#else +#if HAVE_BACK_COLORS +#define VERT_SET_SPEC( v, c ) +#endif +#endif + +#if !HAVE_BACK_COLORS +#define VERT_COPY_SPEC1( v ) +#define VERT_COPY_IND1( v ) +#define VERT_COPY_RGBA1( v ) +#endif + +#ifndef INSANE_VERTICES +#define VERT_SET_Z(v,val) VERT_Z(v) = val +#define VERT_Z_ADD(v,val) VERT_Z(v) += val +#endif + +#if DO_TRI +static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; + VERTEX *v[3]; + GLfloat offset; + GLfloat z[3]; + GLenum mode = GL_FILL; + GLuint facing; + LOCAL_VARS(3); + +/* fprintf(stderr, "%s\n", __FUNCTION__); */ + + v[0] = (VERTEX *)GET_VERTEX(e0); + v[1] = (VERTEX *)GET_VERTEX(e1); + v[2] = (VERTEX *)GET_VERTEX(e2); + + if (DO_TWOSIDE || DO_OFFSET || DO_UNFILLED) + { + GLfloat ex = VERT_X(v[0]) - VERT_X(v[2]); + GLfloat ey = VERT_Y(v[0]) - VERT_Y(v[2]); + GLfloat fx = VERT_X(v[1]) - VERT_X(v[2]); + GLfloat fy = VERT_Y(v[1]) - VERT_Y(v[2]); + GLfloat cc = ex*fy - ey*fx; + + if (DO_TWOSIDE || DO_UNFILLED) + { + facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit; + + if (DO_UNFILLED) { + if (facing) { + mode = ctx->Polygon.BackMode; + if (ctx->Polygon.CullFlag && + ctx->Polygon.CullFaceMode != GL_FRONT) { + return; + } + } else { + mode = ctx->Polygon.FrontMode; + if (ctx->Polygon.CullFlag && + ctx->Polygon.CullFaceMode != GL_BACK) { + return; + } + } + } + + if (DO_TWOSIDE && facing == 1) + { + if (HAVE_RGBA) { + if (HAVE_BACK_COLORS) { + if (!DO_FLAT) { + VERT_SAVE_RGBA( 0 ); + VERT_SAVE_RGBA( 1 ); + VERT_COPY_RGBA1( v[0] ); + VERT_COPY_RGBA1( v[1] ); + } + VERT_SAVE_RGBA( 2 ); + VERT_COPY_RGBA1( v[2] ); + if (HAVE_SPEC) { + if (!DO_FLAT) { + VERT_SAVE_SPEC( 0 ); + VERT_SAVE_SPEC( 1 ); + VERT_COPY_SPEC1( v[0] ); + VERT_COPY_SPEC1( v[1] ); + } + VERT_SAVE_SPEC( 2 ); + VERT_COPY_SPEC1( v[2] ); + } + } + else { + GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data; + ASSERT(VB->ColorPtr[1]->stride == 4*sizeof(GLfloat)); + (void) vbcolor; + + if (!DO_FLAT) { + VERT_SAVE_RGBA( 0 ); + VERT_SAVE_RGBA( 1 ); + VERT_SET_RGBA( v[0], vbcolor[e0] ); + VERT_SET_RGBA( v[1], vbcolor[e1] ); + } + VERT_SAVE_RGBA( 2 ); + VERT_SET_RGBA( v[2], vbcolor[e2] ); + + if (HAVE_SPEC && VB->SecondaryColorPtr[1]) { + GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; + + if (!DO_FLAT) { + VERT_SAVE_SPEC( 0 ); + VERT_SAVE_SPEC( 1 ); + VERT_SET_SPEC( v[0], vbspec[e0] ); + VERT_SET_SPEC( v[1], vbspec[e1] ); + } + VERT_SAVE_SPEC( 2 ); + VERT_SET_SPEC( v[2], vbspec[e2] ); + } + } + } + else { + GLfloat (*vbindex) = (GLfloat *)VB->IndexPtr[1]->data; + if (!DO_FLAT) { + VERT_SAVE_IND( 0 ); + VERT_SAVE_IND( 1 ); + VERT_SET_IND( v[0], vbindex[e0] ); + VERT_SET_IND( v[1], vbindex[e1] ); + } + VERT_SAVE_IND( 2 ); + VERT_SET_IND( v[2], vbindex[e2] ); + } + } + } + + + if (DO_OFFSET) + { + offset = ctx->Polygon.OffsetUnits * DEPTH_SCALE; + z[0] = VERT_Z(v[0]); + z[1] = VERT_Z(v[1]); + z[2] = VERT_Z(v[2]); + if (cc * cc > 1e-16) { + GLfloat ic = 1.0 / cc; + GLfloat ez = z[0] - z[2]; + GLfloat fz = z[1] - z[2]; + GLfloat a = ey*fz - ez*fy; + GLfloat b = ez*fx - ex*fz; + GLfloat ac = a * ic; + GLfloat bc = b * ic; + if ( ac < 0.0f ) ac = -ac; + if ( bc < 0.0f ) bc = -bc; + offset += MAX2( ac, bc ) * ctx->Polygon.OffsetFactor; + } + offset *= ctx->MRD; + } + } + + if (DO_FLAT) { + if (HAVE_RGBA) { + VERT_SAVE_RGBA( 0 ); + VERT_SAVE_RGBA( 1 ); + VERT_COPY_RGBA( v[0], v[2] ); + VERT_COPY_RGBA( v[1], v[2] ); + if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { + VERT_SAVE_SPEC( 0 ); + VERT_SAVE_SPEC( 1 ); + VERT_COPY_SPEC( v[0], v[2] ); + VERT_COPY_SPEC( v[1], v[2] ); + } + } + else { + VERT_SAVE_IND( 0 ); + VERT_SAVE_IND( 1 ); + VERT_COPY_IND( v[0], v[2] ); + VERT_COPY_IND( v[1], v[2] ); + } + } + + if (mode == GL_POINT) { + if (DO_OFFSET && ctx->Polygon.OffsetPoint) { + VERT_Z_ADD(v[0], offset); + VERT_Z_ADD(v[1], offset); + VERT_Z_ADD(v[2], offset); + } + UNFILLED_TRI( ctx, GL_POINT, e0, e1, e2 ); + } else if (mode == GL_LINE) { + if (DO_OFFSET && ctx->Polygon.OffsetLine) { + VERT_Z_ADD(v[0], offset); + VERT_Z_ADD(v[1], offset); + VERT_Z_ADD(v[2], offset); + } + UNFILLED_TRI( ctx, GL_LINE, e0, e1, e2 ); + } else { + if (DO_OFFSET && ctx->Polygon.OffsetFill) { + VERT_Z_ADD(v[0], offset); + VERT_Z_ADD(v[1], offset); + VERT_Z_ADD(v[2], offset); + } + if (DO_UNFILLED) + RASTERIZE( GL_TRIANGLES ); + TRI( v[0], v[1], v[2] ); + } + + if (DO_OFFSET) + { + VERT_SET_Z(v[0], z[0]); + VERT_SET_Z(v[1], z[1]); + VERT_SET_Z(v[2], z[2]); + } + + if (DO_TWOSIDE && facing == 1) + { + if (HAVE_RGBA) { + if (!DO_FLAT) { + VERT_RESTORE_RGBA( 0 ); + VERT_RESTORE_RGBA( 1 ); + } + VERT_RESTORE_RGBA( 2 ); + if (HAVE_SPEC) { + if (!DO_FLAT) { + VERT_RESTORE_SPEC( 0 ); + VERT_RESTORE_SPEC( 1 ); + } + VERT_RESTORE_SPEC( 2 ); + } + } + else { + if (!DO_FLAT) { + VERT_RESTORE_IND( 0 ); + VERT_RESTORE_IND( 1 ); + } + VERT_RESTORE_IND( 2 ); + } + } + + + if (DO_FLAT) { + if (HAVE_RGBA) { + VERT_RESTORE_RGBA( 0 ); + VERT_RESTORE_RGBA( 1 ); + if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { + VERT_RESTORE_SPEC( 0 ); + VERT_RESTORE_SPEC( 1 ); + } + } + else { + VERT_RESTORE_IND( 0 ); + VERT_RESTORE_IND( 1 ); + } + } +} +#endif + +#if DO_QUAD +#if DO_FULL_QUAD +static void TAG(quad)( GLcontext *ctx, + GLuint e0, GLuint e1, GLuint e2, GLuint e3 ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; + VERTEX *v[4]; + GLfloat offset; + GLfloat z[4]; + GLenum mode = GL_FILL; + GLuint facing; + LOCAL_VARS(4); + + v[0] = (VERTEX *)GET_VERTEX(e0); + v[1] = (VERTEX *)GET_VERTEX(e1); + v[2] = (VERTEX *)GET_VERTEX(e2); + v[3] = (VERTEX *)GET_VERTEX(e3); + + if (DO_TWOSIDE || DO_OFFSET || DO_UNFILLED) + { + GLfloat ex = VERT_X(v[2]) - VERT_X(v[0]); + GLfloat ey = VERT_Y(v[2]) - VERT_Y(v[0]); + GLfloat fx = VERT_X(v[3]) - VERT_X(v[1]); + GLfloat fy = VERT_Y(v[3]) - VERT_Y(v[1]); + GLfloat cc = ex*fy - ey*fx; + + if (DO_TWOSIDE || DO_UNFILLED) + { + facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit; + + if (DO_UNFILLED) { + if (facing) { + mode = ctx->Polygon.BackMode; + if (ctx->Polygon.CullFlag && + ctx->Polygon.CullFaceMode != GL_FRONT) { + return; + } + } else { + mode = ctx->Polygon.FrontMode; + if (ctx->Polygon.CullFlag && + ctx->Polygon.CullFaceMode != GL_BACK) { + return; + } + } + } + + if (DO_TWOSIDE && facing == 1) + { + if (HAVE_RGBA) { + GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data; + (void)vbcolor; + + if (HAVE_BACK_COLORS) { + if (!DO_FLAT) { + VERT_SAVE_RGBA( 0 ); + VERT_SAVE_RGBA( 1 ); + VERT_SAVE_RGBA( 2 ); + VERT_COPY_RGBA1( v[0] ); + VERT_COPY_RGBA1( v[1] ); + VERT_COPY_RGBA1( v[2] ); + } + VERT_SAVE_RGBA( 3 ); + VERT_COPY_RGBA1( v[3] ); + if (HAVE_SPEC) { + if (!DO_FLAT) { + VERT_SAVE_SPEC( 0 ); + VERT_SAVE_SPEC( 1 ); + VERT_SAVE_SPEC( 2 ); + VERT_COPY_SPEC1( v[0] ); + VERT_COPY_SPEC1( v[1] ); + VERT_COPY_SPEC1( v[2] ); + } + VERT_SAVE_SPEC( 3 ); + VERT_COPY_SPEC1( v[3] ); + } + } + else { + if (!DO_FLAT) { + VERT_SAVE_RGBA( 0 ); + VERT_SAVE_RGBA( 1 ); + VERT_SAVE_RGBA( 2 ); + VERT_SET_RGBA( v[0], vbcolor[e0] ); + VERT_SET_RGBA( v[1], vbcolor[e1] ); + VERT_SET_RGBA( v[2], vbcolor[e2] ); + } + VERT_SAVE_RGBA( 3 ); + VERT_SET_RGBA( v[3], vbcolor[e3] ); + + if (HAVE_SPEC && VB->SecondaryColorPtr[1]) { + GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; + ASSERT(VB->SecondaryColorPtr[1]->stride==4*sizeof(GLfloat)); + + if (!DO_FLAT) { + VERT_SAVE_SPEC( 0 ); + VERT_SAVE_SPEC( 1 ); + VERT_SAVE_SPEC( 2 ); + VERT_SET_SPEC( v[0], vbspec[e0] ); + VERT_SET_SPEC( v[1], vbspec[e1] ); + VERT_SET_SPEC( v[2], vbspec[e2] ); + } + VERT_SAVE_SPEC( 3 ); + VERT_SET_SPEC( v[3], vbspec[e3] ); + } + } + } + else { + GLfloat *vbindex = (GLfloat *)VB->IndexPtr[1]->data; + if (!DO_FLAT) { + VERT_SAVE_IND( 0 ); + VERT_SAVE_IND( 1 ); + VERT_SAVE_IND( 2 ); + VERT_SET_IND( v[0], vbindex[e0] ); + VERT_SET_IND( v[1], vbindex[e1] ); + VERT_SET_IND( v[2], vbindex[e2] ); + } + VERT_SAVE_IND( 3 ); + VERT_SET_IND( v[3], vbindex[e3] ); + } + } + } + + + if (DO_OFFSET) + { + offset = ctx->Polygon.OffsetUnits * DEPTH_SCALE; + z[0] = VERT_Z(v[0]); + z[1] = VERT_Z(v[1]); + z[2] = VERT_Z(v[2]); + z[3] = VERT_Z(v[3]); + if (cc * cc > 1e-16) { + GLfloat ez = z[2] - z[0]; + GLfloat fz = z[3] - z[1]; + GLfloat a = ey*fz - ez*fy; + GLfloat b = ez*fx - ex*fz; + GLfloat ic = 1.0 / cc; + GLfloat ac = a * ic; + GLfloat bc = b * ic; + if ( ac < 0.0f ) ac = -ac; + if ( bc < 0.0f ) bc = -bc; + offset += MAX2( ac, bc ) * ctx->Polygon.OffsetFactor; + } + offset *= ctx->MRD; + } + } + + if (DO_FLAT) { + if (HAVE_RGBA) { + VERT_SAVE_RGBA( 0 ); + VERT_SAVE_RGBA( 1 ); + VERT_SAVE_RGBA( 2 ); + VERT_COPY_RGBA( v[0], v[3] ); + VERT_COPY_RGBA( v[1], v[3] ); + VERT_COPY_RGBA( v[2], v[3] ); + if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { + VERT_SAVE_SPEC( 0 ); + VERT_SAVE_SPEC( 1 ); + VERT_SAVE_SPEC( 2 ); + VERT_COPY_SPEC( v[0], v[3] ); + VERT_COPY_SPEC( v[1], v[3] ); + VERT_COPY_SPEC( v[2], v[3] ); + } + } + else { + VERT_SAVE_IND( 0 ); + VERT_SAVE_IND( 1 ); + VERT_SAVE_IND( 2 ); + VERT_COPY_IND( v[0], v[3] ); + VERT_COPY_IND( v[1], v[3] ); + VERT_COPY_IND( v[2], v[3] ); + } + } + + if (mode == GL_POINT) { + if (( DO_OFFSET) && ctx->Polygon.OffsetPoint) { + VERT_Z_ADD(v[0], offset); + VERT_Z_ADD(v[1], offset); + VERT_Z_ADD(v[2], offset); + VERT_Z_ADD(v[3], offset); + } + UNFILLED_QUAD( ctx, GL_POINT, e0, e1, e2, e3 ); + } else if (mode == GL_LINE) { + if (DO_OFFSET && ctx->Polygon.OffsetLine) { + VERT_Z_ADD(v[0], offset); + VERT_Z_ADD(v[1], offset); + VERT_Z_ADD(v[2], offset); + VERT_Z_ADD(v[3], offset); + } + UNFILLED_QUAD( ctx, GL_LINE, e0, e1, e2, e3 ); + } else { + if (DO_OFFSET && ctx->Polygon.OffsetFill) { + VERT_Z_ADD(v[0], offset); + VERT_Z_ADD(v[1], offset); + VERT_Z_ADD(v[2], offset); + VERT_Z_ADD(v[3], offset); + } + RASTERIZE( GL_TRIANGLES ); + QUAD( (v[0]), (v[1]), (v[2]), (v[3]) ); + } + + if (DO_OFFSET) + { + VERT_SET_Z(v[0], z[0]); + VERT_SET_Z(v[1], z[1]); + VERT_SET_Z(v[2], z[2]); + VERT_SET_Z(v[3], z[3]); + } + + if (DO_TWOSIDE && facing == 1) + { + if (HAVE_RGBA) { + if (!DO_FLAT) { + VERT_RESTORE_RGBA( 0 ); + VERT_RESTORE_RGBA( 1 ); + VERT_RESTORE_RGBA( 2 ); + } + VERT_RESTORE_RGBA( 3 ); + if (HAVE_SPEC) { + if (!DO_FLAT) { + VERT_RESTORE_SPEC( 0 ); + VERT_RESTORE_SPEC( 1 ); + VERT_RESTORE_SPEC( 2 ); + } + VERT_RESTORE_SPEC( 3 ); + } + } + else { + if (!DO_FLAT) { + VERT_RESTORE_IND( 0 ); + VERT_RESTORE_IND( 1 ); + VERT_RESTORE_IND( 2 ); + } + VERT_RESTORE_IND( 3 ); + } + } + + + if (DO_FLAT) { + if (HAVE_RGBA) { + VERT_RESTORE_RGBA( 0 ); + VERT_RESTORE_RGBA( 1 ); + VERT_RESTORE_RGBA( 2 ); + if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { + VERT_RESTORE_SPEC( 0 ); + VERT_RESTORE_SPEC( 1 ); + VERT_RESTORE_SPEC( 2 ); + } + } + else { + VERT_RESTORE_IND( 0 ); + VERT_RESTORE_IND( 1 ); + VERT_RESTORE_IND( 2 ); + } + } +} +#else +static void TAG(quad)( GLcontext *ctx, GLuint e0, + GLuint e1, GLuint e2, GLuint e3 ) +{ + if (DO_UNFILLED) { + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLubyte ef1 = VB->EdgeFlag[e1]; + GLubyte ef3 = VB->EdgeFlag[e3]; + VB->EdgeFlag[e1] = 0; + TAG(triangle)( ctx, e0, e1, e3 ); + VB->EdgeFlag[e1] = ef1; + VB->EdgeFlag[e3] = 0; + TAG(triangle)( ctx, e1, e2, e3 ); + VB->EdgeFlag[e3] = ef3; + } else { + TAG(triangle)( ctx, e0, e1, e3 ); + TAG(triangle)( ctx, e1, e2, e3 ); + } +} +#endif +#endif + +#if DO_LINE +static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + VERTEX *v[2]; + LOCAL_VARS(2); + + v[0] = (VERTEX *)GET_VERTEX(e0); + v[1] = (VERTEX *)GET_VERTEX(e1); + + if (DO_FLAT) { + if (HAVE_RGBA) { + VERT_SAVE_RGBA( 0 ); + VERT_COPY_RGBA( v[0], v[1] ); + if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { + VERT_SAVE_SPEC( 0 ); + VERT_COPY_SPEC( v[0], v[1] ); + } + } + else { + VERT_SAVE_IND( 0 ); + VERT_COPY_IND( v[0], v[1] ); + } + } + + LINE( v[0], v[1] ); + + if (DO_FLAT) { + if (HAVE_RGBA) { + VERT_RESTORE_RGBA( 0 ); + + if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { + VERT_RESTORE_SPEC( 0 ); + } + } + else { + VERT_RESTORE_IND( 0 ); + } + } +} +#endif + +#if DO_POINTS +static void TAG(points)( GLcontext *ctx, GLuint first, GLuint last ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; + int i; + LOCAL_VARS(1); + + if (VB->Elts == 0) { + for ( i = first ; i < last ; i++ ) { + if ( VB->ClipMask[i] == 0 ) { + VERTEX *v = (VERTEX *)GET_VERTEX(i); + POINT( v ); + } + } + } else { + for ( i = first ; i < last ; i++ ) { + GLuint e = VB->Elts[i]; + if ( VB->ClipMask[e] == 0 ) { + VERTEX *v = (VERTEX *)GET_VERTEX(e); + POINT( v ); + } + } + } +} +#endif + +static void TAG(init)( void ) +{ +#if DO_QUAD + TAB[IND].quad = TAG(quad); +#endif +#if DO_TRI + TAB[IND].triangle = TAG(triangle); +#endif +#if DO_LINE + TAB[IND].line = TAG(line); +#endif +#if DO_POINTS + TAB[IND].points = TAG(points); +#endif +} + +#undef IND +#undef TAG + +#if HAVE_RGBA +#undef VERT_SET_IND +#undef VERT_COPY_IND +#undef VERT_SAVE_IND +#undef VERT_RESTORE_IND +#if HAVE_BACK_COLORS +#undef VERT_SET_RGBA +#endif +#else +#undef VERT_SET_RGBA +#undef VERT_COPY_RGBA +#undef VERT_SAVE_RGBA +#undef VERT_RESTORE_RGBA +#if HAVE_BACK_COLORS +#undef VERT_SET_IND +#endif +#endif + +#if !HAVE_SPEC +#undef VERT_SET_SPEC +#undef VERT_COPY_SPEC +#undef VERT_SAVE_SPEC +#undef VERT_RESTORE_SPEC +#if HAVE_BACK_COLORS +#undef VERT_COPY_SPEC1 +#endif +#else +#if HAVE_BACK_COLORS +#undef VERT_SET_SPEC +#endif +#endif + +#if !HAVE_BACK_COLORS +#undef VERT_COPY_SPEC1 +#undef VERT_COPY_IND1 +#undef VERT_COPY_RGBA1 +#endif + +#ifndef INSANE_VERTICES +#undef VERT_SET_Z +#undef VERT_Z_ADD +#endif diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_unfilled.h b/reactos/lib/mesa32/src/drivers/common/t_dd_unfilled.h new file mode 100644 index 00000000000..46415ea5f68 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_unfilled.h @@ -0,0 +1,212 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +#if HAVE_RGBA +#define VERT_SET_IND( v, c ) +#define VERT_COPY_IND( v0, v1 ) +#define VERT_SAVE_IND( idx ) +#define VERT_RESTORE_IND( idx ) +#endif + +#if !HAVE_SPEC +#define VERT_SET_SPEC( v, c ) +#define VERT_COPY_SPEC( v0, v1 ) +#define VERT_SAVE_SPEC( idx ) +#define VERT_RESTORE_SPEC( idx ) +#endif + +static void TAG(unfilled_tri)( GLcontext *ctx, + GLenum mode, + GLuint e0, GLuint e1, GLuint e2 ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLubyte *ef = VB->EdgeFlag; + VERTEX *v[3]; + LOCAL_VARS(3); + + v[0] = (VERTEX *)GET_VERTEX(e0); + v[1] = (VERTEX *)GET_VERTEX(e1); + v[2] = (VERTEX *)GET_VERTEX(e2); + + if ((ctx->_TriangleCaps & DD_FLATSHADE) && HAVE_HW_FLATSHADE) { + if (HAVE_RGBA) { + VERT_SAVE_RGBA(0); + VERT_SAVE_RGBA(1); + VERT_COPY_RGBA(v[0], v[2]); + VERT_COPY_RGBA(v[1], v[2]); + + if (HAVE_SPEC) { + VERT_SAVE_SPEC(0); + VERT_SAVE_SPEC(1); + VERT_COPY_SPEC(v[0], v[2]); + VERT_COPY_SPEC(v[1], v[2]); + } + } else { + VERT_SAVE_IND(0); + VERT_SAVE_IND(1); + VERT_COPY_IND(v[0], v[2]); + VERT_COPY_IND(v[1], v[2]); + } + } + +/* fprintf(stderr, "%s %s %d %d %d\n", __FUNCTION__, */ +/* _mesa_lookup_enum_by_nr( mode ), */ +/* ef[e0], ef[e1], ef[e2]); */ + + if (mode == GL_POINT) { + RASTERIZE(GL_POINTS); + if (ef[e0]) POINT( v[0] ); + if (ef[e1]) POINT( v[1] ); + if (ef[e2]) POINT( v[2] ); + } + else { + RASTERIZE(GL_LINES); + if (RENDER_PRIMITIVE == GL_POLYGON) { + if (ef[e2]) LINE( v[2], v[0] ); + if (ef[e0]) LINE( v[0], v[1] ); + if (ef[e1]) LINE( v[1], v[2] ); + } + else { + if (ef[e0]) LINE( v[0], v[1] ); + if (ef[e1]) LINE( v[1], v[2] ); + if (ef[e2]) LINE( v[2], v[0] ); + } + } + + if ((ctx->_TriangleCaps & DD_FLATSHADE) && HAVE_HW_FLATSHADE) { + if (HAVE_RGBA) { + VERT_RESTORE_RGBA(0); + VERT_RESTORE_RGBA(1); + + if (HAVE_SPEC) { + VERT_RESTORE_SPEC(0); + VERT_RESTORE_SPEC(1); + } + } else { + VERT_RESTORE_IND(0); + VERT_RESTORE_IND(1); + } + } +} + + +static void TAG(unfilled_quad)( GLcontext *ctx, + GLenum mode, + GLuint e0, GLuint e1, + GLuint e2, GLuint e3 ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLubyte *ef = VB->EdgeFlag; + VERTEX *v[4]; + LOCAL_VARS(4); + + v[0] = (VERTEX *)GET_VERTEX(e0); + v[1] = (VERTEX *)GET_VERTEX(e1); + v[2] = (VERTEX *)GET_VERTEX(e2); + v[3] = (VERTEX *)GET_VERTEX(e3); + + /* Hardware flatshading breaks down here. If the hardware doesn't + * support flatshading, this will already have been done: + */ + if ((ctx->_TriangleCaps & DD_FLATSHADE) && HAVE_HW_FLATSHADE) { + if (HAVE_RGBA) { + VERT_SAVE_RGBA(0); + VERT_SAVE_RGBA(1); + VERT_SAVE_RGBA(2); + VERT_COPY_RGBA(v[0], v[3]); + VERT_COPY_RGBA(v[1], v[3]); + VERT_COPY_RGBA(v[2], v[3]); + + if (HAVE_SPEC) { + VERT_SAVE_SPEC(0); + VERT_SAVE_SPEC(1); + VERT_SAVE_SPEC(2); + VERT_COPY_SPEC(v[0], v[3]); + VERT_COPY_SPEC(v[1], v[3]); + VERT_COPY_SPEC(v[2], v[3]); + } + } else { + VERT_SAVE_IND(0); + VERT_SAVE_IND(1); + VERT_SAVE_IND(2); + VERT_COPY_IND(v[0], v[3]); + VERT_COPY_IND(v[1], v[3]); + VERT_COPY_IND(v[2], v[3]); + } + } + + if (mode == GL_POINT) { + RASTERIZE(GL_POINTS); + if (ef[e0]) POINT( v[0] ); + if (ef[e1]) POINT( v[1] ); + if (ef[e2]) POINT( v[2] ); + if (ef[e3]) POINT( v[3] ); + } + else { + RASTERIZE(GL_LINES); + if (ef[e0]) LINE( v[0], v[1] ); + if (ef[e1]) LINE( v[1], v[2] ); + if (ef[e2]) LINE( v[2], v[3] ); + if (ef[e3]) LINE( v[3], v[0] ); + } + + if ((ctx->_TriangleCaps & DD_FLATSHADE) && HAVE_HW_FLATSHADE) { + if (HAVE_RGBA) { + VERT_RESTORE_RGBA(0); + VERT_RESTORE_RGBA(1); + VERT_RESTORE_RGBA(2); + + if (HAVE_SPEC) { + VERT_RESTORE_SPEC(0); + VERT_RESTORE_SPEC(1); + VERT_RESTORE_SPEC(2); + } + } else { + VERT_RESTORE_IND(0); + VERT_RESTORE_IND(1); + VERT_RESTORE_IND(2); + } + } +} + + +#if HAVE_RGBA +#undef VERT_SET_IND +#undef VERT_COPY_IND +#undef VERT_SAVE_IND +#undef VERT_RESTORE_IND +#endif + +#if !HAVE_SPEC +#undef VERT_SET_SPEC +#undef VERT_COPY_SPEC +#undef VERT_SAVE_SPEC +#undef VERT_RESTORE_SPEC +#endif + +#undef TAG diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_vb.c b/reactos/lib/mesa32/src/drivers/common/t_dd_vb.c new file mode 100644 index 00000000000..380b0424b4f --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_vb.c @@ -0,0 +1,344 @@ + +/* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ +#include "math/m_translate.h" + +#if (HAVE_HW_VIEWPORT) +#define UNVIEWPORT_VARS +#define UNVIEWPORT_X(x) x +#define UNVIEWPORT_Y(x) x +#define UNVIEWPORT_Z(x) x +#endif + +#ifndef LOCALVARS +#define LOCALVARS +#endif + +#ifndef CHECK_HW_DIVIDE +#define CHECK_HW_DIVIDE 1 +#endif + +/* These don't need to be duplicated, but there's currently nowhere + * really convenient to put them. Need to build some actual .o files in + * this directory? + */ +static void copy_pv_rgba4_spec5( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + LOCALVARS + GLubyte *verts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + GLuint *dst = (GLuint *)(verts + (edst << shift)); + GLuint *src = (GLuint *)(verts + (esrc << shift)); + dst[4] = src[4]; + dst[5] = src[5]; +} + +static void copy_pv_rgba4( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + LOCALVARS + GLubyte *verts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + GLuint *dst = (GLuint *)(verts + (edst << shift)); + GLuint *src = (GLuint *)(verts + (esrc << shift)); + dst[4] = src[4]; +} + +static void copy_pv_rgba3( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + LOCALVARS + GLubyte *verts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + GLuint *dst = (GLuint *)(verts + (edst << shift)); + GLuint *src = (GLuint *)(verts + (esrc << shift)); + dst[3] = src[3]; +} + + +void TAG(translate_vertex)(GLcontext *ctx, + const VERTEX *src, + SWvertex *dst) +{ + LOCALVARS + GLuint format = GET_VERTEX_FORMAT(); + GLfloat *s = ctx->Viewport._WindowMap.m; + UNVIEWPORT_VARS; + + if (format == TINY_VERTEX_FORMAT) { + if (HAVE_HW_VIEWPORT) { + dst->win[0] = s[0] * src->v.x + s[12]; + dst->win[1] = s[5] * src->v.y + s[13]; + dst->win[2] = s[10] * src->v.z + s[14]; + dst->win[3] = 1.0; + } else { + dst->win[0] = UNVIEWPORT_X( src->v.x ); + dst->win[1] = UNVIEWPORT_Y( src->v.y ); + dst->win[2] = UNVIEWPORT_Z( src->v.z ); + dst->win[3] = 1.0; + } + + dst->color[0] = src->tv.color.red; + dst->color[1] = src->tv.color.green; + dst->color[2] = src->tv.color.blue; + dst->color[3] = src->tv.color.alpha; + } + else { + if (HAVE_HW_VIEWPORT) { + if (HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) { + GLfloat oow = 1.0 / src->v.w; + dst->win[0] = s[0] * src->v.x * oow + s[12]; + dst->win[1] = s[5] * src->v.y * oow + s[13]; + dst->win[2] = s[10] * src->v.z * oow + s[14]; + dst->win[3] = oow; + } else { + dst->win[0] = s[0] * src->v.x + s[12]; + dst->win[1] = s[5] * src->v.y + s[13]; + dst->win[2] = s[10] * src->v.z + s[14]; + dst->win[3] = src->v.w; + } + } else { + dst->win[0] = UNVIEWPORT_X( src->v.x ); + dst->win[1] = UNVIEWPORT_Y( src->v.y ); + dst->win[2] = UNVIEWPORT_Z( src->v.z ); + dst->win[3] = src->v.w; + } + + dst->color[0] = src->v.color.red; + dst->color[1] = src->v.color.green; + dst->color[2] = src->v.color.blue; + dst->color[3] = src->v.color.alpha; + + dst->specular[0] = src->v.specular.red; + dst->specular[1] = src->v.specular.green; + dst->specular[2] = src->v.specular.blue; + + dst->fog = src->v.specular.alpha/255.0; + + if (HAVE_PTEX_VERTICES && + ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) || + (format == PROJ_TEX1_VERTEX_FORMAT))) { + + dst->texcoord[0][0] = src->pv.u0; + dst->texcoord[0][1] = src->pv.v0; + dst->texcoord[0][3] = src->pv.q0; + + dst->texcoord[1][0] = src->pv.u1; + dst->texcoord[1][1] = src->pv.v1; + dst->texcoord[1][3] = src->pv.q1; + + if (HAVE_TEX2_VERTICES) { + dst->texcoord[2][0] = src->pv.u2; + dst->texcoord[2][1] = src->pv.v2; + dst->texcoord[2][3] = src->pv.q2; + } + + if (HAVE_TEX3_VERTICES) { + dst->texcoord[3][0] = src->pv.u3; + dst->texcoord[3][1] = src->pv.v3; + dst->texcoord[3][3] = src->pv.q3; + } + } + else { + dst->texcoord[0][0] = src->v.u0; + dst->texcoord[0][1] = src->v.v0; + dst->texcoord[0][3] = 1.0; + + dst->texcoord[1][0] = src->v.u1; + dst->texcoord[1][1] = src->v.v1; + dst->texcoord[1][3] = 1.0; + + if (HAVE_TEX2_VERTICES) { + dst->texcoord[2][0] = src->v.u2; + dst->texcoord[2][1] = src->v.v2; + dst->texcoord[2][3] = 1.0; + } + + if (HAVE_TEX3_VERTICES) { + dst->texcoord[3][0] = src->v.u3; + dst->texcoord[3][1] = src->v.v3; + dst->texcoord[3][3] = 1.0; + } + } + } + + dst->pointSize = ctx->Point._Size; +} + + + +void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v ) +{ + LOCALVARS + GLuint format = GET_VERTEX_FORMAT(); + + fprintf(stderr, "(%x) ", format); + + switch (format) { +#if HAVE_TINY_VERTICES + case TINY_VERTEX_FORMAT: + fprintf(stderr, "xyz %.4f,%.4f,%.4f rgba %x:%x:%x:%x\n", + v->v.x, v->v.y, v->v.z, + v->tv.color.red, + v->tv.color.green, + v->tv.color.blue, + v->tv.color.alpha); + break; +#endif +#if HAVE_NOTEX_VERTICES + case NOTEX_VERTEX_FORMAT: + fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x spec %x:%x:%x:%x\n", + v->v.x, v->v.y, v->v.z, v->v.w, + v->v.color.red, + v->v.color.green, + v->v.color.blue, + v->v.color.alpha, + v->v.specular.red, + v->v.specular.green, + v->v.specular.blue, + v->v.specular.alpha); + break; +#endif +#if HAVE_TEX0_VERTICES + case TEX0_VERTEX_FORMAT: + fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f\n", + v->v.x, v->v.y, v->v.z, v->v.w, + v->v.color.red, + v->v.color.green, + v->v.color.blue, + v->v.color.alpha, + v->v.u0, + v->v.v0); + break; +#endif +#if HAVE_TEX1_VERTICES + case TEX1_VERTEX_FORMAT: + fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f st %.4f,%.4f\n", + v->v.x, v->v.y, v->v.z, v->v.w, + v->v.color.red, + v->v.color.green, + v->v.color.blue, + v->v.color.alpha, + v->v.u0, + v->v.v0, + v->v.u1, + v->v.u2); + break; +#endif +#if HAVE_PTEX_VERTICES + case PROJ_TEX1_VERTEX_FORMAT: + fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x stq %.4f,%.4f,%.4f stq %.4f,%.4f,%.4f\n", + v->v.x, v->v.y, v->v.z, v->v.w, + v->v.color.red, + v->v.color.green, + v->v.color.blue, + v->v.color.alpha, + v->pv.u0, + v->pv.v0, + v->pv.q0, + v->pv.u1, + v->pv.v1, + v->pv.q1); + break; +#endif + default: + fprintf(stderr, "???\n"); + break; + } + + fprintf(stderr, "\n"); +} + + + +/* Interpolate the elements of the VB not included in typical hardware + * vertices. + * + * NOTE: All these arrays are guarenteed by tnl to be writeable and + * have good stride. + */ +#ifndef INTERP_QUALIFIER +#define INTERP_QUALIFIER static +#endif + +#define GET_COLOR(ptr, idx) ((ptr)->data[idx]) + + +INTERP_QUALIFIER void TAG(interp_extras)( GLcontext *ctx, + GLfloat t, + GLuint dst, GLuint out, GLuint in, + GLboolean force_boundary ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + + if (VB->ColorPtr[1]) { + assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); + + INTERP_4F( t, + GET_COLOR(VB->ColorPtr[1], dst), + GET_COLOR(VB->ColorPtr[1], out), + GET_COLOR(VB->ColorPtr[1], in) ); + + if (VB->SecondaryColorPtr[1]) { + INTERP_3F( t, + GET_COLOR(VB->SecondaryColorPtr[1], dst), + GET_COLOR(VB->SecondaryColorPtr[1], out), + GET_COLOR(VB->SecondaryColorPtr[1], in) ); + } + } + + if (VB->EdgeFlag) { + VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary; + } + + INTERP_VERTEX(ctx, t, dst, out, in, force_boundary); +} + +INTERP_QUALIFIER void TAG(copy_pv_extras)( GLcontext *ctx, + GLuint dst, GLuint src ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + + if (VB->ColorPtr[1]) { + COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), + GET_COLOR(VB->ColorPtr[1], src) ); + + if (VB->SecondaryColorPtr[1]) { + COPY_4FV( GET_COLOR(VB->SecondaryColorPtr[1], dst), + GET_COLOR(VB->SecondaryColorPtr[1], src) ); + } + } + + COPY_PV_VERTEX(ctx, dst, src); +} + + +#undef INTERP_QUALIFIER +#undef GET_COLOR + +#undef IND +#undef TAG diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_vbtmp.h b/reactos/lib/mesa32/src/drivers/common/t_dd_vbtmp.h new file mode 100644 index 00000000000..14b4a28651a --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_vbtmp.h @@ -0,0 +1,679 @@ + +/* + * Mesa 3-D graphics library + * Version: 5.0.1 + * + * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + + +/* Unlike the other templates here, this assumes quite a bit about the + * underlying hardware. Specifically it assumes a d3d-like vertex + * format, with a layout more or less constrained to look like the + * following: + * + * union { + * struct { + * float x, y, z, w; + * struct { char r, g, b, a; } color; + * struct { char r, g, b, fog; } spec; + * float u0, v0; + * float u1, v1; + * float u2, v2; + * float u3, v3; + * } v; + * struct { + * float x, y, z, w; + * struct { char r, g, b, a; } color; + * struct { char r, g, b, fog; } spec; + * float u0, v0, q0; + * float u1, v1, q1; + * float u2, v2, q2; + * float u3, v3, q3; + * } pv; + * struct { + * float x, y, z; + * struct { char r, g, b, a; } color; + * } tv; + * float f[16]; + * unsigned int ui[16]; + * unsigned char ub4[4][16]; + * } + * + + * VERTEX: hw vertex type as above + * VERTEX_COLOR: hw color struct type in VERTEX + * + * DO_XYZW: Emit xyz and maybe w coordinates. + * DO_RGBA: Emit color. + * DO_SPEC: Emit specular color. + * DO_FOG: Emit fog coordinate in specular alpha. + * DO_TEX0: Emit tex0 u,v coordinates. + * DO_TEX1: Emit tex1 u,v coordinates. + * DO_TEX2: Emit tex2 u,v coordinates. + * DO_TEX3: Emit tex3 u,v coordinates. + * DO_PTEX: Emit tex0,1,2,3 q coordinates where possible. + * + * HAVE_RGBA_COLOR: Hardware takes color in rgba order (else bgra). + * + * HAVE_HW_VIEWPORT: Hardware performs viewport transform. + * HAVE_HW_DIVIDE: Hardware performs perspective divide. + * + * HAVE_TINY_VERTICES: Hardware understands v.tv format. + * HAVE_PTEX_VERTICES: Hardware understands v.pv format. + * HAVE_NOTEX_VERTICES: Hardware understands v.v format with texcount 0. + * + * Additionally, this template assumes it is emitting *transformed* + * vertices; the modifications to emit untransformed vertices (ie. to + * t&l hardware) are probably too great to cooexist with the code + * already in this file. + * + * NOTE: The PTEX vertex format always includes TEX0 and TEX1, even if + * only TEX0 is enabled, in order to maintain a vertex size which is + * an exact number of quadwords. + */ + +#if (HAVE_HW_VIEWPORT) +#define VIEWPORT_X(dst,x) dst = x +#define VIEWPORT_Y(dst,y) dst = y +#define VIEWPORT_Z(dst,z) dst = z +#else +#define VIEWPORT_X(dst,x) dst = s[0] * x + s[12] +#define VIEWPORT_Y(dst,y) dst = s[5] * y + s[13] +#define VIEWPORT_Z(dst,z) dst = s[10] * z + s[14] +#endif + +#if (HAVE_HW_DIVIDE && !HAVE_PTEX_VERTICES) +#error "can't cope with this combination" +#endif + +#ifndef LOCALVARS +#define LOCALVARS +#endif + +#ifndef CHECK_HW_DIVIDE +#define CHECK_HW_DIVIDE 1 +#endif + +#if (HAVE_HW_DIVIDE || DO_SPEC || DO_TEX0 || DO_FOG || !HAVE_TINY_VERTICES) + +static void TAG(emit)( GLcontext *ctx, + GLuint start, GLuint end, + void *dest, + GLuint stride ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLfloat (*tc0)[4], (*tc1)[4], (*fog)[4]; + GLfloat (*tc2)[4], (*tc3)[4]; + GLfloat (*col)[4], (*spec)[4]; + GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride; + GLuint tc2_stride, tc3_stride; + GLuint tc0_size, tc1_size; + GLuint tc2_size, tc3_size; + GLfloat (*coord)[4]; + GLuint coord_stride; + VERTEX *v = (VERTEX *)dest; + const GLfloat *s = GET_VIEWPORT_MAT(); + const GLubyte *mask = VB->ClipMask; + int i; + +/* fprintf(stderr, "%s(big) importable %d %d..%d\n", */ +/* __FUNCTION__, VB->importable_data, start, end); */ + + if (HAVE_HW_VIEWPORT && HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) { + (void) s; + coord = VB->ClipPtr->data; + coord_stride = VB->ClipPtr->stride; + } + else { + coord = VB->NdcPtr->data; + coord_stride = VB->NdcPtr->stride; + } + + if (DO_TEX3) { + const GLuint t3 = GET_TEXSOURCE(3); + tc3 = VB->TexCoordPtr[t3]->data; + tc3_stride = VB->TexCoordPtr[t3]->stride; + if (DO_PTEX) + tc3_size = VB->TexCoordPtr[t3]->size; + } + + if (DO_TEX2) { + const GLuint t2 = GET_TEXSOURCE(2); + tc2 = VB->TexCoordPtr[t2]->data; + tc2_stride = VB->TexCoordPtr[t2]->stride; + if (DO_PTEX) + tc2_size = VB->TexCoordPtr[t2]->size; + } + + if (DO_TEX1) { + const GLuint t1 = GET_TEXSOURCE(1); + tc1 = VB->TexCoordPtr[t1]->data; + tc1_stride = VB->TexCoordPtr[t1]->stride; + if (DO_PTEX) + tc1_size = VB->TexCoordPtr[t1]->size; + } + + if (DO_TEX0) { + const GLuint t0 = GET_TEXSOURCE(0); + tc0_stride = VB->TexCoordPtr[t0]->stride; + tc0 = VB->TexCoordPtr[t0]->data; + if (DO_PTEX) + tc0_size = VB->TexCoordPtr[t0]->size; + } + + if (DO_RGBA) { + col_stride = VB->ColorPtr[0]->stride; + col = VB->ColorPtr[0]->data; + } + + if (DO_SPEC) { + if (VB->SecondaryColorPtr[0]) { + spec_stride = VB->SecondaryColorPtr[0]->stride; + spec = VB->SecondaryColorPtr[0]->data; + } else { + spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; + spec_stride = 0; + } + } + + if (DO_FOG) { + if (VB->FogCoordPtr) { + fog = VB->FogCoordPtr->data; + fog_stride = VB->FogCoordPtr->stride; + } + else { + static GLfloat tmp[4] = {0, 0, 0, 0}; + fog = &tmp; + fog_stride = 0; + } + } + + /* May have nonstandard strides: + */ + if (start) { + STRIDE_4F(coord, start * coord_stride); + if (DO_TEX0) + STRIDE_4F(tc0, start * tc0_stride); + if (DO_TEX1) + STRIDE_4F(tc1, start * tc1_stride); + if (DO_TEX2) + STRIDE_4F(tc2, start * tc2_stride); + if (DO_TEX3) + STRIDE_4F(tc3, start * tc3_stride); + if (DO_RGBA) + STRIDE_4F(col, start * col_stride); + if (DO_SPEC) + STRIDE_4F(spec, start * spec_stride); + if (DO_FOG) + STRIDE_4F(fog, start * fog_stride); + } + + for (i=start; i < end; i++, v = (VERTEX *)((GLubyte *)v + stride)) { + if (DO_XYZW) { + if (HAVE_HW_VIEWPORT || mask[i] == 0) { + VIEWPORT_X(v->v.x, coord[0][0]); + VIEWPORT_Y(v->v.y, coord[0][1]); + VIEWPORT_Z(v->v.z, coord[0][2]); + v->v.w = coord[0][3]; + } + STRIDE_4F(coord, coord_stride); + } + if (DO_RGBA) { + UNCLAMPED_FLOAT_TO_UBYTE(v->v.color.red, col[0][0]); + UNCLAMPED_FLOAT_TO_UBYTE(v->v.color.green, col[0][1]); + UNCLAMPED_FLOAT_TO_UBYTE(v->v.color.blue, col[0][2]); + UNCLAMPED_FLOAT_TO_UBYTE(v->v.color.alpha, col[0][3]); + STRIDE_4F(col, col_stride); + } + if (DO_SPEC) { + UNCLAMPED_FLOAT_TO_UBYTE(v->v.specular.red, spec[0][0]); + UNCLAMPED_FLOAT_TO_UBYTE(v->v.specular.green, spec[0][1]); + UNCLAMPED_FLOAT_TO_UBYTE(v->v.specular.blue, spec[0][2]); + STRIDE_4F(spec, spec_stride); + } + if (DO_FOG) { + UNCLAMPED_FLOAT_TO_UBYTE(v->v.specular.alpha, fog[0][0]); + STRIDE_4F(fog, fog_stride); + } + if (DO_TEX0) { + v->v.u0 = tc0[0][0]; + v->v.v0 = tc0[0][1]; + if (DO_PTEX) { + if (HAVE_PTEX_VERTICES) { + if (tc0_size == 4) + v->pv.q0 = tc0[0][3]; + else + v->pv.q0 = 1.0; + } + else if (tc0_size == 4) { + float rhw = 1.0 / tc0[0][3]; + v->v.w *= tc0[0][3]; + v->v.u0 *= rhw; + v->v.v0 *= rhw; + } + } + STRIDE_4F(tc0, tc0_stride); + } + if (DO_TEX1) { + if (DO_PTEX) { + v->pv.u1 = tc1[0][0]; + v->pv.v1 = tc1[0][1]; + if (tc1_size == 4) + v->pv.q1 = tc1[0][3]; + else + v->pv.q1 = 1.0; + } + else { + v->v.u1 = tc1[0][0]; + v->v.v1 = tc1[0][1]; + } + STRIDE_4F(tc1, tc1_stride); + } + else if (DO_PTEX) { + *(GLuint *)&v->pv.q1 = 0; /* avoid culling on radeon */ + } + if (DO_TEX2) { + if (DO_PTEX) { + v->pv.u2 = tc2[0][0]; + v->pv.v2 = tc2[0][1]; + if (tc2_size == 4) + v->pv.q2 = tc2[0][3]; + else + v->pv.q2 = 1.0; + } + else { + v->v.u2 = tc2[0][0]; + v->v.v2 = tc2[0][1]; + } + STRIDE_4F(tc2, tc2_stride); + } + if (DO_TEX3) { + if (DO_PTEX) { + v->pv.u3 = tc3[0][0]; + v->pv.v3 = tc3[0][1]; + if (tc3_size == 4) + v->pv.q3 = tc3[0][3]; + else + v->pv.q3 = 1.0; + } + else { + v->v.u3 = tc3[0][0]; + v->v.v3 = tc3[0][1]; + } + STRIDE_4F(tc3, tc3_stride); + } + } + +} +#else + +#if HAVE_HW_DIVIDE +#error "cannot use tiny vertices with hw perspective divide" +#endif + +static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, + void *dest, GLuint stride ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLfloat (*col)[4]; + GLuint col_stride; + GLfloat (*coord)[4] = VB->NdcPtr->data; + GLuint coord_stride = VB->NdcPtr->stride; + GLfloat *v = (GLfloat *)dest; + const GLubyte *mask = VB->ClipMask; + const GLfloat *s = GET_VIEWPORT_MAT(); + int i; + + (void) s; + + ASSERT(stride == 4); + + col = VB->ColorPtr[0]->data; + col_stride = VB->ColorPtr[0]->stride; + +/* fprintf(stderr, "%s(small) importable %x\n", */ +/* __FUNCTION__, VB->importable_data); */ + + /* Pack what's left into a 4-dword vertex. Color is in a different + * place, and there is no 'w' coordinate. + */ + if (start) { + STRIDE_4F(coord, start * coord_stride); + STRIDE_4F(col, start * col_stride); + } + + for (i=start; i < end; i++, v+=4) { + if (DO_XYZW) { + if (HAVE_HW_VIEWPORT || mask[i] == 0) { + VIEWPORT_X(v[0], coord[0][0]); + VIEWPORT_Y(v[1], coord[0][1]); + VIEWPORT_Z(v[2], coord[0][2]); + } + STRIDE_4F( coord, coord_stride ); + } + if (DO_RGBA) { + VERTEX_COLOR *c = (VERTEX_COLOR *)&v[3]; + UNCLAMPED_FLOAT_TO_UBYTE(c->red, col[0][0]); + UNCLAMPED_FLOAT_TO_UBYTE(c->green, col[0][1]); + UNCLAMPED_FLOAT_TO_UBYTE(c->blue, col[0][2]); + UNCLAMPED_FLOAT_TO_UBYTE(c->alpha, col[0][3]); + STRIDE_4F( col, col_stride ); + } +/* fprintf(stderr, "vert %d: %.2f %.2f %.2f %x\n", */ +/* i, v[0], v[1], v[2], *(int *)&v[3]); */ + } +} + +#endif /* emit */ + +#if (DO_XYZW) && (DO_RGBA) + + +#if (HAVE_PTEX_VERTICES) +static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + + /* Force 'missing' texcoords to something valid. + */ + if (DO_TEX3 && VB->TexCoordPtr[2] == 0) + VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; + + if (DO_TEX2 && VB->TexCoordPtr[1] == 0) + VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; + + if (DO_TEX1 && VB->TexCoordPtr[0] == 0) + VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; + + if (DO_PTEX) + return GL_TRUE; + + if ((DO_TEX3 && VB->TexCoordPtr[GET_TEXSOURCE(3)]->size == 4) || + (DO_TEX2 && VB->TexCoordPtr[GET_TEXSOURCE(2)]->size == 4) || + (DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4) || + (DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4)) + return GL_FALSE; + + return GL_TRUE; +} +#else +static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + + /* Force 'missing' texcoords to something valid. + */ + if (DO_TEX3 && VB->TexCoordPtr[2] == 0) + VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; + + if (DO_TEX2 && VB->TexCoordPtr[1] == 0) + VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; + + if (DO_TEX1 && VB->TexCoordPtr[0] == 0) + VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; + + if (DO_PTEX) + return GL_TRUE; + + /* No hardware support for projective texture. Can fake it for + * TEX0 only. + */ + if ((DO_TEX3 && VB->TexCoordPtr[GET_TEXSOURCE(3)]->size == 4) || + (DO_TEX2 && VB->TexCoordPtr[GET_TEXSOURCE(2)]->size == 4) || + (DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4)) { + PTEX_FALLBACK(); + return GL_FALSE; + } + + if (DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4) { + if (DO_TEX1 || DO_TEX2 || DO_TEX3) { + PTEX_FALLBACK(); + } + return GL_FALSE; + } + + return GL_TRUE; +} +#endif /* ptex */ + + +static void TAG(interp)( GLcontext *ctx, + GLfloat t, + GLuint edst, GLuint eout, GLuint ein, + GLboolean force_boundary ) +{ + LOCALVARS + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLubyte *ddverts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + const GLfloat *dstclip = VB->ClipPtr->data[edst]; + GLfloat w; + const GLfloat *s = GET_VIEWPORT_MAT(); + + VERTEX *dst = (VERTEX *)(ddverts + (edst << shift)); + VERTEX *in = (VERTEX *)(ddverts + (ein << shift)); + VERTEX *out = (VERTEX *)(ddverts + (eout << shift)); + + (void)s; + + if (HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) { + VIEWPORT_X( dst->v.x, dstclip[0] ); + VIEWPORT_Y( dst->v.y, dstclip[1] ); + VIEWPORT_Z( dst->v.z, dstclip[2] ); + w = dstclip[3]; + } + else { + w = 1.0 / dstclip[3]; + VIEWPORT_X( dst->v.x, dstclip[0] * w ); + VIEWPORT_Y( dst->v.y, dstclip[1] * w ); + VIEWPORT_Z( dst->v.z, dstclip[2] * w ); + } + + if ((HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) || + DO_FOG || DO_SPEC || DO_TEX0 || DO_TEX1 || + DO_TEX2 || DO_TEX3 || !HAVE_TINY_VERTICES) { + + dst->v.w = w; + + INTERP_UB( t, dst->ub4[4][0], out->ub4[4][0], in->ub4[4][0] ); + INTERP_UB( t, dst->ub4[4][1], out->ub4[4][1], in->ub4[4][1] ); + INTERP_UB( t, dst->ub4[4][2], out->ub4[4][2], in->ub4[4][2] ); + INTERP_UB( t, dst->ub4[4][3], out->ub4[4][3], in->ub4[4][3] ); + + if (DO_SPEC) { + INTERP_UB( t, dst->v.specular.red, out->v.specular.red, in->v.specular.red ); + INTERP_UB( t, dst->v.specular.green, out->v.specular.green, in->v.specular.green ); + INTERP_UB( t, dst->v.specular.blue, out->v.specular.blue, in->v.specular.blue ); + } + if (DO_FOG) { + INTERP_UB( t, dst->v.specular.alpha, out->v.specular.alpha, in->v.specular.alpha ); + } + if (DO_TEX0) { + if (DO_PTEX) { + if (HAVE_PTEX_VERTICES) { + INTERP_F( t, dst->pv.u0, out->pv.u0, in->pv.u0 ); + INTERP_F( t, dst->pv.v0, out->pv.v0, in->pv.v0 ); + INTERP_F( t, dst->pv.q0, out->pv.q0, in->pv.q0 ); + } else { + GLfloat wout = VB->NdcPtr->data[eout][3]; + GLfloat win = VB->NdcPtr->data[ein][3]; + GLfloat qout = out->pv.w / wout; + GLfloat qin = in->pv.w / win; + GLfloat qdst, rqdst; + + ASSERT( !HAVE_HW_DIVIDE ); + + INTERP_F( t, dst->v.u0, out->v.u0 * qout, in->v.u0 * qin ); + INTERP_F( t, dst->v.v0, out->v.v0 * qout, in->v.v0 * qin ); + INTERP_F( t, qdst, qout, qin ); + + rqdst = 1.0 / qdst; + dst->v.u0 *= rqdst; + dst->v.v0 *= rqdst; + dst->v.w *= rqdst; + } + } + else { + INTERP_F( t, dst->v.u0, out->v.u0, in->v.u0 ); + INTERP_F( t, dst->v.v0, out->v.v0, in->v.v0 ); + } + } + if (DO_TEX1) { + if (DO_PTEX) { + INTERP_F( t, dst->pv.u1, out->pv.u1, in->pv.u1 ); + INTERP_F( t, dst->pv.v1, out->pv.v1, in->pv.v1 ); + INTERP_F( t, dst->pv.q1, out->pv.q1, in->pv.q1 ); + } else { + INTERP_F( t, dst->v.u1, out->v.u1, in->v.u1 ); + INTERP_F( t, dst->v.v1, out->v.v1, in->v.v1 ); + } + } + else if (DO_PTEX) { + dst->pv.q1 = 0.0; /* must be a valid float on radeon */ + } + if (DO_TEX2) { + if (DO_PTEX) { + INTERP_F( t, dst->pv.u2, out->pv.u2, in->pv.u2 ); + INTERP_F( t, dst->pv.v2, out->pv.v2, in->pv.v2 ); + INTERP_F( t, dst->pv.q2, out->pv.q2, in->pv.q2 ); + } else { + INTERP_F( t, dst->v.u2, out->v.u2, in->v.u2 ); + INTERP_F( t, dst->v.v2, out->v.v2, in->v.v2 ); + } + } + if (DO_TEX3) { + if (DO_PTEX) { + INTERP_F( t, dst->pv.u3, out->pv.u3, in->pv.u3 ); + INTERP_F( t, dst->pv.v3, out->pv.v3, in->pv.v3 ); + INTERP_F( t, dst->pv.q3, out->pv.q3, in->pv.q3 ); + } else { + INTERP_F( t, dst->v.u3, out->v.u3, in->v.u3 ); + INTERP_F( t, dst->v.v3, out->v.v3, in->v.v3 ); + } + } + } else { + /* 4-dword vertex. Color is in v[3] and there is no oow coordinate. + */ + INTERP_UB( t, dst->ub4[3][0], out->ub4[3][0], in->ub4[3][0] ); + INTERP_UB( t, dst->ub4[3][1], out->ub4[3][1], in->ub4[3][1] ); + INTERP_UB( t, dst->ub4[3][2], out->ub4[3][2], in->ub4[3][2] ); + INTERP_UB( t, dst->ub4[3][3], out->ub4[3][3], in->ub4[3][3] ); + } +} + +#endif /* rgba && xyzw */ + + +static void TAG(init)( void ) +{ + setup_tab[IND].emit = TAG(emit); + +#if (DO_XYZW && DO_RGBA) + setup_tab[IND].check_tex_sizes = TAG(check_tex_sizes); + setup_tab[IND].interp = TAG(interp); +#endif + + if (DO_SPEC) + setup_tab[IND].copy_pv = copy_pv_rgba4_spec5; + else if (HAVE_HW_DIVIDE || DO_SPEC || DO_FOG || DO_TEX0 || DO_TEX1 || + DO_TEX2 || DO_TEX3 || !HAVE_TINY_VERTICES) + setup_tab[IND].copy_pv = copy_pv_rgba4; + else + setup_tab[IND].copy_pv = copy_pv_rgba3; + + if (DO_TEX3) { + if (DO_PTEX) { + ASSERT(HAVE_PTEX_VERTICES); + setup_tab[IND].vertex_format = PROJ_TEX3_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 18; + setup_tab[IND].vertex_stride_shift = 7; + } + else { + setup_tab[IND].vertex_format = TEX3_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 14; + setup_tab[IND].vertex_stride_shift = 6; + } + } + else if (DO_TEX2) { + if (DO_PTEX) { + ASSERT(HAVE_PTEX_VERTICES); + setup_tab[IND].vertex_format = PROJ_TEX3_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 18; + setup_tab[IND].vertex_stride_shift = 7; + } + else { + setup_tab[IND].vertex_format = TEX2_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 12; + setup_tab[IND].vertex_stride_shift = 6; + } + } + else if (DO_TEX1) { + if (DO_PTEX) { + ASSERT(HAVE_PTEX_VERTICES); + setup_tab[IND].vertex_format = PROJ_TEX1_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 12; + setup_tab[IND].vertex_stride_shift = 6; + } + else { + setup_tab[IND].vertex_format = TEX1_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 10; + setup_tab[IND].vertex_stride_shift = 6; + } + } + else if (DO_TEX0) { + if (DO_PTEX && HAVE_PTEX_VERTICES) { + setup_tab[IND].vertex_format = PROJ_TEX1_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 12; + setup_tab[IND].vertex_stride_shift = 6; + } else { + setup_tab[IND].vertex_format = TEX0_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 8; + setup_tab[IND].vertex_stride_shift = 5; + } + } + else if (!HAVE_HW_DIVIDE && !DO_SPEC && !DO_FOG && HAVE_TINY_VERTICES) { + setup_tab[IND].vertex_format = TINY_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 4; + setup_tab[IND].vertex_stride_shift = 4; + } else if (HAVE_NOTEX_VERTICES) { + setup_tab[IND].vertex_format = NOTEX_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 6; + setup_tab[IND].vertex_stride_shift = 5; + } else { + setup_tab[IND].vertex_format = TEX0_VERTEX_FORMAT; + setup_tab[IND].vertex_size = 8; + setup_tab[IND].vertex_stride_shift = 5; + } + + assert(setup_tab[IND].vertex_size * 4 <= + 1 << setup_tab[IND].vertex_stride_shift); +} + + +#undef IND +#undef TAG diff --git a/reactos/lib/mesa32/src/drivers/common/t_dd_vertex.h b/reactos/lib/mesa32/src/drivers/common/t_dd_vertex.h new file mode 100644 index 00000000000..d45dd09fbd7 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/common/t_dd_vertex.h @@ -0,0 +1,78 @@ + +/* + * Mesa 3-D graphics library + * Version: 4.0.3 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Keith Whitwell + */ + +typedef struct { + GLfloat x, y, z, w; +} TAG(_coord_t); + +#ifdef COLOR_IS_RGBA +typedef struct { +#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN + GLubyte alpha, blue, green, red; +#else + GLubyte red, green, blue, alpha; +#endif +} TAG(_color_t); +#else +typedef struct { +#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN + GLubyte alpha, red, green, blue; +#else + GLubyte blue, green, red, alpha; +#endif +} TAG(_color_t); +#endif + +typedef union { + struct { + GLfloat x, y, z, w; + TAG(_color_t) color; + TAG(_color_t) specular; + GLfloat u0, v0; + GLfloat u1, v1; + GLfloat u2, v2; + GLfloat u3, v3; + } v; + struct { + GLfloat x, y, z, w; + TAG(_color_t) color; + TAG(_color_t) specular; + GLfloat u0, v0, q0; + GLfloat u1, v1, q1; + GLfloat u2, v2, q2; + GLfloat u3, v3, q3; + } pv; + struct { + GLfloat x, y, z; + TAG(_color_t) color; + } tv; + GLfloat f[24]; + GLuint ui[24]; + GLubyte ub4[24][4]; +} TAG(Vertex), *TAG(VertexPtr); + diff --git a/reactos/lib/mesa32/src/drivers/dos/blit.S b/reactos/lib/mesa32/src/drivers/dos/blit.S new file mode 100644 index 00000000000..1f1c77bd563 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/blit.S @@ -0,0 +1,210 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.4 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include "x86/assyntax.h" + + + FILE("blit.S") + +/* + * extern unsigned int vesa_gran_mask, vesa_gran_shift; + * extern int vl_video_selector; + + * extern void *vl_current_draw_buffer; + * extern int vl_current_stride, vl_current_height; + * extern int vl_current_offset, vl_current_delta; + */ +EXTERN _vesa_gran_mask, _vesa_gran_shift +EXTERN _vl_video_selector + +EXTERN _vl_current_draw_buffer +EXTERN _vl_current_stride, _vl_current_height +EXTERN _vl_current_offset, _vl_current_delta + + SEG_TEXT + USE32 + +/* Desc: VESA bank switching routine (BIOS) + * + * In : EBX=0, EDX = bank number + * Out : - + * + * Note: thrashes EAX + */ + ALIGNTEXT32 +_vesa_swbankBIOS: + MOV_W (CONST(0x4f05), AX) + INT (CONST(0x10)) + RET + + ALIGNTEXT8 + GLOBL _vesa_swbank +_vesa_swbank: D_LONG _vesa_swbankBIOS + +/* Desc: void vesa_b_dump_virtual (void); + * + * In : - + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _vesa_b_dump_virtual +_vesa_b_dump_virtual: + CLD + PUSH_SR (ES) + PUSH_L (EBX) + PUSH_L (ESI) + PUSH_L (EDI) + PUSH_L (EBP) + MOV_SR (CONTENT(_vl_video_selector), ES) + MOV_L (CONTENT(_vl_current_draw_buffer), ESI) + MOV_L (CONTENT(_vl_current_offset), EDI) + MOV_L (CONTENT(_vesa_gran_shift), ECX) + MOV_L (CONTENT(_vesa_gran_mask), EBP) + MOV_L (EDI, EDX) + XOR_L (EBX, EBX) + AND_L (EBP, EDI) + SHR_L (CL, EDX) + INC_L (EBP) + CALL (VARINDIRECT(_vesa_swbank)) + MOV_L (CONTENT(_vl_current_stride), ECX) + MOV_L (CONTENT(_vl_current_height), EAX) + MOV_L (CONTENT(_vl_current_delta), EBX) + SHR_L (CONST(2), ECX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + CMP_L (EBP, EDI) + jb TLBL(2) + PUSH_L (EAX) + PUSH_L (EBX) + INC_L (EDX) + XOR_L (EBX, EBX) + CALL (VARINDIRECT(_vesa_swbank)) + POP_L (EBX) + POP_L (EAX) + SUB_L (EBP, EDI) + ALIGNTEXT4 + TLBL(2): + MOVS_L + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (EBX, EDI) + DEC_L (EAX) + jnz TLBL(0) + POP_L (EBP) + POP_L (EDI) + POP_L (ESI) + POP_L (EBX) + POP_SR (ES) + RET + +/* Desc: void vesa_l_dump_virtual (void); + * + * In : - + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _vesa_l_dump_virtual +_vesa_l_dump_virtual: + CLD + PUSH_SR (ES) + PUSH_L (ESI) + PUSH_L (EDI) + MOV_SR (CONTENT(_vl_video_selector), ES) + MOV_L (CONTENT(_vl_current_draw_buffer), ESI) + MOV_L (CONTENT(_vl_current_offset), EDI) + MOV_L (CONTENT(_vl_current_stride), ECX) + MOV_L (CONTENT(_vl_current_height), EDX) + MOV_L (CONTENT(_vl_current_delta), EAX) + SHR_L (CONST(2), ECX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + REP MOVS_L + POP_L (ECX) + ADD_L (EAX, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + POP_SR (ES) + RET + +/* Desc: void vesa_l_dump_virtual_mmx (void); + * + * In : - + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _vesa_l_dump_virtual_mmx +_vesa_l_dump_virtual_mmx: +#ifdef USE_MMX_ASM + PUSH_L (ESI) + PUSH_L (EDI) + MOV_SR (CONTENT(_vl_video_selector), FS) + MOV_L (CONTENT(_vl_current_draw_buffer), ESI) + MOV_L (CONTENT(_vl_current_offset), EDI) + MOV_L (CONTENT(_vl_current_stride), ECX) + MOV_L (CONTENT(_vl_current_height), EDX) + MOV_L (CONTENT(_vl_current_delta), EAX) + SHR_L (CONST(3), ECX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + MOVQ (REGIND(ESI), MM0) + ADD_L (CONST(8), ESI) + SEGFS + MOVQ (MM0, REGIND(EDI)) + ADD_L (CONST(8), EDI) + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (EAX, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + EMMS +#endif + RET diff --git a/reactos/lib/mesa32/src/drivers/dos/dmesa.c b/reactos/lib/mesa32/src/drivers/dos/dmesa.c new file mode 100644 index 00000000000..54323713864 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/dmesa.c @@ -0,0 +1,1418 @@ +/* + * Mesa 3-D graphics library + * Version: 5.1 + * + * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + */ + + +#include "glheader.h" +#include "context.h" +#ifndef FX +#include "bufferobj.h" +#include "extensions.h" +#include "macros.h" +#include "matrix.h" +#include "mtypes.h" +#include "texformat.h" +#include "teximage.h" +#include "texstore.h" +#include "imports.h" +#include "array_cache/acache.h" +#include "swrast/s_context.h" +#include "swrast/s_depth.h" +#include "swrast/s_lines.h" +#include "swrast/s_triangle.h" +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h" +#include "tnl/tnl.h" +#include "tnl/t_context.h" +#include "tnl/t_pipeline.h" +#include "video.h" +#else /* FX */ +#include "GL/fxmesa.h" +#endif /* FX */ + +#include "GL/dmesa.h" + + + +/* + * In C++ terms, this class derives from the GLvisual class. + * Add system-specific fields to it. + */ +struct dmesa_visual { + GLvisual gl_visual; + GLboolean db_flag; /* double buffered? */ + GLboolean rgb_flag; /* RGB mode? */ + GLboolean sw_alpha; /* use Mesa's alpha buffer? */ + GLuint depth; /* bits per pixel (1, 8, 24, etc) */ + int zbuffer; /* Z=buffer: 0=no, 1=SW, -1=HW */ +}; + +/* + * In C++ terms, this class derives from the GLframebuffer class. + * Add system-specific fields to it. + */ +struct dmesa_buffer { + GLframebuffer gl_buffer; /* The depth, stencil, accum, etc buffers */ + void *the_window; /* your window handle, etc */ + + int xpos, ypos; /* position */ + int width, height; /* size in pixels */ +}; + +/* + * In C++ terms, this class derives from the GLcontext class. + * Add system-specific fields to it. + */ +struct dmesa_context { + GLcontext gl_ctx; /* the core library context */ + DMesaVisual visual; + DMesaBuffer Buffer; + GLuint ClearColor; + GLuint ClearIndex; + /* etc... */ +}; + + + +#ifndef FX +/**************************************************************************** + * Read/Write pixels + ***************************************************************************/ +#define FLIP(y) (dmesa->Buffer->height - (y) - 1) +#define FLIP2(y) (_b_ - (y)) + +#define DSTRIDE dmesa->Buffer->width + +/**************************************************************************** + * RGB[A] + ***************************************************************************/ +static void write_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y, + const GLubyte rgba[][4], const GLubyte mask[]) +{ + const DMesaContext dmesa = (DMesaContext)ctx; + GLuint i, offset; + + offset = DSTRIDE * FLIP(y) + x; + if (mask) { + /* draw some pixels */ + for (i=0; iBuffer->height - 1; + + if (mask) { + /* draw some pixels */ + for (i=0; iBuffer->height - 1, rgba = vl_mixrgba(color); + + if (mask) { + /* draw some pixels */ + for (i=0; iBuffer->height - 1; + + if (mask) { + /* read some pixels */ + for (i=0; iBuffer->height - 1; + + if (mask) { + /* draw some pixels */ + for (i=0; iBuffer->height - 1; + + if (mask) { + /* draw some pixels */ + for (i=0; iBuffer->height - 1; + + if (mask) { + /* read some pixels */ + for (i=0; iBuffer->height - 1; \ + GLuint _w_ = dmesa->Buffer->width; \ + GLuint rgb = vl_mixrgb(v2->color); + +#define RENDER_SPAN(span) \ + GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \ + for (i = 0; i < span.end; i++, offset++) { \ + vl_putpixel(offset, rgb); \ + } + +#include "swrast/s_tritemp.h" + + + +/* + * Z-less flat triangle. + */ +#define NAME tri_rgb_flat_zless + +#define INTERP_Z 1 +#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE + +#define SETUP_CODE \ + const DMesaContext dmesa = (DMesaContext)ctx; \ + GLuint _b_ = dmesa->Buffer->height - 1; \ + GLuint _w_ = dmesa->Buffer->width; \ + GLuint rgb = vl_mixrgb(v2->color); + +#define RENDER_SPAN(span) \ + GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \ + for (i = 0; i < span.end; i++, offset++) { \ + const DEPTH_TYPE z = FixedToDepth(span.z); \ + if (z < zRow[i]) { \ + vl_putpixel(offset, rgb); \ + zRow[i] = z; \ + } \ + span.z += span.zStep; \ + } + +#include "swrast/s_tritemp.h" + + + +/* + * NON-depth-buffered iterated triangle. + */ +#define NAME tri_rgb_iter + +#define INTERP_RGB 1 + +#define SETUP_CODE \ + const DMesaContext dmesa = (DMesaContext)ctx; \ + GLuint _b_ = dmesa->Buffer->height - 1; \ + GLuint _w_ = dmesa->Buffer->width; + +#define RENDER_SPAN(span) \ + GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \ + for (i = 0; i < span.end; i++, offset++) { \ + vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue)); \ + span.red += span.redStep; \ + span.green += span.greenStep; \ + span.blue += span.blueStep; \ + } + +#include "swrast/s_tritemp.h" + + + +/* + * Z-less iterated triangle. + */ +#define NAME tri_rgb_iter_zless + +#define INTERP_Z 1 +#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE +#define INTERP_RGB 1 + +#define SETUP_CODE \ + const DMesaContext dmesa = (DMesaContext)ctx; \ + GLuint _b_ = dmesa->Buffer->height - 1; \ + GLuint _w_ = dmesa->Buffer->width; + +#define RENDER_SPAN(span) \ + GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \ + for (i = 0; i < span.end; i++, offset++) { \ + const DEPTH_TYPE z = FixedToDepth(span.z); \ + if (z < zRow[i]) { \ + vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));\ + zRow[i] = z; \ + } \ + span.red += span.redStep; \ + span.green += span.greenStep; \ + span.blue += span.blueStep; \ + span.z += span.zStep; \ + } + +#include "swrast/s_tritemp.h" + + + +/* + * Analyze context state to see if we can provide a fast triangle function + * Otherwise, return NULL. + */ +static swrast_tri_func dmesa_choose_tri_function (GLcontext *ctx) +{ + const SWcontext *swrast = SWRAST_CONTEXT(ctx); + + if ((ctx->RenderMode != GL_RENDER) + || (ctx->Polygon.SmoothFlag) + || (ctx->Polygon.StippleFlag) + || (ctx->Texture._EnabledUnits) + || (swrast->_RasterMask & MULTI_DRAW_BIT) + || (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)) { + return (swrast_tri_func)NULL; + } + + if (swrast->_RasterMask==DEPTH_BIT + && ctx->Depth.Func==GL_LESS + && ctx->Depth.Mask==GL_TRUE + && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { + return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter_zless : tri_rgb_flat_zless; + } + + if (swrast->_RasterMask==0) { /* no depth test */ + return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter : tri_rgb_flat; + } + + return (swrast_tri_func)NULL; +} + + + +/* Override for the swrast triangle-selection function. Try to use one + * of our internal triangle functions, otherwise fall back to the + * standard swrast functions. + */ +static void dmesa_choose_tri (GLcontext *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + + if (!(swrast->Triangle=dmesa_choose_tri_function(ctx))) + _swrast_choose_triangle(ctx); +} + + + +/**************************************************************************** + * Optimized line rendering + ***************************************************************************/ + +/* + * NON-depth-buffered flat line. + */ +#define NAME line_rgb_flat + +#define INTERP_XY 1 +#define CLIP_HACK 1 + +#define SETUP_CODE \ + const DMesaContext dmesa = (DMesaContext)ctx; \ + GLuint _b_ = dmesa->Buffer->height - 1; \ + GLuint _w_ = dmesa->Buffer->width; \ + GLuint rgb = vl_mixrgb(vert1->color); + +#define PLOT(X,Y) vl_putpixel(FLIP2(Y) * _w_ + X, rgb); + +#include "swrast/s_linetemp.h" + + + +/* + * Z-less flat line. + */ +#define NAME line_rgb_flat_zless + +#define INTERP_XY 1 +#define INTERP_Z 1 +#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE +#define CLIP_HACK 1 + +#define SETUP_CODE \ + const DMesaContext dmesa = (DMesaContext)ctx; \ + GLuint _b_ = dmesa->Buffer->height - 1; \ + GLuint _w_ = dmesa->Buffer->width; \ + GLuint rgb = vl_mixrgb(vert1->color); + +#define PLOT(X,Y) \ + if (Z < *zPtr) { \ + *zPtr = Z; \ + vl_putpixel(FLIP2(Y) * _w_ + X, rgb); \ + } + +#include "swrast/s_linetemp.h" + + + +/* + * NON-depth-buffered iterated line. + */ +#define line_rgb_iter NULL + + + +/* + * Z-less iterated line. + */ +#define line_rgb_iter_zless NULL + + + +/* + * Analyze context state to see if we can provide a fast line function + * Otherwise, return NULL. + */ +static swrast_line_func dmesa_choose_line_function (GLcontext *ctx) +{ + const SWcontext *swrast = SWRAST_CONTEXT(ctx); + + if ((ctx->RenderMode != GL_RENDER) + || (ctx->Line.SmoothFlag) + || (ctx->Texture._EnabledUnits) + || (ctx->Line.StippleFlag) + || (swrast->_RasterMask & MULTI_DRAW_BIT) + || (ctx->Line.Width!=1.0F)) { + return (swrast_line_func)NULL; + } + + if (swrast->_RasterMask==DEPTH_BIT + && ctx->Depth.Func==GL_LESS + && ctx->Depth.Mask==GL_TRUE + && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { + return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter_zless : line_rgb_flat_zless; + } + + if (swrast->_RasterMask==0) { /* no depth test */ + return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter : line_rgb_flat; + } + + return (swrast_line_func)NULL; +} + + + +/* Override for the swrast line-selection function. Try to use one + * of our internal line functions, otherwise fall back to the + * standard swrast functions. + */ +static void dmesa_choose_line (GLcontext *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + + if (!(swrast->Line=dmesa_choose_line_function(ctx))) + _swrast_choose_line(ctx); +} + + + +/**************************************************************************** + * Miscellaneous device driver funcs + ***************************************************************************/ + +static void clear_index (GLcontext *ctx, GLuint index) +{ + ((DMesaContext)ctx)->ClearIndex = index; +} + +static void clear_color (GLcontext *ctx, const GLfloat color[4]) +{ + GLubyte col[4]; + CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]); + CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]); + CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]); + CLAMPED_FLOAT_TO_UBYTE(col[3], color[3]); + ((DMesaContext)ctx)->ClearColor = vl_mixrgba(col); +} + + + +static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all, + GLint x, GLint y, GLint width, GLint height) +{ + const DMesaContext c = (DMesaContext)ctx; + const GLuint *colorMask = (GLuint *)&ctx->Color.ColorMask; + +/* + * Clear the specified region of the buffers indicated by 'mask' + * using the clear color or index as specified by one of the two + * functions above. + * If all==GL_TRUE, clear whole buffer, else just clear region defined + * by x,y,width,height + */ + + /* we can't handle color or index masking */ + if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) { + if (mask & DD_BACK_LEFT_BIT) { + int color = c->visual->rgb_flag ? c->ClearColor : c->ClearIndex; + + if (all) { + vl_clear(color); + } else { + vl_rect(x, y, width, height, color); + } + + mask &= ~DD_BACK_LEFT_BIT; + } + } + + if (mask) { + _swrast_Clear(ctx, mask, all, x, y, width, height); + } +} + + + +/* + * This function is called to specify which buffer to read and write + * for software rasterization (swrast) fallbacks. This doesn't necessarily + * correspond to glDrawBuffer() or glReadBuffer() calls. + */ +static void set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit) +{ + /* + * XXX todo - examine bufferBit and set read/write pointers + */ + /* Normally, we would have + * ctx->Driver.ReadBuffer == set_read_buffer + * ctx->Driver.DrawBuffer == set_draw_buffer + * and make sure set_draw_buffer calls _swrast_DrawBuffer, + * which in turn will call this routine via dd->SetBuffer. + */ +} + + + +/* + * Return the width and height of the current buffer. + * If anything special has to been done when the buffer/window is + * resized, do it now. + */ +static void get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height) +{ + DMesaBuffer b = (DMesaBuffer)buffer; + + *width = b->width; + *height = b->height; +} + + + +static const GLubyte* get_string (GLcontext *ctx, GLenum name) +{ + switch (name) { + case GL_RENDERER: + return (const GLubyte *)"Mesa DJGPP" + "\0port (c) Borca Daniel dec-2003"; + default: + return NULL; + } +} + + + +static void finish (GLcontext *ctx) +{ + /* + * XXX todo - OPTIONAL FUNCTION: implements glFinish if possible + */ +} + + + +static void flush (GLcontext *ctx) +{ + /* + * XXX todo - OPTIONAL FUNCTION: implements glFlush if possible + */ +} + + + +/**************************************************************************** + * State + ***************************************************************************/ +#define DMESA_NEW_LINE (_NEW_LINE | \ + _NEW_TEXTURE | \ + _NEW_LIGHT | \ + _NEW_DEPTH | \ + _NEW_RENDERMODE | \ + _SWRAST_NEW_RASTERMASK) + +#define DMESA_NEW_TRIANGLE (_NEW_POLYGON | \ + _NEW_TEXTURE | \ + _NEW_LIGHT | \ + _NEW_DEPTH | \ + _NEW_RENDERMODE | \ + _SWRAST_NEW_RASTERMASK) + +/* Extend the software rasterizer with our line and triangle + * functions. + */ +static void dmesa_register_swrast_functions (GLcontext *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + + swrast->choose_line = dmesa_choose_line; + swrast->choose_triangle = dmesa_choose_tri; + + swrast->invalidate_line |= DMESA_NEW_LINE; + swrast->invalidate_triangle |= DMESA_NEW_TRIANGLE; +} + + + +/* Setup pointers and other driver state that is constant for the life + * of a context. + */ +static void dmesa_init_pointers (GLcontext *ctx) +{ + TNLcontext *tnl; + struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference(ctx); + + ctx->Driver.GetString = get_string; + ctx->Driver.GetBufferSize = get_buffer_size; + ctx->Driver.Flush = flush; + ctx->Driver.Finish = finish; + + /* Software rasterizer pixel paths: + */ + ctx->Driver.Accum = _swrast_Accum; + ctx->Driver.Bitmap = _swrast_Bitmap; + ctx->Driver.Clear = clear; + ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; + ctx->Driver.CopyPixels = _swrast_CopyPixels; + ctx->Driver.DrawPixels = _swrast_DrawPixels; + ctx->Driver.ReadPixels = _swrast_ReadPixels; + ctx->Driver.DrawBuffer = _swrast_DrawBuffer; + + /* Software texture functions: + */ + ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; + ctx->Driver.TexImage1D = _mesa_store_teximage1d; + ctx->Driver.TexImage2D = _mesa_store_teximage2d; + ctx->Driver.TexImage3D = _mesa_store_teximage3d; + ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; + ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; + ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; + ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; + + ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; + ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; + ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; + ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; + ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; + + ctx->Driver.CompressedTexImage1D = _mesa_store_compressed_teximage1d; + ctx->Driver.CompressedTexImage2D = _mesa_store_compressed_teximage2d; + ctx->Driver.CompressedTexImage3D = _mesa_store_compressed_teximage3d; + ctx->Driver.CompressedTexSubImage1D = _mesa_store_compressed_texsubimage1d; + ctx->Driver.CompressedTexSubImage2D = _mesa_store_compressed_texsubimage2d; + ctx->Driver.CompressedTexSubImage3D = _mesa_store_compressed_texsubimage3d; + + /* Swrast hooks for imaging extensions: + */ + ctx->Driver.CopyColorTable = _swrast_CopyColorTable; + ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; + ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; + ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; + + /* Statechange callbacks: + */ + ctx->Driver.ClearColor = clear_color; + ctx->Driver.ClearIndex = clear_index; + + /* Initialize the TNL driver interface: + */ + tnl = TNL_CONTEXT(ctx); + tnl->Driver.RunPipeline = _tnl_run_pipeline; + + dd->SetBuffer = set_buffer; + + /* Install swsetup for tnl->Driver.Render.*: + */ + _swsetup_Wakeup(ctx); + + /* The span functions should be in `dmesa_update_state', but I'm + * pretty sure they will never change during the life of the Visual + */ + + /* Index span/pixel functions */ + dd->WriteCI32Span = write_index_span; + dd->WriteCI8Span = write_index8_span; + dd->WriteMonoCISpan = write_mono_index_span; + dd->WriteCI32Pixels = write_index_pixels; + dd->WriteMonoCIPixels = write_mono_index_pixels; + dd->ReadCI32Span = read_index_span; + dd->ReadCI32Pixels = read_index_pixels; + + /* RGB(A) span/pixel functions */ + dd->WriteRGBASpan = write_rgba_span; + dd->WriteRGBSpan = write_rgb_span; + dd->WriteMonoRGBASpan = write_mono_rgba_span; + dd->WriteRGBAPixels = write_rgba_pixels; + dd->WriteMonoRGBAPixels = write_mono_rgba_pixels; + dd->ReadRGBASpan = read_rgba_span; + dd->ReadRGBAPixels = read_rgba_pixels; +} + + + +static void dmesa_update_state (GLcontext *ctx, GLuint new_state) +{ + /* Propagate statechange information to swrast and swrast_setup + * modules. The DMesa driver has no internal GL-dependent state. + */ + _swrast_InvalidateState( ctx, new_state ); + _ac_InvalidateState( ctx, new_state ); + _tnl_InvalidateState( ctx, new_state ); + _swsetup_InvalidateState( ctx, new_state ); +} +#endif /* FX */ + + + +/**************************************************************************** + * DMesa Public API Functions + ***************************************************************************/ + +/* + * The exact arguments to this function will depend on your window system + */ +DMesaVisual DMesaCreateVisual (GLint width, + GLint height, + GLint colDepth, + GLint refresh, + GLboolean dbFlag, + GLboolean rgbFlag, + GLint alphaSize, + GLint depthSize, + GLint stencilSize, + GLint accumSize) +{ +#ifndef FX + DMesaVisual v; + GLint redBits, greenBits, blueBits, alphaBits, indexBits; + GLboolean sw_alpha; + + if (!dbFlag) { + return NULL; + } + + alphaBits = 0; + + if (!rgbFlag) { + indexBits = 8; + redBits = 0; + greenBits = 0; + blueBits = 0; + } else { + indexBits = 0; + switch (colDepth) { + case 8: + redBits = 8; + greenBits = 8; + blueBits = 8; + break; + case 15: + alphaBits = 1; + redBits = 5; + greenBits = 5; + blueBits = 5; + break; + case 16: + redBits = 5; + greenBits = 6; + blueBits = 5; + break; + case 32: + alphaBits = 8; + case 24: + redBits = 8; + greenBits = 8; + blueBits = 8; + break; + default: + return NULL; + } + } + + /* Okay, + * `alphaBits' is what we can provide + * `alphaSize' is what app requests + * + * Note that alpha buffering is required only if destination alpha is used + * in alpha blending; alpha blending modes that do not use destination alpha + * can be used w/o alpha buffer. + * + * We will use whatever ALPHA app requests. Later, in `CreateBuffer' we'll + * instruct Mesa to use its own ALPHA buffer, by passing a non-FALSE value + * for ALPHA to `_mesa_initialize_framebuffer'. + * + * Basically, 32bit modes provide ALPHA storage, but can we rely on this? + */ + alphaBits = alphaSize; + sw_alpha = (alphaBits > 0); + + if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) { + return NULL; + } + + if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) { + /* Create core visual */ + _mesa_initialize_visual((GLvisual *)v, + rgbFlag, /* rgb */ + dbFlag, + GL_FALSE, /* stereo */ + redBits, + greenBits, + blueBits, + alphaBits, + indexBits, /* indexBits */ + depthSize, + stencilSize, + accumSize, /* accumRed */ + accumSize, /* accumGreen */ + accumSize, /* accumBlue */ + alphaBits?accumSize:0, /* accumAlpha */ + 1); /* numSamples */ + + v->depth = colDepth; + v->db_flag = dbFlag; + v->rgb_flag = rgbFlag; + v->sw_alpha = sw_alpha; + + v->zbuffer = (depthSize > 0) ? 1 : 0; + } + + return v; + +#else /* FX */ + + char *env; + int i = 0, fx_attrib[32]; + + if (!rgbFlag) { + return NULL; + } + + if (dbFlag) fx_attrib[i++] = FXMESA_DOUBLEBUFFER; + if (depthSize > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = depthSize; } + if (stencilSize > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = stencilSize; } + if (accumSize > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = accumSize; } + if (alphaSize) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = alphaSize; } + fx_attrib[i++] = FXMESA_COLORDEPTH; + fx_attrib[i++] = colDepth; + fx_attrib[i] = FXMESA_NONE; + + if ((env = getenv("MESA_FX_INFO")) && (env[0] == 'r')) { + freopen("MESA.LOG", "w", stderr); + } + + if (refresh && (((env = getenv("FX_GLIDE_REFRESH")) == NULL) || !atoi(env))) { + /* if we are passed non-zero value for refresh, we need to override + * default refresh rate. However, if FX_GLIDE_REFRESH is already set + * to 0, we won't override it, because it has a special meaning for + * DJGPP Glide3x (switch via VESA, using BIOS default refresh). + */ + char tmp[256]; + sprintf(tmp, "FX_GLIDE_REFRESH=%u", refresh); + putenv(tmp); + } + + return (DMesaVisual)fxMesaCreateBestContext(-1, width, height, fx_attrib); +#endif /* FX */ +} + + + +void DMesaDestroyVisual (DMesaVisual v) +{ +#ifndef FX + _mesa_destroy_visual((GLvisual *)v); + + vl_video_exit(); + +#else + fxMesaDestroyContext((fxMesaContext)v); +#endif +} + + + +DMesaBuffer DMesaCreateBuffer (DMesaVisual visual, + GLint xpos, GLint ypos, + GLint width, GLint height) +{ +#ifndef FX + DMesaBuffer b; + + if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) { + _mesa_initialize_framebuffer((GLframebuffer *)b, + (GLvisual *)visual, + visual->zbuffer == 1, + ((GLvisual *)visual)->stencilBits > 0, + ((GLvisual *)visual)->accumRedBits > 0, + visual->sw_alpha); + b->xpos = xpos; + b->ypos = ypos; + b->width = width; + b->height = height; + } + + return b; +#else + return (DMesaBuffer)visual; +#endif +} + + + +void DMesaDestroyBuffer (DMesaBuffer b) +{ +#ifndef FX + free(b->the_window); + _mesa_destroy_framebuffer((GLframebuffer *)b); +#endif +} + + + +DMesaContext DMesaCreateContext (DMesaVisual visual, + DMesaContext share) +{ +#ifndef FX + DMesaContext c; + GLboolean direct = GL_FALSE; + + if ((c=(DMesaContext)CALLOC_STRUCT(dmesa_context)) != NULL) { + _mesa_initialize_context((GLcontext *)c, + (GLvisual *)visual, + (GLcontext *)share, + (void *)c, direct); + + _mesa_enable_sw_extensions((GLcontext *)c); + _mesa_enable_1_3_extensions((GLcontext *)c); + _mesa_enable_1_4_extensions((GLcontext *)c); + _mesa_enable_1_5_extensions((GLcontext *)c); + + /* you probably have to do a bunch of other initializations here. */ + c->visual = visual; + + ((GLcontext *)c)->Driver.UpdateState = dmesa_update_state; + + /* Initialize the software rasterizer and helper modules. + */ + _swrast_CreateContext((GLcontext *)c); + _ac_CreateContext((GLcontext *)c); + _tnl_CreateContext((GLcontext *)c); + _swsetup_CreateContext((GLcontext *)c); + if (visual->rgb_flag) dmesa_register_swrast_functions((GLcontext *)c); + dmesa_init_pointers((GLcontext *)c); + } + + return c; + +#else /* FX */ + return (DMesaContext)visual; +#endif /* FX */ +} + + + +void DMesaDestroyContext (DMesaContext c) +{ +#ifndef FX + if (c) { + _swsetup_DestroyContext((GLcontext *)c); + _swrast_DestroyContext((GLcontext *)c); + _tnl_DestroyContext((GLcontext *)c); + _ac_DestroyContext((GLcontext *)c); + _mesa_destroy_context((GLcontext *)c); + } +#endif +} + + + +GLboolean DMesaMoveBuffer (GLint xpos, GLint ypos) +{ +#ifndef FX + GET_CURRENT_CONTEXT(ctx); + DMesaBuffer b = ((DMesaContext)ctx)->Buffer; + + if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) != 0) { + return GL_FALSE; + } else { + b->xpos = xpos; + b->ypos = ypos; + return GL_TRUE; + } + +#else + return GL_FALSE; +#endif +} + + + +GLboolean DMesaResizeBuffer (GLint width, GLint height) +{ +#ifndef FX + GET_CURRENT_CONTEXT(ctx); + DMesaBuffer b = ((DMesaContext)ctx)->Buffer; + + if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) != 0) { + return GL_FALSE; + } else { + b->width = width; + b->height = height; + return GL_TRUE; + } + +#else + return GL_FALSE; +#endif +} + + + +/* + * Make the specified context and buffer the current one. + */ +GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b) +{ +#ifndef FX + if ((c != NULL) && (b != NULL)) { + if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, b->width, b->height) != 0) { + return GL_FALSE; + } + + c->Buffer = b; + + _mesa_make_current((GLcontext *)c, (GLframebuffer *)b); + if (((GLcontext *)c)->Viewport.Width == 0) { + /* initialize viewport to window size */ + _mesa_Viewport(0, 0, b->width, b->height); + } + } else { + /* Detach */ + _mesa_make_current(NULL, NULL); + } + +#else + fxMesaMakeCurrent((fxMesaContext)c); +#endif + + return GL_TRUE; +} + + + +void DMesaSwapBuffers (DMesaBuffer b) +{ + /* copy/swap back buffer to front if applicable */ +#ifndef FX + GET_CURRENT_CONTEXT(ctx); + _mesa_notifySwapBuffers(ctx); + vl_flip(); +#else + fxMesaSwapBuffers(); +#endif +} + + + +void DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue) +{ +#ifndef FX + vl_setCI(ndx, red, green, blue); +#endif +} + + + +void *DMesaGetCurrentContext (void) +{ +#ifndef FX + GET_CURRENT_CONTEXT(ctx); + return ctx; +#else + return fxMesaGetCurrentContext(); +#endif +} + + + +int DMesaGetIntegerv (GLenum pname, GLint *params) +{ + switch (pname) { + case DMESA_GET_SCREEN_SIZE: + #ifndef FX + vl_get(VL_GET_SCREEN_SIZE, params); + #else + fxGetScreenGeometry(¶ms[0], ¶ms[1]); + #endif + break; + case DMESA_GET_DRIVER_CAPS: + #ifndef FX + params[0] = DMESA_DRIVER_SWDB_BIT; + #else + params[0] = DMESA_DRIVER_LLWO_BIT; + #endif + break; + case DMESA_GET_VIDEO_MODES: + #ifndef FX + return vl_get(VL_GET_VIDEO_MODES, params); + #else + { + /* `vmode' struct must be sync'ed with `internal.h' (vl_mode) + * `vmode' list must be sync'ed with `fxapi.c' + * `hw >= 6' means Napalm and can do 32bit rendering + * TODO: we should take an envvar for `fxMesaSelectCurrentBoard' + */ + static struct { + int width, height; + int bpp; + } vmode[] = { + { 320, 200, 16 }, + { 320, 240, 16 }, + { 512, 384, 16 }, + { 640, 400, 16 }, + { 640, 480, 16 }, + { 800, 600, 16 }, + {1024, 768, 16 }, + + { 320, 200, 32 }, + { 320, 240, 32 }, + { 512, 384, 32 }, + { 640, 400, 32 }, + { 640, 480, 32 }, + { 800, 600, 32 }, + {1024, 768, 32 } + }; + int hw = fxMesaSelectCurrentBoard(0); + int i, n = sizeof(vmode) / sizeof(vmode[0]); + if (hw < 6) { + n /= 2; + } + if (params) { + for (i = 0; i < n; i++) { + params[i] = (GLint)(&vmode[i]); + } + } + return n; + } + #endif + default: + return -1; + } + + return 0; +} diff --git a/reactos/lib/mesa32/src/drivers/dos/dpmi.c b/reactos/lib/mesa32/src/drivers/dos/dpmi.c new file mode 100644 index 00000000000..f9943ea60bf --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/dpmi.c @@ -0,0 +1,148 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.4 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include + +#include "internal.h" + + + +#ifndef MAX +#define MAX(x, y) (((x)<(y))?(y):(x)) +#endif + + + +/* _create_linear_mapping: + * Maps a physical address range into linear memory. + */ +int _create_linear_mapping (unsigned long *linear, unsigned long physaddr, int size) +{ + __dpmi_meminfo meminfo; + + if (physaddr >= 0x100000) { + /* map into linear memory */ + meminfo.address = physaddr; + meminfo.size = size; + if (__dpmi_physical_address_mapping(&meminfo) != 0) + return -1; + + *linear = meminfo.address; + } else { + /* exploit 1 -> 1 physical to linear mapping in low megabyte */ + *linear = physaddr; + } + + return 0; +} + + + +/* _remove_linear_mapping: + * Frees the DPMI resources being used to map a linear address range. + */ +void _remove_linear_mapping (unsigned long *linear) +{ + __dpmi_meminfo meminfo; + + if (*linear) { + if (*linear >= 0x100000) { + meminfo.address = *linear; + __dpmi_free_physical_address_mapping(&meminfo); + } + + *linear = 0; + } +} + + + +/* _create_selector: + * Allocates a selector to access a region of linear memory. + */ +int _create_selector (int *segment, unsigned long base, int size) +{ + /* allocate an ldt descriptor */ + if ((*segment=__dpmi_allocate_ldt_descriptors(1)) < 0) { + *segment = 0; + return -1; + } + + /* create the linear mapping */ + if (_create_linear_mapping(&base, base, size)) { + __dpmi_free_ldt_descriptor(*segment); + *segment = 0; + return -1; + } + + /* set the descriptor base and limit */ + __dpmi_set_segment_base_address(*segment, base); + __dpmi_set_segment_limit(*segment, MAX(size-1, 0xFFFF)); + + return 0; +} + + + +/* _remove_selector: + * Frees a DPMI segment selector. + */ +void _remove_selector (int *segment) +{ + if (*segment) { + unsigned long base; + __dpmi_get_segment_base_address(*segment, &base); + _remove_linear_mapping(&base); + __dpmi_free_ldt_descriptor(*segment); + *segment = 0; + } +} + + + +/* Desc: retrieve CPU MMX capability + * + * In : - + * Out : FALSE if CPU cannot do MMX + * + * Note: - + */ +int _can_mmx (void) +{ +#ifdef USE_MMX_ASM + extern int _mesa_x86_cpu_features; + return (_mesa_x86_cpu_features & 0x00800000); +#else + return 0; +#endif +} diff --git a/reactos/lib/mesa32/src/drivers/dos/internal.h b/reactos/lib/mesa32/src/drivers/dos/internal.h new file mode 100644 index 00000000000..fd47dbb7b82 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/internal.h @@ -0,0 +1,130 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + */ + + +#ifndef INTERNAL_H_included +#define INTERNAL_H_included + +#include "../main/mtypes.h" + +/* + * general purpose defines, etc. + */ +#ifndef FALSE +#define FALSE 0 +#define TRUE !FALSE +#endif + +#define __PACKED__ __attribute__((packed)) + +typedef unsigned char word8; +typedef unsigned short word16; +typedef unsigned long word32; + +#define _16_ *(word16 *)& +#define _32_ *(word32 *)& + + + +/* + * video mode structure + */ +typedef struct vl_mode { + int xres, yres; + int bpp; + + int mode; + int scanlen; + + int sel; + int gran; +} vl_mode; + + + +/* + * video driver structure + */ +typedef struct { + vl_mode *(*init) (void); + int (*entermode) (vl_mode *p, int refresh); + void (*blit) (void); + void (*setCI_f) (int index, float red, float green, float blue); + void (*setCI_i) (int index, int red, int green, int blue); + int (*get) (int pname, int *params); + void (*restore) (void); + void (*fini) (void); +} vl_driver; + + + +/* + * memory mapping + */ +int _create_linear_mapping (unsigned long *linear, unsigned long physaddr, int size); +void _remove_linear_mapping (unsigned long *linear); +int _create_selector (int *segment, unsigned long base, int size); +void _remove_selector (int *segment); + +/* + * system routines + */ +int _can_mmx (void); + +/* + * asm routines to deal with virtual buffering + */ +extern void v_clear8 (int color); +#define v_clear15 v_clear16 +extern void v_clear16 (int color); +extern void v_clear24 (int color); +extern void v_clear32 (int color); + +extern void v_clear8_mmx (int color); +#define v_clear15_mmx v_clear16_mmx +extern void v_clear16_mmx (int color); +extern void v_clear24_mmx (int color); +extern void v_clear32_mmx (int color); + +extern void v_rect8 (int x, int y, int width, int height, int color); +#define v_rect15 v_rect16 +extern void v_rect16 (int x, int y, int width, int height, int color); +extern void v_rect24 (int x, int y, int width, int height, int color); +extern void v_rect32 (int x, int y, int width, int height, int color); + +extern void v_putpixel8 (unsigned int offset, int color); +#define v_putpixel15 v_putpixel16 +extern void v_putpixel16 (unsigned int offset, int color); +extern void v_putpixel24 (unsigned int offset, int color); +extern void v_putpixel32 (unsigned int offset, int color); + +#endif diff --git a/reactos/lib/mesa32/src/drivers/dos/vesa.c b/reactos/lib/mesa32/src/drivers/dos/vesa.c new file mode 100644 index 00000000000..e87651e4fd2 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/vesa.c @@ -0,0 +1,534 @@ +/* + * Mesa 3-D graphics library + * Version: 4.1 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "video.h" +#include "vesa.h" + + + +static vl_mode modes[128]; + +static word16 vesa_ver; +static int banked_selector, linear_selector; +static int oldmode = -1; + +static int vesa_color_precision = 6; + +static word16 *vesa_pmcode; +unsigned int vesa_gran_mask, vesa_gran_shift; + + + +/* + * VESA info + */ +#define V_SIGN 0 +#define V_MINOR 4 +#define V_MAJOR 5 +#define V_OEM_OFS 6 +#define V_OEM_SEG 8 +#define V_MODE_OFS 14 +#define V_MODE_SEG 16 +#define V_MEMORY 18 + +/* + * mode info + */ +#define M_ATTR 0 +#define M_GRAN 4 +#define M_SCANLEN 16 +#define M_XRES 18 +#define M_YRES 20 +#define M_BPP 25 +#define M_RED 31 +#define M_GREEN 33 +#define M_BLUE 35 +#define M_PHYS_PTR 40 + +/* + * VESA 3.0 CRTC timings structure + */ +typedef struct CRTCInfoBlock { + unsigned short HorizontalTotal; + unsigned short HorizontalSyncStart; + unsigned short HorizontalSyncEnd; + unsigned short VerticalTotal; + unsigned short VerticalSyncStart; + unsigned short VerticalSyncEnd; + unsigned char Flags; + unsigned long PixelClock; /* units of Hz */ + unsigned short RefreshRate; /* units of 0.01 Hz */ + unsigned char reserved[40]; +} __PACKED__ CRTCInfoBlock; + +#define HNEG (1 << 2) +#define VNEG (1 << 3) +#define DOUBLESCAN (1 << 0) + + + +/* Desc: Attempts to detect VESA, check video modes and create selectors. + * + * In : - + * Out : mode array + * + * Note: - + */ +static vl_mode *vesa_init (void) +{ + __dpmi_regs r; + word16 *p; + vl_mode *q; + char vesa_info[512], tmp[512]; + int maxsize = 0; + word32 linearfb = 0; + + if (vesa_ver) { + return modes; + } + + _farpokel(_stubinfo->ds_selector, 0, 0x32454256); + r.x.ax = 0x4f00; + r.x.di = 0; + r.x.es = _stubinfo->ds_segment; + __dpmi_int(0x10, &r); + movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512); + if ((r.x.ax!=0x004f) || ((_32_ vesa_info[V_SIGN])!=0x41534556)) { + return NULL; + } + + p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS])); + q = modes; + do { + if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) { + break; + } + + r.x.ax = 0x4f01; + r.x.cx = q->mode; + r.x.di = 512; + r.x.es = _stubinfo->ds_segment; + __dpmi_int(0x10, &r); + movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256); + switch (tmp[M_BPP]) { + case 16: + q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE]; + break; + case 8: + case 15: + case 24: + case 32: + q->bpp = tmp[M_BPP]; + break; + default: + q->bpp = 0; + } + if ((r.x.ax==0x004f) && ((tmp[M_ATTR]&0x11)==0x11) && q->bpp) { + q->xres = _16_ tmp[M_XRES]; + q->yres = _16_ tmp[M_YRES]; + q->scanlen = _16_ tmp[M_SCANLEN]; + q->gran = (_16_ tmp[M_GRAN])<<10; + if (tmp[M_ATTR]&0x80) { +#if 0 + *(q+1) = *q++; +#else + vl_mode *q1 = q + 1; + *q1 = *q++; +#endif + linearfb = _32_ tmp[M_PHYS_PTR]; + q->mode |= 0x4000; + } + if (maxsize<(q->scanlen*q->yres)) { + maxsize = q->scanlen*q->yres; + } + q++; + } + } while (TRUE); + + if (q==modes) { + return NULL; + } + if (linearfb) { + maxsize = ((maxsize+0xfffUL)&~0xfffUL); + if (_create_selector(&linear_selector, linearfb, maxsize)) { + return NULL; + } + } + if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) { + _remove_selector(&linear_selector); + return NULL; + } + + for (q=modes; q->mode!=0xffff; q++) { + q->sel = (q->mode&0x4000) ? linear_selector : banked_selector; + } + + if (vesa_info[V_MAJOR] >= 2) { + r.x.ax = 0x4f0a; + r.x.bx = 0; + __dpmi_int(0x10, &r); + if (r.x.ax == 0x004f) { + vesa_pmcode = (word16 *)malloc(r.x.cx); + movedata(__djgpp_dos_sel, (r.x.es << 4) + r.x.di, _my_ds(), (unsigned)vesa_pmcode, r.x.cx); + if (vesa_pmcode[3]) { + p = (word16 *)((long)vesa_pmcode + vesa_pmcode[3]); + while (*p++ != 0xffff) ; + } else { + p = NULL; + } + if (p && (*p != 0xffff)) { + free(vesa_pmcode); + vesa_pmcode = NULL; + } else { + vesa_swbank = (void *)((long)vesa_pmcode + vesa_pmcode[0]); + } + } + } + + vesa_ver = _16_ vesa_info[V_MINOR]; + return modes; +} + + + +/* Desc: Frees all resources allocated by VESA init code. + * + * In : - + * Out : - + * + * Note: - + */ +static void vesa_fini (void) +{ + if (vesa_ver) { + _remove_selector(&linear_selector); + _remove_selector(&banked_selector); + if (vesa_pmcode != NULL) { + free(vesa_pmcode); + vesa_pmcode = NULL; + } + } +} + + + +/* Desc: Uses VESA 3.0 function 0x4F0B to find the closest pixel clock to the requested value. + * + * In : mode, clock + * Out : desired clock + * + * Note: - + */ +static unsigned long _closest_pixclk (int mode_no, unsigned long vclk) +{ + __dpmi_regs r; + + r.x.ax = 0x4F0B; + r.h.bl = 0; + r.d.ecx = vclk; + r.x.dx = mode_no; + __dpmi_int(0x10, &r); + + return (r.x.ax==0x004f) ? r.d.ecx : 0; +} + + + +/* Desc: Calculates CRTC mode timings. + * + * In : crtc block, geometry, adjust + * Out : + * + * Note: + */ +static void _crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust, int yadjust) +{ + int HTotal, VTotal; + int HDisp, VDisp; + int HSS, VSS; + int HSE, VSE; + int HSWidth, VSWidth; + int SS, SE; + int doublescan = FALSE; + + if (yres < 400) { + doublescan = TRUE; + yres *= 2; + } + + HDisp = xres; + HTotal = (int)(HDisp * 1.27) & ~0x7; + HSWidth = (int)((HTotal - HDisp) / 5) & ~0x7; + HSS = HDisp + 16; + HSE = HSS + HSWidth; + VDisp = yres; + VTotal = VDisp * 1.07; + VSWidth = (VTotal / 100) + 1; + VSS = VDisp + ((int)(VTotal - VDisp) / 5) + 1; + VSE = VSS + VSWidth; + + SS = HSS + xadjust; + SE = HSE + xadjust; + + if (xadjust < 0) { + if (SS < (HDisp + 8)) { + SS = HDisp + 8; + SE = SS + HSWidth; + } + } else { + if ((HTotal - 24) < SE) { + SE = HTotal - 24; + SS = SE - HSWidth; + } + } + + HSS = SS; + HSE = SE; + + SS = VSS + yadjust; + SE = VSE + yadjust; + + if (yadjust < 0) { + if (SS < (VDisp + 3)) { + SS = VDisp + 3; + SE = SS + VSWidth; + } + } else { + if ((VTotal - 4) < SE) { + SE = VTotal - 4; + SS = SE - VSWidth; + } + } + + VSS = SS; + VSE = SE; + + crtc->HorizontalTotal = HTotal; + crtc->HorizontalSyncStart = HSS; + crtc->HorizontalSyncEnd = HSE; + crtc->VerticalTotal = VTotal; + crtc->VerticalSyncStart = VSS; + crtc->VerticalSyncEnd = VSE; + crtc->Flags = HNEG | VNEG; + + if (doublescan) + crtc->Flags |= DOUBLESCAN; +} + + + +/* Desc: Attempts to enter specified video mode. + * + * In : ptr to mode structure, refresh rate + * Out : 0 if success + * + * Note: - + */ +static int vesa_entermode (vl_mode *p, int refresh) +{ + __dpmi_regs r; + + if (p->mode & 0x4000) { + VESA.blit = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual; + } else { + VESA.blit = vesa_b_dump_virtual; + { int n; for (vesa_gran_shift=0, n=p->gran; n; vesa_gran_shift++, n>>=1) ; } + vesa_gran_mask = (1<<(--vesa_gran_shift)) - 1; + if ((unsigned)p->gran != (vesa_gran_mask+1)) { + return !0; + } + } + + if (oldmode == -1) { + r.x.ax = 0x4f03; + __dpmi_int(0x10, &r); + oldmode = r.x.bx; + } + + r.x.ax = 0x4f02; + r.x.bx = p->mode; + + if (refresh && ((vesa_ver>>8) >= 3)) { + /* VESA 3.0 stuff for controlling the refresh rate */ + CRTCInfoBlock crtc; + unsigned long vclk; + double f0; + + _crtc_timing(&crtc, p->xres, p->yres, 0, 0); + + vclk = (double)crtc.HorizontalTotal * crtc.VerticalTotal * refresh; + vclk = _closest_pixclk(p->mode, vclk); + + if (vclk != 0) { + f0 = (double)vclk / (crtc.HorizontalTotal * crtc.VerticalTotal); + /*_current_refresh_rate = (int)(f0 + 0.5);*/ + + crtc.PixelClock = vclk; + crtc.RefreshRate = refresh * 100; + + movedata(_my_ds(), (unsigned)&crtc, _stubinfo->ds_selector, 0, sizeof(crtc)); + + r.x.di = 0; + r.x.es = _stubinfo->ds_segment; + r.x.bx |= 0x0800; + } + } + + __dpmi_int(0x10, &r); + if (r.x.ax != 0x004f) { + return !0; + } + + if (p->bpp == 8) { + r.x.ax = 0x4f08; + r.x.bx = 0x0800; + __dpmi_int(0x10, &r); + if (r.x.ax == 0x004f) { + r.x.ax = 0x4f08; + r.h.bl = 0x01; + __dpmi_int(0x10, &r); + vesa_color_precision = r.h.bh; + } + } + + return 0; +} + + + +/* Desc: Restores to the mode prior to first call to vesa_entermode. + * + * In : - + * Out : - + * + * Note: - + */ +static void vesa_restore (void) +{ + __dpmi_regs r; + + if (oldmode != -1) { + r.x.ax = 0x4f02; + r.x.bx = oldmode; + __dpmi_int(0x10, &r); + oldmode = -1; + } +} + + + +/* Desc: set one palette entry + * + * In : color index, R, G, B + * Out : - + * + * Note: uses integer values + */ +static void vesa_setCI_i (int index, int red, int green, int blue) +{ +#if 0 + __asm("\n\ + movw $0x1010, %%ax \n\ + movb %1, %%dh \n\ + movb %2, %%ch \n\ + int $0x10 \n\ + "::"b"(index), "m"(red), "m"(green), "c"(blue):"%eax", "%edx"); +#else + outportb(0x03C8, index); + outportb(0x03C9, red); + outportb(0x03C9, green); + outportb(0x03C9, blue); +#endif +} + + + +/* Desc: set one palette entry + * + * In : color index, R, G, B + * Out : - + * + * Note: uses normalized values + */ +static void vesa_setCI_f (int index, float red, float green, float blue) +{ + float max = (1 << vesa_color_precision) - 1; + + vesa_setCI_i(index, (int)(red * max), (int)(green * max), (int)(blue * max)); +} + + + +/* Desc: state retrieval + * + * In : parameter name, ptr to storage + * Out : 0 if request successfully processed + * + * Note: - + */ +static int vesa_get (int pname, int *params) +{ + switch (pname) { + case VL_GET_CI_PREC: + params[0] = vesa_color_precision; + break; + default: + return -1; + } + return 0; +} + + + +/* + * the driver + */ +vl_driver VESA = { + vesa_init, + vesa_entermode, + NULL, + vesa_setCI_f, + vesa_setCI_i, + vesa_get, + vesa_restore, + vesa_fini +}; diff --git a/reactos/lib/mesa32/src/drivers/dos/vesa.h b/reactos/lib/mesa32/src/drivers/dos/vesa.h new file mode 100644 index 00000000000..9287697c370 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/vesa.h @@ -0,0 +1,47 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#ifndef VESA_H_included +#define VESA_H_included + +#include "internal.h" + +extern void *vesa_swbank; + +extern void vesa_b_dump_virtual (void); +extern void vesa_l_dump_virtual (void); +extern void vesa_l_dump_virtual_mmx (void); + +extern vl_driver VESA; + +#endif diff --git a/reactos/lib/mesa32/src/drivers/dos/vga.c b/reactos/lib/mesa32/src/drivers/dos/vga.c new file mode 100644 index 00000000000..3a4bd9b6876 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/vga.c @@ -0,0 +1,236 @@ +/* + * Mesa 3-D graphics library + * Version: 4.1 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + */ + + +#include +#include + +#include "video.h" +#include "vga.h" + + + +static vl_mode modes[] = { + {0x13 | 0x4000, 320, 200, 320, 8, -1, 320*200}, + {0xffff, -1, -1, -1, -1, -1, -1} +}; + +static word16 vga_ver; +static int linear_selector; +static int oldmode = -1; + +#define vga_color_precision 6 + + + +/* Desc: Attempts to detect VGA, check video modes and create selectors. + * + * In : - + * Out : mode array + * + * Note: - + */ +static vl_mode *vga_init (void) +{ + int rv = 0; + + if (vga_ver) { + return modes; + } + + __asm("\n\ + movw $0x1a00, %%ax \n\ + int $0x10 \n\ + cmpb $0x1a, %%al \n\ + jne 0f \n\ + cmpb $0x07, %%bl \n\ + jb 0f \n\ + andl $0xff, %%ebx \n\ + movl %%ebx, %0 \n\ + 0:":"=g"(rv)::"%eax", "%ebx"); + if (rv == 0) { + return NULL; + } + + if (_create_selector(&linear_selector, 0xa0000, 0x10000)) { + return NULL; + } + + modes[0].sel = linear_selector; + + vga_ver = rv; + return modes; +} + + + +/* Desc: Frees all resources allocated by VGA init code. + * + * In : - + * Out : - + * + * Note: - + */ +static void vga_fini (void) +{ + if (vga_ver) { + _remove_selector(&linear_selector); + } +} + + + +/* Desc: Attempts to enter specified video mode. + * + * In : ptr to mode structure, refresh rate + * Out : 0 if success + * + * Note: - + */ +static int vga_entermode (vl_mode *p, int refresh) +{ + if (!(p->mode & 0x4000)) { + return -1; + } + VGA.blit = _can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual; + + if (oldmode == -1) { + __asm("\n\ + movb $0x0f, %%ah \n\ + int $0x10 \n\ + andl $0xff, %%eax \n\ + movl %%eax, %0 \n\ + ":"=g"(oldmode)::"%eax", "%ebx"); + } + + __asm("int $0x10"::"a"(p->mode&0xff)); + + return 0; + + (void)refresh; /* silence compiler warning */ +} + + + +/* Desc: Restores to the mode prior to first call to vga_entermode. + * + * In : - + * Out : - + * + * Note: - + */ +static void vga_restore (void) +{ + if (oldmode != -1) { + __asm("int $0x10"::"a"(oldmode)); + oldmode = -1; + } +} + + + +/* Desc: set one palette entry + * + * In : color index, R, G, B + * Out : - + * + * Note: uses integer values + */ +static void vga_setCI_i (int index, int red, int green, int blue) +{ +#if 0 + __asm("\n\ + movw $0x1010, %%ax \n\ + movb %1, %%dh \n\ + movb %2, %%ch \n\ + int $0x10 \n\ + "::"b"(index), "m"(red), "m"(green), "c"(blue):"%eax", "%edx"); +#else + outportb(0x03C8, index); + outportb(0x03C9, red); + outportb(0x03C9, green); + outportb(0x03C9, blue); +#endif +} + + + +/* Desc: set one palette entry + * + * In : color index, R, G, B + * Out : - + * + * Note: uses normalized values + */ +static void vga_setCI_f (int index, float red, float green, float blue) +{ + float max = (1 << vga_color_precision) - 1; + + vga_setCI_i(index, (int)(red * max), (int)(green * max), (int)(blue * max)); +} + + + +/* Desc: state retrieval + * + * In : parameter name, ptr to storage + * Out : 0 if request successfully processed + * + * Note: - + */ +static int vga_get (int pname, int *params) +{ + switch (pname) { + case VL_GET_CI_PREC: + params[0] = vga_color_precision; + break; + default: + return -1; + } + return 0; +} + + + +/* + * the driver + */ +vl_driver VGA = { + vga_init, + vga_entermode, + NULL, + vga_setCI_f, + vga_setCI_i, + vga_get, + vga_restore, + vga_fini +}; diff --git a/reactos/lib/mesa32/src/drivers/dos/vga.h b/reactos/lib/mesa32/src/drivers/dos/vga.h new file mode 100644 index 00000000000..aeb8faddaed --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/vga.h @@ -0,0 +1,42 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#ifndef VGA_H_included +#define VGA_H_included + +#include "internal.h" +#include "vesa.h" + +extern vl_driver VGA; + +#endif diff --git a/reactos/lib/mesa32/src/drivers/dos/video.c b/reactos/lib/mesa32/src/drivers/dos/video.c new file mode 100644 index 00000000000..41903ebe799 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/video.c @@ -0,0 +1,651 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + * + * Thanks to CrazyPyro (Neil Funk) for FakeColor + */ + + +#include + +#include "internal.h" +#include "vesa.h" +#include "vga.h" +#include "video.h" + + + +static vl_driver *drv; +/* based upon mode specific data: valid entire session */ +int vl_video_selector; +static vl_mode *video_mode; +static int video_scanlen, video_bypp; +/* valid until next buffer */ +void *vl_current_draw_buffer, *vl_current_read_buffer; +int vl_current_stride, vl_current_width, vl_current_height, vl_current_bytes; +int vl_current_offset, vl_current_delta; + + + +#if HUGE_LOOKUP +/* These lookup tables are used to extract RGB values in [0,255] + * from 15/16-bit pixel values. + */ +static unsigned char pix15r[0x8000]; +static unsigned char pix15g[0x8000]; +static unsigned char pix15b[0x8000]; +static unsigned char pix16r[0x10000]; +static unsigned char pix16g[0x10000]; +static unsigned char pix16b[0x10000]; +#else +/* lookup table for scaling 5 bit colors up to 8 bits */ +static int _rgb_scale_5[32] = { + 0, 8, 16, 25, 33, 41, 49, 58, + 66, 74, 82, 90, 99, 107, 115, 123, + 132, 140, 148, 156, 165, 173, 181, 189, + 197, 206, 214, 222, 230, 239, 247, 255 +}; +#endif + +/* lookup table for scaling 6 bit colors up to 8 bits */ +static int _rgb_scale_6[64] = { + 0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 45, 49, 53, 57, 61, + 65, 69, 73, 77, 81, 85, 89, 93, + 97, 101, 105, 109, 113, 117, 121, 125, + 130, 134, 138, 142, 146, 150, 154, 158, + 162, 166, 170, 174, 178, 182, 186, 190, + 194, 198, 202, 206, 210, 215, 219, 223, + 227, 231, 235, 239, 243, 247, 251, 255 +}; + +/* FakeColor data */ +#define R_CNT 6 +#define G_CNT 6 +#define B_CNT 6 + +#define R_BIAS 7 +#define G_BIAS 7 +#define B_BIAS 7 + +static word32 VGAPalette[256]; +static word8 array_r[256]; +static word8 array_g[256]; +static word8 array_b[256]; + + + +int (*vl_mixfix) (fixed r, fixed g, fixed b); +int (*vl_mixrgb) (const unsigned char rgb[]); +int (*vl_mixrgba) (const unsigned char rgba[]); +void (*vl_getrgba) (unsigned int offset, unsigned char rgba[4]); +int (*vl_getpixel) (unsigned int offset); +void (*vl_clear) (int color); +void (*vl_rect) (int x, int y, int width, int height, int color); +void (*vl_flip) (void); +void (*vl_putpixel) (unsigned int offset, int color); + + + +/* Desc: color composition (w/o ALPHA) + * + * In : R, G, B + * Out : color + * + * Note: - + */ +static int vl_mixfix8fake (fixed r, fixed g, fixed b) +{ + return array_b[b>>FIXED_SHIFT]*G_CNT*R_CNT + + array_g[g>>FIXED_SHIFT]*R_CNT + + array_r[r>>FIXED_SHIFT]; +} +#define vl_mixfix8 vl_mixfix8fake +static int vl_mixfix15 (fixed r, fixed g, fixed b) +{ + return ((r>>(3+FIXED_SHIFT))<<10) + |((g>>(3+FIXED_SHIFT))<<5) + |(b>>(3+FIXED_SHIFT)); +} +static int vl_mixfix16 (fixed r, fixed g, fixed b) +{ + return ((r>>(3+FIXED_SHIFT))<<11) + |((g>>(2+FIXED_SHIFT))<<5) + |(b>>(3+FIXED_SHIFT)); +} +#define vl_mixfix24 vl_mixfix32 +static int vl_mixfix32 (fixed r, fixed g, fixed b) +{ + return ((r>>FIXED_SHIFT)<<16) + |((g>>FIXED_SHIFT)<<8) + |(b>>FIXED_SHIFT); +} + + + +/* Desc: color composition (w/ ALPHA) + * + * In : array of integers (R, G, B, A) + * Out : color + * + * Note: - + */ +#define vl_mixrgba8 vl_mixrgb8fake +#define vl_mixrgba15 vl_mixrgb15 +#define vl_mixrgba16 vl_mixrgb16 +#define vl_mixrgba24 vl_mixrgb24 +static int vl_mixrgba32 (const unsigned char rgba[]) +{ + /* Hack alert: + * currently, DMesa uses Mesa's alpha buffer; + * so we don't really care about alpha value here... + */ + return /*(rgba[3]<<24)|*/(rgba[0]<<16)|(rgba[1]<<8)|(rgba[2]); +} + + + +/* Desc: color composition (w/o ALPHA) + * + * In : array of integers (R, G, B) + * Out : color + * + * Note: - + */ +static int vl_mixrgb8fake (const unsigned char rgb[]) +{ + return array_b[rgb[2]]*G_CNT*R_CNT + + array_g[rgb[1]]*R_CNT + + array_r[rgb[0]]; +} +#define vl_mixrgb8 vl_mixrgb8fake +static int vl_mixrgb15 (const unsigned char rgb[]) +{ + return ((rgb[0]>>3)<<10)|((rgb[1]>>3)<<5)|(rgb[2]>>3); +} +static int vl_mixrgb16 (const unsigned char rgb[]) +{ + return ((rgb[0]>>3)<<11)|((rgb[1]>>2)<<5)|(rgb[2]>>3); +} +#define vl_mixrgb24 vl_mixrgb32 +static int vl_mixrgb32 (const unsigned char rgb[]) +{ + return (rgb[0]<<16)|(rgb[1]<<8)|(rgb[2]); +} + + + +/* Desc: color decomposition + * + * In : pixel offset, array of integers to hold color components (R, G, B, A) + * Out : - + * + * Note: uses current read buffer + */ +static void v_getrgba8fake6 (unsigned int offset, unsigned char rgba[4]) +{ + word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]]; + rgba[0] = _rgb_scale_6[(c >> 16) & 0x3F]; + rgba[1] = _rgb_scale_6[(c >> 8) & 0x3F]; + rgba[2] = _rgb_scale_6[c & 0x3F]; + /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */ +} +static void v_getrgba8fake8 (unsigned int offset, unsigned char rgba[4]) +{ + word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]]; + rgba[0] = c >> 16; + rgba[1] = c >> 8; + rgba[2] = c; + /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */ +} +#define v_getrgba8 v_getrgba8fake6 +static void v_getrgba15 (unsigned int offset, unsigned char rgba[4]) +{ + word32 c = ((word16 *)vl_current_read_buffer)[offset]; +#if HUGE_LOOKUP + c &= 0x7fff; + rgba[0] = pix15r[c]; + rgba[1] = pix15g[c]; + rgba[2] = pix15b[c]; +#else + rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F]; + rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F]; + rgba[2] = _rgb_scale_5[c & 0x1F]; +#endif + /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */ +} +static void v_getrgba16 (unsigned int offset, unsigned char rgba[4]) +{ + word32 c = ((word16 *)vl_current_read_buffer)[offset]; +#if HUGE_LOOKUP + rgba[0] = pix16r[c]; + rgba[1] = pix16g[c]; + rgba[2] = pix16b[c]; +#else + rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F]; + rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F]; + rgba[2] = _rgb_scale_5[c & 0x1F]; +#endif + /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */ +} +static void v_getrgba24 (unsigned int offset, unsigned char rgba[4]) +{ + word32 c = *(word32 *)((long)vl_current_read_buffer+offset*3); + rgba[0] = c >> 16; + rgba[1] = c >> 8; + rgba[2] = c; + /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */ +} +static void v_getrgba32 (unsigned int offset, unsigned char rgba[4]) +{ + word32 c = ((word32 *)vl_current_read_buffer)[offset]; + rgba[0] = c >> 16; + rgba[1] = c >> 8; + rgba[2] = c; + /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */ +} + + + +/* Desc: pixel retrieval + * + * In : pixel offset + * Out : pixel value + * + * Note: uses current read buffer + */ +static int v_getpixel8 (unsigned int offset) +{ + return ((word8 *)vl_current_read_buffer)[offset]; +} +#define v_getpixel15 v_getpixel16 +static int v_getpixel16 (unsigned int offset) +{ + return ((word16 *)vl_current_read_buffer)[offset]; +} +static int v_getpixel24 (unsigned int offset) +{ + return *(word32 *)((long)vl_current_read_buffer+offset*3); +} +static int v_getpixel32 (unsigned int offset) +{ + return ((word32 *)vl_current_read_buffer)[offset]; +} + + + +/* Desc: set one palette entry + * + * In : index, R, G, B + * Out : - + * + * Note: color components are in range [0.0 .. 1.0] + */ +void vl_setCI (int index, float red, float green, float blue) +{ + drv->setCI_f(index, red, green, blue); +} + + + +/* Desc: set one palette entry + * + * In : color, R, G, B + * Out : - + * + * Note: - + */ +static void fake_setcolor (int c, int r, int g, int b) +{ + VGAPalette[c] = 0xff000000 | (r<<16) | (g<<8) | b; + + drv->setCI_i(c, r, g, b); +} + + + +/* Desc: build FakeColor palette + * + * In : CI precision in bits + * Out : - + * + * Note: - + */ +static void fake_buildpalette (int bits) +{ + double c_r, c_g, c_b; + int r, g, b, color = 0; + + double max = (1 << bits) - 1; + + for (b=0; b> 8; + g = (pixel & 0x03E0) >> 3; + b = (pixel & 0x001F) << 2; + + r = (unsigned int)(((double)r * 255. / 0x7c) + 0.5); + g = (unsigned int)(((double)g * 255. / 0x7c) + 0.5); + b = (unsigned int)(((double)b * 255. / 0x7c) + 0.5); + + pix15r[pixel] = r; + pix15g[pixel] = g; + pix15b[pixel] = b; + } + + /* 16bit */ + r = (pixel & 0xF800) >> 8; + g = (pixel & 0x07E0) >> 3; + b = (pixel & 0x001F) << 3; + + r = (unsigned int)(((double)r * 255. / 0xF8) + 0.5); + g = (unsigned int)(((double)g * 255. / 0xFC) + 0.5); + b = (unsigned int)(((double)b * 255. / 0xF8) + 0.5); + + pix16r[pixel] = r; + pix16g[pixel] = g; + pix16b[pixel] = b; + } +} +#endif + + + +/* Desc: initialize hardware + * + * In : - + * Out : list of available modes + * + * Note: when returning non-NULL, global variable `drv' is guaranteed to be ok + */ +static vl_mode *v_init_hw (void) +{ + static vl_mode *q = NULL; + + if (q == NULL) { + /* initialize hardware */ + if ((q = VESA.init()) != NULL) { + drv = &VESA; + } else if ((q = VGA.init()) != NULL) { + drv = &VGA; + } else { + drv = NULL; + } + } + + return q; +} + + + +/* Desc: sync buffer with video hardware + * + * In : ptr to old buffer, position, size + * Out : 0 if success + * + * Note: - + */ +int vl_sync_buffer (void **buffer, int x, int y, int width, int height) +{ + if ((width & 7) || (x < 0) || (y < 0) || (x+width > video_mode->xres) || (y+height > video_mode->yres)) { + return -1; + } else { + void *newbuf = *buffer; + + if ((newbuf == NULL) || (vl_current_width != width) || (vl_current_height != height)) { + newbuf = realloc(newbuf, width * height * video_bypp); + } + + if (newbuf == NULL) { + return -2; + } + + vl_current_width = width; + vl_current_height = height; + vl_current_stride = vl_current_width * video_bypp; + vl_current_bytes = vl_current_stride * height; + + vl_current_offset = video_scanlen * y + video_bypp * x; + vl_current_delta = video_scanlen - vl_current_stride; + + vl_current_draw_buffer = vl_current_read_buffer = *buffer = newbuf; + return 0; + } +} + + + +/* Desc: state retrieval + * + * In : name, storage + * Out : -1 for an error + * + * Note: - + */ +int vl_get (int pname, int *params) +{ + switch (pname) { + case VL_GET_SCREEN_SIZE: + params[0] = video_mode->xres; + params[1] = video_mode->yres; + break; + case VL_GET_VIDEO_MODES: + { + int n; + vl_mode *q; + if ((q = v_init_hw()) == NULL) { + return -1; + } + /* count available visuals */ + for (n = 0; q->mode != 0xffff; q++) { + if ((q + 1)->mode == (q->mode | 0x4000)) { + /* same mode, but linear */ + q++; + } + if (params) { + params[n] = (int)q; + } + n++; + } + return n; + } + default: + return (drv != NULL) ? drv->get(pname, params) : -1; + } + return 0; +} + + + +/* Desc: setup mode + * + * In : ptr to mode definition + * Out : 0 if success + * + * Note: - + */ +static int vl_setup_mode (vl_mode *p) +{ + if (p == NULL) { + return -1; + } + +#define INITPTR(bpp) \ + vl_putpixel = v_putpixel##bpp; \ + vl_getrgba = v_getrgba##bpp; \ + vl_getpixel = v_getpixel##bpp; \ + vl_rect = v_rect##bpp; \ + vl_mixfix = vl_mixfix##bpp; \ + vl_mixrgb = vl_mixrgb##bpp; \ + vl_mixrgba = vl_mixrgba##bpp; \ + vl_clear = _can_mmx() ? v_clear##bpp##_mmx : v_clear##bpp + + switch (p->bpp) { + case 8: + INITPTR(8); + break; + case 15: + INITPTR(15); + break; + case 16: + INITPTR(16); + break; + case 24: + INITPTR(24); + break; + case 32: + INITPTR(32); + break; + default: + return -1; + } + +#undef INITPTR + + video_mode = p; + video_bypp = (p->bpp+7)/8; + video_scanlen = p->scanlen; + vl_video_selector = p->sel; + + return 0; +} + + + +/* Desc: restore to the mode prior to first call to `vl_video_init'. + * + * In : - + * Out : - + * + * Note: - + */ +void vl_video_exit (void) +{ + drv->restore(); + drv->fini(); + video_mode = NULL; +} + + + +/* Desc: enter mode + * + * In : xres, yres, bits/pixel, RGB, refresh rate + * Out : pixel width in bits if success + * + * Note: - + */ +int vl_video_init (int width, int height, int bpp, int rgb, int refresh) +{ + int fake; + vl_mode *p, *q; + unsigned int min; + + fake = 0; + if (!rgb) { + bpp = 8; + } else if (bpp == 8) { + fake = 1; + } +#if HUGE_LOOKUP + else if (bpp < 24) { + v_init_pixeltables(); + } +#endif + + /* initialize hardware */ + if ((q = v_init_hw()) == NULL) { + return 0; + } + + /* search for a mode that fits our request */ + for (min=-1, p=NULL; q->mode!=0xffff; q++) { + if ((q->xres>=width) && (q->yres>=height) && (q->bpp==bpp)) { + if (min>=(unsigned)(q->xres*q->yres)) { + min = q->xres*q->yres; + p = q; + } + } + } + + /* setup and enter mode */ + if ((vl_setup_mode(p) == 0) && (drv->entermode(p, refresh) == 0)) { + vl_flip = drv->blit; + if (fake) { + drv->get(VL_GET_CI_PREC, (int *)(&min)); + fake_buildpalette(min); + if (min == 8) { + vl_getrgba = v_getrgba8fake8; + } + } + return bpp; + } + + /* abort */ + return 0; +} diff --git a/reactos/lib/mesa32/src/drivers/dos/video.h b/reactos/lib/mesa32/src/drivers/dos/video.h new file mode 100644 index 00000000000..e928f19c373 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/video.h @@ -0,0 +1,65 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.5 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@users.sourceforge.net + * Web : http://www.geocities.com/dborca + */ + + +#ifndef VIDEO_H_included +#define VIDEO_H_included + +typedef int fixed; + +#define VL_GET_CARD_NAME 0x0100 +#define VL_GET_VRAM 0x0101 +#define VL_GET_CI_PREC 0x0200 +#define VL_GET_HPIXELS 0x0201 +#define VL_GET_SCREEN_SIZE 0x0202 +#define VL_GET_VIDEO_MODES 0x0300 + +extern int (*vl_mixfix) (fixed r, fixed g, fixed b); +extern int (*vl_mixrgb) (const unsigned char rgb[]); +extern int (*vl_mixrgba) (const unsigned char rgba[]); +extern void (*vl_getrgba) (unsigned int offset, unsigned char rgba[4]); + +extern void (*vl_clear) (int color); +extern void (*vl_rect) (int x, int y, int width, int height, int color); +extern void (*vl_flip) (void); +extern void (*vl_putpixel) (unsigned int offset, int color); +extern int (*vl_getpixel) (unsigned int offset); + +void vl_setCI (int index, float red, float green, float blue); + +int vl_sync_buffer (void **buffer, int x, int y, int width, int height); +int vl_get (int pname, int *params); + +void vl_video_exit (void); +int vl_video_init (int width, int height, int bpp, int rgb, int refresh); + +#endif diff --git a/reactos/lib/mesa32/src/drivers/dos/virtual.S b/reactos/lib/mesa32/src/drivers/dos/virtual.S new file mode 100644 index 00000000000..677f07a6263 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dos/virtual.S @@ -0,0 +1,495 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * DOS/DJGPP device driver v1.4 for Mesa + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include "x86/assyntax.h" + + + FILE("virtual.S") + +/* + * extern void *vl_current_draw_buffer; + * extern int vl_current_width, vl_current_bytes; + */ +EXTERN _vl_current_draw_buffer +EXTERN _vl_current_width, _vl_current_bytes + + SEG_TEXT + USE32 + +/* Desc: void v_clear8 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear8 +_v_clear8: + MOV_L (REGOFF(4, ESP), EAX) + MOV_B (AL, AH) + PUSH_W (AX) + PUSH_W (AX) + POP_L (EAX) + jmp _v_clear_common + +/* Desc: void v_clear16 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear16 +_v_clear16: + MOV_L (REGOFF(4, ESP), EAX) + PUSH_W (AX) + PUSH_W (AX) + POP_L (EAX) + jmp _v_clear_common + +/* Desc: void v_clear32 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear32 +_v_clear32: + MOV_L (REGOFF(4, ESP), EAX) + ALIGNTEXT4 +_v_clear_common: + MOV_L (CONTENT(_vl_current_bytes), ECX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(2), ECX) + ALIGNTEXT4 + TLBL(0): + MOV_L (EAX, REGIND(EDX)) + ADD_L (CONST(4), EDX) + DEC_L (ECX) + jnz TLBL(0) + RET + +/* Desc: void v_clear8_mmx (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear8_mmx +_v_clear8_mmx: +#ifdef USE_MMX_ASM + MOVD (REGOFF(4, ESP), MM0) + PUNPCKLBW (MM0, MM0) + PUNPCKLWD (MM0, MM0) + jmp _v_clear_common_mmx +#endif + +/* Desc: void v_clear16_mmx (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear16_mmx +_v_clear16_mmx: +#ifdef USE_MMX_ASM + MOVD (REGOFF(4, ESP), MM0) + PUNPCKLWD (MM0, MM0) + jmp _v_clear_common_mmx +#endif + +/* Desc: void v_clear32_mmx (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear32_mmx +_v_clear32_mmx: +#ifdef USE_MMX_ASM + MOVD (REGOFF(4, ESP), MM0) + ALIGNTEXT4 +_v_clear_common_mmx: + PUNPCKLDQ (MM0, MM0) + MOV_L (CONTENT(_vl_current_bytes), ECX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(3), ECX) + ALIGNTEXT4 + TLBL(0): + MOVQ (MM0, REGIND(EDX)) + ADD_L (CONST(8), EDX) + DEC_L (ECX) + jnz TLBL(0) + EMMS +#endif + RET + +/* Desc: void v_clear24 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear24 +_v_clear24: + MOV_L (CONST(0xaaaaaaab), EAX) + MUL_L (CONTENT(_vl_current_bytes)) + MOV_L (REGOFF(4, ESP), EAX) + MOV_L (EDX, ECX) + PUSH_L (EBX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(1), ECX) + MOV_B (REGOFF(10,ESP), BL) + ALIGNTEXT4 + TLBL(0): + MOV_W (AX, REGIND(EDX)) + MOV_B (BL, REGOFF(2,EDX)) + ADD_L (CONST(3), EDX) + DEC_L (ECX) + jnz TLBL(0) + POP_L (EBX) + RET + +/* Desc: void v_clear24_mmx (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_clear24_mmx +_v_clear24_mmx: +#ifdef USE_MMX_ASM + MOV_L (REGOFF(4, ESP), EAX) + MOV_L (EAX, EDX) + MOV_L (EAX, ECX) + SHL_L (CONST(16), EDX) + ROR_L (CONST(8), ECX) + MOV_W (CX, DX) + ROR_L (CONST(16), ECX) + MOV_B (DH, CL) + SHL_L (CONST(8), EAX) + MOV_B (CH, AL) + ROR_L (CONST(8), EAX) + + PUSH_L (EDX) + PUSH_L (EAX) + MOVQ (REGIND(ESP), MM0) + PUSH_L (ECX) + MOVQ (REGIND(ESP), MM1) + PUSH_L (EDX) + MOVQ (REGIND(ESP), MM2) + + MOV_L (CONST(0xaaaaaaab), EAX) + MUL_L (CONTENT(_vl_current_bytes)) + MOV_L (EDX, ECX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(4), ECX) + ALIGNTEXT4 + TLBL(0): + MOVQ (MM0, REGIND(EDX)) + MOVQ (MM1, REGOFF(8,EDX)) + MOVQ (MM2, REGOFF(16,EDX)) + ADD_L (CONST(24), EDX) + DEC_L (ECX) + jnz TLBL(0) + EMMS + ADD_L (CONST(16), ESP) +#endif + RET + +/* Desc: void v_rect8 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_rect8 +_v_rect8: + CLD + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (REGOFF(28, ESP), EAX) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_B (AL, AH) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + PUSH_W (AX) + PUSH_W (AX) + PUSH_SR (DS) + POP_SR (ES) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + POP_L (EAX) + PUSH_L (EBX) + MOV_L (ECX, EBX) + AND_L (CONST(3), EBX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + SHR_L (CONST(2), ECX) + REP STOS_L + TEST_L (EBX, EBX) + jz TLBL(2) + MOV_L (EBX, ECX) + REP STOS_B + ALIGNTEXT4 + TLBL(2): + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EBX) + POP_L (EDI) + POP_L (ESI) + RET + +/* Desc: void v_rect16 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_rect16 +_v_rect16: + CLD + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (REGOFF(28, ESP), EAX) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + PUSH_W (AX) + SHL_L (CONST(1), ESI) + PUSH_W (AX) + SHL_L (CONST(1), EDI) + PUSH_SR (DS) + POP_SR (ES) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + POP_L (EAX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + SHR_L (CONST(1), ECX) + REP STOS_L + jnc TLBL(2) + STOS_W + ALIGNTEXT4 + TLBL(2): + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + RET + +/* Desc: void v_rect24 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_rect24 +_v_rect24: + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (REGOFF(28, ESP), EAX) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + LEA_L (REGBIS(ESI, ESI, 2), ESI) + PUSH_L (EBX) + LEA_L (REGBIS(EDI, EDI, 2), EDI) + MOV_L (EAX, EBX) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + SHR_L (CONST(16), EBX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + MOV_W (AX, REGIND(EDI)) + MOV_B (BL, REGOFF(2,EDI)) + ADD_L (CONST(3), EDI) + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EBX) + POP_L (EDI) + POP_L (ESI) + RET + +/* Desc: void v_rect32 (int color); + * + * In : color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_rect32 +_v_rect32: + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + SHL_L (CONST(2), ESI) + SHL_L (CONST(2), EDI) + MOV_L (REGOFF(28, ESP), EAX) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + MOV_L (EAX, REGIND(EDI)) + ADD_L (CONST(4), EDI) + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + RET + +/* Desc: void v_putpixel8 (unsigned int offset, int color); + * + * In : offset within buffer, color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_putpixel8 +_v_putpixel8: + MOV_L (REGOFF(8, ESP), ECX) + MOV_L (REGOFF(4, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), EAX) + MOV_B (CL, REGBI(EAX,EDX)) + RET + +/* Desc: void v_putpixel16 (unsigned int offset, int color); + * + * In : offset within buffer, color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_putpixel16 +_v_putpixel16: + MOV_L (REGOFF(8, ESP), ECX) + MOV_L (REGOFF(4, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), EAX) + MOV_W (CX, REGBIS(EAX,EDX,2)) + RET + +/* Desc: void v_putpixel24 (unsigned int offset, int color); + * + * In : offset within buffer, color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_putpixel24 +_v_putpixel24: + MOV_L (REGOFF(4, ESP), EAX) + MOV_L (REGOFF(8, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), ECX) + LEA_L (REGBIS(EAX,EAX,2), EAX) + MOV_W (DX, REGBI(ECX,EAX)) + SHR_L (CONST(16), EDX) + MOV_B (DL, REGBID(ECX,EAX,2)) + RET + +/* Desc: void v_putpixel32 (unsigned int offset, int color); + * + * In : offset within buffer, color + * Out : - + * + * Note: uses current draw buffer + */ + ALIGNTEXT32 + GLOBL _v_putpixel32 +_v_putpixel32: + MOV_L (REGOFF(8, ESP), ECX) + MOV_L (REGOFF(4, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), EAX) + MOV_L (ECX, REGBIS(EAX,EDX,4)) + RET diff --git a/reactos/lib/mesa32/src/drivers/dri/common/depthtmp.h b/reactos/lib/mesa32/src/drivers/dri/common/depthtmp.h new file mode 100644 index 00000000000..f3da61e5199 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/depthtmp.h @@ -0,0 +1,176 @@ +/* $XFree86: xc/lib/GL/mesa/src/drv/common/depthtmp.h,v 1.5 2001/03/21 16:14:20 dawes Exp $ */ + +#ifndef DBG +#define DBG 0 +#endif + + +#ifndef HAVE_HW_DEPTH_SPANS +#define HAVE_HW_DEPTH_SPANS 0 +#endif +#ifndef HAVE_HW_DEPTH_PIXELS +#define HAVE_HW_DEPTH_PIXELS 0 +#endif + +#ifndef HW_READ_LOCK +#define HW_READ_LOCK() HW_LOCK() +#endif +#ifndef HW_READ_UNLOCK +#define HW_READ_UNLOCK() HW_UNLOCK() +#endif + +static void TAG(WriteDepthSpan)( GLcontext *ctx, + GLuint n, GLint x, GLint y, + const GLdepth *depth, + const GLubyte mask[] ) +{ + HW_WRITE_LOCK() + { + GLint x1; + GLint n1; + LOCAL_DEPTH_VARS; + + y = Y_FLIP( y ); + +#if HAVE_HW_DEPTH_SPANS + (void) x1; (void) n1; + + if ( DBG ) fprintf( stderr, "WriteDepthSpan 0..%d (x1 %d)\n", + (int)n, (int)x ); + + WRITE_DEPTH_SPAN(); +#else + HW_CLIPLOOP() + { + GLint i = 0; + CLIPSPAN( x, y, n, x1, n1, i ); + + if ( DBG ) fprintf( stderr, "WriteDepthSpan %d..%d (x1 %d)\n", + (int)i, (int)n1, (int)x1 ); + + if ( mask ) { + for ( ; i < n1 ; i++, x1++ ) { + if ( mask[i] ) WRITE_DEPTH( x1, y, depth[i] ); + } + } else { + for ( ; i < n1 ; i++, x1++ ) { + WRITE_DEPTH( x1, y, depth[i] ); + } + } + } + HW_ENDCLIPLOOP(); +#endif + } + HW_WRITE_UNLOCK(); +} + +static void TAG(WriteDepthPixels)( GLcontext *ctx, + GLuint n, + const GLint x[], + const GLint y[], + const GLdepth depth[], + const GLubyte mask[] ) +{ + HW_WRITE_LOCK() + { + GLint i; + LOCAL_DEPTH_VARS; + + if ( DBG ) fprintf( stderr, "WriteDepthPixels\n" ); + +#if HAVE_HW_DEPTH_PIXELS + (void) i; + + WRITE_DEPTH_PIXELS(); +#else + HW_CLIPLOOP() + { + for ( i = 0 ; i < n ; i++ ) { + if ( mask[i] ) { + const int fy = Y_FLIP( y[i] ); + if ( CLIPPIXEL( x[i], fy ) ) + WRITE_DEPTH( x[i], fy, depth[i] ); + } + } + } + HW_ENDCLIPLOOP(); +#endif + } + HW_WRITE_UNLOCK(); +} + + +/* Read depth spans and pixels + */ +static void TAG(ReadDepthSpan)( GLcontext *ctx, + GLuint n, GLint x, GLint y, + GLdepth depth[] ) +{ + HW_READ_LOCK() + { + GLint x1, n1; + LOCAL_DEPTH_VARS; + + y = Y_FLIP( y ); + + if ( DBG ) fprintf( stderr, "ReadDepthSpan\n" ); + +#if HAVE_HW_DEPTH_SPANS + (void) x1; (void) n1; + + READ_DEPTH_SPAN(); +#else + HW_CLIPLOOP() + { + GLint i = 0; + CLIPSPAN( x, y, n, x1, n1, i ); + for ( ; i < n1 ; i++ ) + READ_DEPTH( depth[i], (x1+i), y ); + } + HW_ENDCLIPLOOP(); +#endif + } + HW_READ_UNLOCK(); +} + +static void TAG(ReadDepthPixels)( GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + GLdepth depth[] ) +{ + HW_READ_LOCK() + { + GLint i; + LOCAL_DEPTH_VARS; + + if ( DBG ) fprintf( stderr, "ReadDepthPixels\n" ); + +#if HAVE_HW_DEPTH_PIXELS + (void) i; + + READ_DEPTH_PIXELS(); +#else + HW_CLIPLOOP() + { + for ( i = 0 ; i < n ;i++ ) { + int fy = Y_FLIP( y[i] ); + if ( CLIPPIXEL( x[i], fy ) ) + READ_DEPTH( depth[i], x[i], fy ); + } + } + HW_ENDCLIPLOOP(); +#endif + } + HW_READ_UNLOCK(); +} + + +#if HAVE_HW_DEPTH_SPANS +#undef WRITE_DEPTH_SPAN +#undef WRITE_DEPTH_PIXELS +#undef READ_DEPTH_SPAN +#undef READ_DEPTH_PIXELS +#else +#undef WRITE_DEPTH +#undef READ_DEPTH +#endif +#undef TAG diff --git a/reactos/lib/mesa32/src/drivers/dri/common/mm.c b/reactos/lib/mesa32/src/drivers/dri/common/mm.c new file mode 100644 index 00000000000..6572ccd9914 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/mm.c @@ -0,0 +1,196 @@ +/* + * GLX Hardware Device Driver common code + * Copyright (C) 1999 Wittawat Yamwong + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +/* $XFree86: xc/lib/GL/mesa/src/drv/common/mm.c,v 1.4 2002/10/30 12:51:27 alanh Exp $ */ + +#include +#include + +#include "mm.h" + + +void mmDumpMemInfo( memHeap_t *heap ) +{ + TMemBlock *p; + + fprintf(stderr, "Memory heap %p:\n", (void *)heap); + if (heap == 0) { + fprintf(stderr, " heap == 0\n"); + } else { + p = (TMemBlock *)heap; + while (p) { + fprintf(stderr, " Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size, + p->free ? '.':'U', + p->reserved ? 'R':'.'); + p = p->next; + } + } + fprintf(stderr, "End of memory blocks\n"); +} + +memHeap_t *mmInit(int ofs, + int size) +{ + PMemBlock blocks; + + if (size <= 0) { + return 0; + } + blocks = (TMemBlock *) calloc(1,sizeof(TMemBlock)); + if (blocks) { + blocks->ofs = ofs; + blocks->size = size; + blocks->free = 1; + return (memHeap_t *)blocks; + } else + return 0; +} + + +static TMemBlock* SliceBlock(TMemBlock *p, + int startofs, int size, + int reserved, int alignment) +{ + TMemBlock *newblock; + + /* break left */ + if (startofs > p->ofs) { + newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock)); + if (!newblock) + return NULL; + newblock->ofs = startofs; + newblock->size = p->size - (startofs - p->ofs); + newblock->free = 1; + newblock->next = p->next; + p->size -= newblock->size; + p->next = newblock; + p = newblock; + } + + /* break right */ + if (size < p->size) { + newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock)); + if (!newblock) + return NULL; + newblock->ofs = startofs + size; + newblock->size = p->size - size; + newblock->free = 1; + newblock->next = p->next; + p->size = size; + p->next = newblock; + } + + /* p = middle block */ + p->align = alignment; + p->free = 0; + p->reserved = reserved; + return p; +} + +PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch) +{ + int mask,startofs,endofs; + TMemBlock *p; + + if (!heap || align2 < 0 || size <= 0) + return NULL; + mask = (1 << align2)-1; + startofs = 0; + p = (TMemBlock *)heap; + while (p) { + if ((p)->free) { + startofs = (p->ofs + mask) & ~mask; + if ( startofs < startSearch ) { + startofs = startSearch; + } + endofs = startofs+size; + if (endofs <= (p->ofs+p->size)) + break; + } + p = p->next; + } + if (!p) + return NULL; + p = SliceBlock(p,startofs,size,0,mask+1); + p->heap = heap; + return p; +} + +static __inline__ int Join2Blocks(TMemBlock *p) +{ + if (p->free && p->next && p->next->free) { + TMemBlock *q = p->next; + p->size += q->size; + p->next = q->next; + free(q); + return 1; + } + return 0; +} + +int mmFreeMem(PMemBlock b) +{ + TMemBlock *p,*prev; + + if (!b) + return 0; + if (!b->heap) { + fprintf(stderr, "no heap\n"); + return -1; + } + p = b->heap; + prev = NULL; + while (p && p != b) { + prev = p; + p = p->next; + } + if (!p || p->free || p->reserved) { + if (!p) + fprintf(stderr, "block not found in heap\n"); + else if (p->free) + fprintf(stderr, "block already free\n"); + else + fprintf(stderr, "block is reserved\n"); + return -1; + } + p->free = 1; + Join2Blocks(p); + if (prev) + Join2Blocks(prev); + return 0; +} + + +void mmDestroy(memHeap_t *heap) +{ + TMemBlock *p,*q; + + if (!heap) + return; + p = (TMemBlock *)heap; + while (p) { + q = p->next; + free(p); + p = q; + } +} diff --git a/reactos/lib/mesa32/src/drivers/dri/common/mm.h b/reactos/lib/mesa32/src/drivers/dri/common/mm.h new file mode 100644 index 00000000000..d52871d39f3 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/mm.h @@ -0,0 +1,82 @@ +/* + * GLX Hardware Device Driver common code + * Copyright (C) 1999 Keith Whitwell + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef MM_INC +#define MM_INC + +struct mem_block_t { + struct mem_block_t *next; + struct mem_block_t *heap; + int ofs,size; + int align; + int free:1; + int reserved:1; +}; +typedef struct mem_block_t TMemBlock; +typedef struct mem_block_t *PMemBlock; + +/* a heap is just the first block in a chain */ +typedef struct mem_block_t memHeap_t; + +static __inline__ int mmBlockSize(PMemBlock b) +{ return b->size; } + +static __inline__ int mmOffset(PMemBlock b) +{ return b->ofs; } + +/* + * input: total size in bytes + * return: a heap pointer if OK, NULL if error + */ +memHeap_t *mmInit( int ofs, int size ); + +/* + * Allocate 'size' bytes with 2^align2 bytes alignment, + * restrict the search to free memory after 'startSearch' + * depth and back buffers should be in different 4mb banks + * to get better page hits if possible + * input: size = size of block + * align2 = 2^align2 bytes alignment + * startSearch = linear offset from start of heap to begin search + * return: pointer to the allocated block, 0 if error + */ +PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, + int startSearch ); + +/* + * Free block starts at offset + * input: pointer to a block + * return: 0 if OK, -1 if error + */ +int mmFreeMem( PMemBlock b ); + +/* + * destroy MM + */ +void mmDestroy( memHeap_t *mmInit ); + +/* For debuging purpose. */ +void mmDumpMemInfo( memHeap_t *mmInit ); + +#endif diff --git a/reactos/lib/mesa32/src/drivers/dri/common/mmx.h b/reactos/lib/mesa32/src/drivers/dri/common/mmx.h new file mode 100644 index 00000000000..49ce7e3e342 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/mmx.h @@ -0,0 +1,560 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-98 by H. Dietz and R. Fisher + + History: + 97-98* R.Fisher Early versions + 980501 R.Fisher Original Release + 980611* H.Dietz Rewrite, correctly implementing inlines, and + R.Fisher including direct register accesses. + 980616 R.Fisher Release of 980611 as 980616. + 980714 R.Fisher Minor corrections to Makefile, etc. + 980715 R.Fisher mmx_ok() now prevents optimizer from using + clobbered values. + mmx_ok() now checks if cpuid instruction is + available before trying to use it. + 980726* R.Fisher mm_support() searches for AMD 3DNow, Cyrix + Extended MMX, and standard MMX. It returns a + value which is positive if any of these are + supported, and can be masked with constants to + see which. mmx_ok() is now a call to this + 980726* R.Fisher Added i2r support for shift functions + 980919 R.Fisher Fixed AMD extended feature recognition bug. + 980921 R.Fisher Added definition/check for _MMX_H. + Added "float s[2]" to mmx_t for use with + 3DNow and EMMX. So same mmx_t can be used. + 981013 R.Fisher Fixed cpuid function 1 bug (looked at wrong reg) + Fixed psllq_i2r error in mmxtest.c + + * Unreleased (internal or interim) versions + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. + String compares may be quicker than the multiple test/jumps in vendor + test sequence in mmx_ok(), but I'm not concerned with that right now. + + Acknowledgments: + Jussi Laako for pointing out the errors ultimately found to be + connected to the failure to notify the optimizer of clobbered values. + Roger Hardiman for reminding us that CPUID isn't everywhere, and that + someone may actually try to use this on a machine without CPUID. + Also for suggesting code for checking this. + Robert Dale for pointing out the AMD recognition bug. + Jimmy Mayfield and Carl Witty for pointing out the Intel recognition + bug. + Carl Witty for pointing out the psllq_i2r test bug. +*/ + +#ifndef _MMX_H +#define _MMX_H + +//#define MMX_TRACE + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} mmx_t; + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (imm); \ + fprintf(stderr, #op "_i2r(" #imm "=0x%016llx, ", mmx_trace.q); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%016llx) => ", mmx_trace.q); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%016llx\n", mmx_trace.q); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + fprintf(stderr, #op "_m2r(" #mem "=0x%016llx, ", mmx_trace.q); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%016llx) => ", mmx_trace.q); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%016llx\n", mmx_trace.q); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2m(" #reg "=0x%016llx, ", mmx_trace.q); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%016llx) => ", mmx_trace.q); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%016llx\n", mmx_trace.q); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2r(" #regs "=0x%016llx, ", mmx_trace.q); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%016llx) => ", mmx_trace.q); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%016llx\n", mmx_trace.q); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + fprintf(stderr, #op "_m2m(" #mems "=0x%016llx, ", mmx_trace.q); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%016llx) => ", mmx_trace.q); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%016llx\n", mmx_trace.q); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " $" #imm ", %%" #reg \ + : /* nothing */ \ + : /* nothing */); + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + fprintf(stderr, "emms()\n"); \ + __asm__ __volatile__ ("emms"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms") + +#endif + +#endif + diff --git a/reactos/lib/mesa32/src/drivers/dri/common/spantmp.h b/reactos/lib/mesa32/src/drivers/dri/common/spantmp.h new file mode 100644 index 00000000000..888be0465e5 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/spantmp.h @@ -0,0 +1,259 @@ +#ifndef DBG +#define DBG 0 +#endif + +#ifndef HW_WRITE_LOCK +#define HW_WRITE_LOCK() HW_LOCK() +#endif + +#ifndef HW_WRITE_UNLOCK +#define HW_WRITE_UNLOCK() HW_UNLOCK() +#endif + +#ifndef HW_READ_LOCK +#define HW_READ_LOCK() HW_LOCK() +#endif + +#ifndef HW_READ_UNLOCK +#define HW_READ_UNLOCK() HW_UNLOCK() +#endif + +#ifndef HW_READ_CLIPLOOP +#define HW_READ_CLIPLOOP() HW_CLIPLOOP() +#endif + +#ifndef HW_WRITE_CLIPLOOP +#define HW_WRITE_CLIPLOOP() HW_CLIPLOOP() +#endif + + +static void TAG(WriteRGBASpan)( const GLcontext *ctx, + GLuint n, GLint x, GLint y, + const GLubyte rgba[][4], + const GLubyte mask[] ) +{ + HW_WRITE_LOCK() + { + GLint x1; + GLint n1; + LOCAL_VARS; + + y = Y_FLIP(y); + + HW_WRITE_CLIPLOOP() + { + GLint i = 0; + CLIPSPAN(x,y,n,x1,n1,i); + + if (DBG) fprintf(stderr, "WriteRGBASpan %d..%d (x1 %d)\n", + (int)i, (int)n1, (int)x1); + + if (mask) + { + for (;n1>0;i++,x1++,n1--) + if (mask[i]) + WRITE_RGBA( x1, y, + rgba[i][0], rgba[i][1], + rgba[i][2], rgba[i][3] ); + } + else + { + for (;n1>0;i++,x1++,n1--) + WRITE_RGBA( x1, y, + rgba[i][0], rgba[i][1], + rgba[i][2], rgba[i][3] ); + } + } + HW_ENDCLIPLOOP(); + } + HW_WRITE_UNLOCK(); +} + +static void TAG(WriteRGBSpan)( const GLcontext *ctx, + GLuint n, GLint x, GLint y, + const GLubyte rgb[][3], + const GLubyte mask[] ) +{ + HW_WRITE_LOCK() + { + GLint x1; + GLint n1; + LOCAL_VARS; + + y = Y_FLIP(y); + + HW_WRITE_CLIPLOOP() + { + GLint i = 0; + CLIPSPAN(x,y,n,x1,n1,i); + + if (DBG) fprintf(stderr, "WriteRGBSpan %d..%d (x1 %d)\n", + (int)i, (int)n1, (int)x1); + + if (mask) + { + for (;n1>0;i++,x1++,n1--) + if (mask[i]) + WRITE_RGBA( x1, y, rgb[i][0], rgb[i][1], rgb[i][2], 255 ); + } + else + { + for (;n1>0;i++,x1++,n1--) + WRITE_RGBA( x1, y, rgb[i][0], rgb[i][1], rgb[i][2], 255 ); + } + } + HW_ENDCLIPLOOP(); + } + HW_WRITE_UNLOCK(); +} + +static void TAG(WriteRGBAPixels)( const GLcontext *ctx, + GLuint n, + const GLint x[], + const GLint y[], + const GLubyte rgba[][4], + const GLubyte mask[] ) +{ + HW_WRITE_LOCK() + { + GLint i; + LOCAL_VARS; + + if (DBG) fprintf(stderr, "WriteRGBAPixels\n"); + + HW_WRITE_CLIPLOOP() + { + for (i=0;i0;i++,x1++,n1--) + if (mask[i]) + WRITE_PIXEL( x1, y, p ); + } + HW_ENDCLIPLOOP(); + } + HW_WRITE_UNLOCK(); +} + + +static void TAG(WriteMonoRGBAPixels)( const GLcontext *ctx, + GLuint n, + const GLint x[], const GLint y[], + const GLchan color[], + const GLubyte mask[] ) +{ + HW_WRITE_LOCK() + { + GLint i; + LOCAL_VARS; + INIT_MONO_PIXEL(p, color); + + if (DBG) fprintf(stderr, "WriteMonoRGBAPixels\n"); + + HW_WRITE_CLIPLOOP() + { + for (i=0;i0;i++,x1++,n1--) + READ_RGBA( rgba[i], x1, y ); + } + HW_ENDCLIPLOOP(); + } + HW_READ_UNLOCK(); +} + + +static void TAG(ReadRGBAPixels)( const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + GLubyte rgba[][4], const GLubyte mask[] ) +{ + HW_READ_LOCK() + { + GLint i; + LOCAL_VARS; + + if (DBG) fprintf(stderr, "ReadRGBAPixels\n"); + + HW_READ_CLIPLOOP() + { + for (i=0;i + * Keith Whitwell + * Kevin E. Martin + * Gareth Hughes + */ +/* $XFree86:$ */ + +/** \file texmem.c + * Implements all of the device-independent texture memory management. + * + * Currently, only a simple LRU texture memory management policy is + * implemented. In the (hopefully very near) future, better policies will be + * implemented. The idea is that the DRI should be able to run in one of two + * modes. In the default mode the DRI will dynamically attempt to discover + * the best texture management policy for the running application. In the + * other mode, the user (via some sort of as yet TBD mechanism) will select + * a texture management policy that is known to work well with the + * application. + */ + +#include "texmem.h" +#include "simple_list.h" +#include "imports.h" +#include "macros.h" + +#include + + + +static unsigned dummy_swap_counter; + + +/** + * Calculate \f$\log_2\f$ of a value. This is a particularly poor + * implementation of this function. However, since system performance is in + * no way dependent on this function, the slowness of the implementation is + * irrelevent. + * + * \param n Value whose \f$\log_2\f$ is to be calculated + */ + +static unsigned +driLog2( unsigned n ) +{ + unsigned log2; + + + for ( log2 = 1 ; n > 1 ; log2++ ) { + n >>= 1; + } + + return log2; +} + + + + +/** + * Determine if a texture is resident in textureable memory. Depending on + * the driver, this may or may not be on-card memory. It could be AGP memory + * or anyother type of memory from which the hardware can directly read + * texels. + * + * This function is intended to be used as the \c IsTextureResident function + * in the device's \c dd_function_table. + * + * \param ctx GL context pointer (currently unused) + * \param texObj Texture object to be tested + */ + +GLboolean +driIsTextureResident( GLcontext * ctx, + struct gl_texture_object * texObj ) +{ + driTextureObject * t; + + + t = (driTextureObject *) texObj->DriverData; + return( (t != NULL) && (t->memBlock != NULL) ); +} + + + + +/** + * (Re)initialize the global circular LRU list. The last element + * in the array (\a heap->nrRegions) is the sentinal. Keeping it + * at the end of the array allows the other elements of the array + * to be addressed rationally when looking up objects at a particular + * location in texture memory. + * + * \param heap Texture heap to be reset + */ + +static void resetGlobalLRU( driTexHeap * heap ) +{ + drmTextureRegionPtr list = heap->global_regions; + unsigned sz = 1U << heap->logGranularity; + unsigned i; + + for (i = 0 ; (i+1) * sz <= heap->size ; i++) { + list[i].prev = i-1; + list[i].next = i+1; + list[i].age = 0; + } + + i--; + list[0].prev = heap->nrRegions; + list[i].prev = i-1; + list[i].next = heap->nrRegions; + list[heap->nrRegions].prev = i; + list[heap->nrRegions].next = 0; + heap->global_age[0] = 0; +} + +/** + * Print out debugging information about the local texture LRU. + * + * \param heap Texture heap to be printed + * \param callername Name of calling function + */ +static void printLocalLRU( driTexHeap * heap, const char *callername ) +{ + driTextureObject *t; + unsigned sz = 1U << heap->logGranularity; + + fprintf( stderr, "%s in %s:\nLocal LRU, heap %d:\n", + __FUNCTION__, callername, heap->heapId ); + + foreach ( t, &heap->texture_objects ) { + if (!t->memBlock) + continue; + if (!t->tObj) { + fprintf( stderr, "Placeholder (%p) %d at 0x%x sz 0x%x\n", + (void *)t, + t->memBlock->ofs / sz, + t->memBlock->ofs, + t->memBlock->size ); + } else { + fprintf( stderr, "Texture (%p) at 0x%x sz 0x%x\n", + (void *)t, + t->memBlock->ofs, + t->memBlock->size ); + } + } + foreach ( t, heap->swapped_objects ) { + if (!t->tObj) { + fprintf( stderr, "Swapped Placeholder (%p)\n", (void *)t ); + } else { + fprintf( stderr, "Swapped Texture (%p)\n", (void *)t ); + } + } + + fprintf( stderr, "\n" ); +} + +/** + * Print out debugging information about the global texture LRU. + * + * \param heap Texture heap to be printed + * \param callername Name of calling function + */ +static void printGlobalLRU( driTexHeap * heap, const char *callername ) +{ + drmTextureRegionPtr list = heap->global_regions; + int i, j; + + fprintf( stderr, "%s in %s:\nGlobal LRU, heap %d list %p:\n", + __FUNCTION__, callername, heap->heapId, (void *)list ); + + for ( i = 0, j = heap->nrRegions ; i < heap->nrRegions ; i++ ) { + fprintf( stderr, "list[%d] age %d next %d prev %d in_use %d\n", + j, list[j].age, list[j].next, list[j].prev, list[j].in_use ); + j = list[j].next; + if ( j == heap->nrRegions ) break; + } + + if ( j != heap->nrRegions ) { + fprintf( stderr, "Loop detected in global LRU\n" ); + for ( i = 0 ; i < heap->nrRegions ; i++ ) { + fprintf( stderr, "list[%d] age %d next %d prev %d in_use %d\n", + i, list[i].age, list[i].next, list[i].prev, list[i].in_use ); + } + } + + fprintf( stderr, "\n" ); +} + + +/** + * Called by the client whenever it touches a local texture. + * + * \param t Texture object that the client has accessed + */ + +void driUpdateTextureLRU( driTextureObject * t ) +{ + driTexHeap * heap; + drmTextureRegionPtr list; + unsigned shift; + unsigned start; + unsigned end; + unsigned i; + + + heap = t->heap; + if ( heap != NULL ) { + shift = heap->logGranularity; + start = t->memBlock->ofs >> shift; + end = (t->memBlock->ofs + t->memBlock->size - 1) >> shift; + + + heap->local_age = ++heap->global_age[0]; + list = heap->global_regions; + + + /* Update the context's local LRU + */ + + move_to_head( & heap->texture_objects, t ); + + + for (i = start ; i <= end ; i++) { + list[i].age = heap->local_age; + + /* remove_from_list(i) + */ + list[(unsigned)list[i].next].prev = list[i].prev; + list[(unsigned)list[i].prev].next = list[i].next; + + /* insert_at_head(list, i) + */ + list[i].prev = heap->nrRegions; + list[i].next = list[heap->nrRegions].next; + list[(unsigned)list[heap->nrRegions].next].prev = i; + list[heap->nrRegions].next = i; + } + + if ( 0 ) { + printGlobalLRU( heap, __FUNCTION__ ); + printLocalLRU( heap, __FUNCTION__ ); + } + } +} + + + + +/** + * Keep track of swapped out texture objects. + * + * \param t Texture object to be "swapped" out of its texture heap + */ + +void driSwapOutTextureObject( driTextureObject * t ) +{ + unsigned face; + + + if ( t->memBlock != NULL ) { + assert( t->heap != NULL ); + mmFreeMem( t->memBlock ); + t->memBlock = NULL; + + if (t->timestamp > t->heap->timestamp) + t->heap->timestamp = t->timestamp; + + t->heap->texture_swaps[0]++; + move_to_tail( t->heap->swapped_objects, t ); + t->heap = NULL; + } + else { + assert( t->heap == NULL ); + } + + + for ( face = 0 ; face < 6 ; face++ ) { + t->dirty_images[face] = ~0; + } +} + + + + +/** + * Destroy hardware state associated with texture \a t. Calls the + * \a destroy_texture_object method associated with the heap from which + * \a t was allocated. + * + * \param t Texture object to be destroyed + */ + +void driDestroyTextureObject( driTextureObject * t ) +{ + driTexHeap * heap; + + + if ( 0 ) { + fprintf( stderr, "[%s:%d] freeing %p (tObj = %p, DriverData = %p)\n", + __FILE__, __LINE__, + (void *)t, + (void *)((t != NULL) ? t->tObj : NULL), + (void *)((t != NULL && t->tObj != NULL) ? t->tObj->DriverData : NULL )); + } + + if ( t != NULL ) { + if ( t->memBlock ) { + heap = t->heap; + assert( heap != NULL ); + + heap->texture_swaps[0]++; + + mmFreeMem( t->memBlock ); + t->memBlock = NULL; + + if (t->timestamp > t->heap->timestamp) + t->heap->timestamp = t->timestamp; + + heap->destroy_texture_object( heap->driverContext, t ); + t->heap = NULL; + } + + if ( t->tObj != NULL ) { + assert( t->tObj->DriverData == t ); + t->tObj->DriverData = NULL; + } + + remove_from_list( t ); + FREE( t ); + } + + if ( 0 ) { + fprintf( stderr, "[%s:%d] done freeing %p\n", __FILE__, __LINE__, (void *)t ); + } +} + + + + +/** + * Update the local heap's representation of texture memory based on + * data in the SAREA. This is done each time it is detected that some other + * direct rendering client has held the lock. This pertains to both our local + * textures and the textures belonging to other clients. Keep track of other + * client's textures by pushing a placeholder texture onto the LRU list -- + * these are denoted by \a tObj being \a NULL. + * + * \param heap Heap whose state is to be updated + * \param offset Byte offset in the heap that has been stolen + * \param size Size, in bytes, of the stolen block + * \param in_use Non-zero if the block is pinned/reserved by the kernel + */ + +static void driTexturesGone( driTexHeap * heap, int offset, int size, + int in_use ) +{ + driTextureObject * t; + driTextureObject * tmp; + + + foreach_s ( t, tmp, & heap->texture_objects ) { + if ( (t->memBlock->ofs < (offset + size)) + && ((t->memBlock->ofs + t->memBlock->size) > offset) ) { + /* It overlaps - kick it out. If the texture object is just a + * place holder, then destroy it all together. Otherwise, mark + * it as being swapped out. + */ + + if ( t->tObj != NULL ) { + driSwapOutTextureObject( t ); + } + else { + driDestroyTextureObject( t ); + } + } + } + + + { + t = (driTextureObject *) CALLOC( heap->texture_object_size ); + if ( t == NULL ) return; + + t->memBlock = mmAllocMem( heap->memory_heap, size, 0, offset ); + if ( t->memBlock == NULL ) { + fprintf( stderr, "Couldn't alloc placeholder: heap %u sz %x ofs %x\n", heap->heapId, + (int)size, (int)offset ); + mmDumpMemInfo( heap->memory_heap ); + return; + } + t->heap = heap; + if (in_use) + t->bound = 99; + insert_at_head( & heap->texture_objects, t ); + } +} + + + + +/** + * Called by the client on lock contention to determine whether textures have + * been stolen. If another client has modified a region in which we have + * textures, then we need to figure out which of our textures have been + * removed and update our global LRU. + * + * \param heap Texture heap to be updated + */ + +void driAgeTextures( driTexHeap * heap ) +{ + drmTextureRegionPtr list = heap->global_regions; + unsigned sz = 1U << (heap->logGranularity); + unsigned i, nr = 0; + + + /* Have to go right round from the back to ensure stuff ends up + * LRU in the local list... Fix with a cursor pointer. + */ + + for (i = list[heap->nrRegions].prev ; + i != heap->nrRegions && nr < heap->nrRegions ; + i = list[i].prev, nr++) { + /* If switching texturing schemes, then the SAREA might not have been + * properly cleared, so we need to reset the global texture LRU. + */ + + if ( (i * sz) > heap->size ) { + nr = heap->nrRegions; + break; + } + + if (list[i].age > heap->local_age) + driTexturesGone( heap, i * sz, sz, list[i].in_use); + } + + /* Loop or uninitialized heap detected. Reset. + */ + + if (nr == heap->nrRegions) { + driTexturesGone( heap, 0, heap->size, 0); + resetGlobalLRU( heap ); + } + + if ( 0 ) { + printGlobalLRU( heap, __FUNCTION__ ); + printLocalLRU( heap, __FUNCTION__ ); + } + + heap->local_age = heap->global_age[0]; +} + + + + +/** + * Allocate memory from a texture heap to hold a texture object. This + * routine will attempt to allocate memory for the texture from the heaps + * specified by \c heap_array in order. That is, first it will try to + * allocate from \c heap_array[0], then \c heap_array[1], and so on. + * + * \param heap_array Array of pointers to texture heaps to use + * \param nr_heaps Number of heap pointer in \a heap_array + * \param t Texture object for which space is needed + * \return The ID of the heap from which memory was allocated, or -1 if + * memory could not be allocated. + * + * \bug The replacement policy implemented by this function is horrible. + */ + + +int +driAllocateTexture( driTexHeap * const * heap_array, unsigned nr_heaps, + driTextureObject * t ) +{ + driTexHeap * heap; + driTextureObject * temp; + driTextureObject * cursor; + unsigned id; + + + /* In case it already has texture space, initialize heap. This also + * prevents GCC from issuing a warning that heap might be used + * uninitialized. + */ + + heap = t->heap; + + + /* Run through each of the existing heaps and try to allocate a buffer + * to hold the texture. + */ + + for ( id = 0 ; (t->memBlock == NULL) && (id < nr_heaps) ; id++ ) { + heap = heap_array[ id ]; + if ( heap != NULL ) { + t->memBlock = mmAllocMem( heap->memory_heap, t->totalSize, + heap->alignmentShift, 0 ); + } + } + + + /* Kick textures out until the requested texture fits. + */ + + if ( t->memBlock == NULL ) { + for ( id = 0 ; (t->memBlock == NULL) && (id < nr_heaps) ; id++ ) { + heap = heap_array[ id ]; + if ( t->totalSize <= heap->size ) { + + for ( cursor = heap->texture_objects.prev, temp = cursor->prev; + cursor != &heap->texture_objects ; + cursor = temp, temp = cursor->prev ) { + + /* The the LRU element. If the texture is bound to one of + * the texture units, then we cannot kick it out. + */ + if ( cursor->bound /* || cursor->reserved */ ) { + continue; + } + + /* If this is a placeholder, there's no need to keep it */ + if (cursor->tObj) + driSwapOutTextureObject( cursor ); + else + driDestroyTextureObject( cursor ); + + t->memBlock = mmAllocMem( heap->memory_heap, t->totalSize, + heap->alignmentShift, 0 ); + + if (t->memBlock) + break; + } + } /* if ( t->totalSize <= heap->size ) ... */ + } + } + + + if ( t->memBlock != NULL ) { + /* id and heap->heapId may or may not be the same value here. + */ + + assert( heap != NULL ); + assert( (t->heap == NULL) || (t->heap == heap) ); + + t->heap = heap; + return heap->heapId; + } + else { + assert( t->heap == NULL ); + + fprintf( stderr, "[%s:%d] unable to allocate texture\n", + __FUNCTION__, __LINE__ ); + return -1; + } +} + + + + + + +/** + * Set the location where the texture-swap counter is stored. + */ + +void +driSetTextureSwapCounterLocation( driTexHeap * heap, unsigned * counter ) +{ + heap->texture_swaps = (counter == NULL) ? & dummy_swap_counter : counter; +} + + + + +/** + * Create a new heap for texture data. + * + * \param heap_id Device-dependent heap identifier. This value + * will returned by driAllocateTexture when memory + * is allocated from this heap. + * \param context Device-dependent driver context. This is + * supplied as the first parameter to the + * \c destroy_tex_obj function. + * \param size Size, in bytes, of the texture region + * \param alignmentShift Alignment requirement for textures. If textures + * must be allocated on a 4096 byte boundry, this + * would be 12. + * \param nr_regions Number of regions into which this texture space + * should be partitioned + * \param global_regions Array of \c drmTextureRegion structures in the SAREA + * \param global_age Pointer to the global texture age in the SAREA + * \param swapped_objects Pointer to the list of texture objects that are + * not in texture memory (i.e., have been swapped + * out). + * \param texture_object_size Size, in bytes, of a device-dependent texture + * object + * \param destroy_tex_obj Function used to destroy a device-dependent + * texture object + * + * \sa driDestroyTextureHeap + */ + +driTexHeap * +driCreateTextureHeap( unsigned heap_id, void * context, unsigned size, + unsigned alignmentShift, unsigned nr_regions, + drmTextureRegionPtr global_regions, unsigned * global_age, + driTextureObject * swapped_objects, + unsigned texture_object_size, + destroy_texture_object_t * destroy_tex_obj + ) +{ + driTexHeap * heap; + unsigned l; + + + if ( 0 ) + fprintf( stderr, "%s( %u, %p, %u, %u, %u )\n", + __FUNCTION__, + heap_id, (void *)context, size, alignmentShift, nr_regions ); + + heap = (driTexHeap *) CALLOC( sizeof( driTexHeap ) ); + if ( heap != NULL ) { + l = driLog2( (size - 1) / nr_regions ); + if ( l < alignmentShift ) + { + l = alignmentShift; + } + + heap->logGranularity = l; + heap->size = size & ~((1L << l) - 1); + + heap->memory_heap = mmInit( 0, heap->size ); + if ( heap->memory_heap != NULL ) { + heap->heapId = heap_id; + heap->driverContext = context; + + heap->alignmentShift = alignmentShift; + heap->nrRegions = nr_regions; + heap->global_regions = global_regions; + heap->global_age = global_age; + heap->swapped_objects = swapped_objects; + heap->texture_object_size = texture_object_size; + heap->destroy_texture_object = destroy_tex_obj; + + /* Force global heap init */ + if (heap->global_age[0] == 0) + heap->local_age = ~0; + else + heap->local_age = 0; + + make_empty_list( & heap->texture_objects ); + driSetTextureSwapCounterLocation( heap, NULL ); + } + else { + FREE( heap ); + heap = NULL; + } + } + + + if ( 0 ) + fprintf( stderr, "%s returning %p\n", __FUNCTION__, (void *)heap ); + + return heap; +} + + + + +/** Destroys a texture heap + * + * \param heap Texture heap to be destroyed + */ + +void +driDestroyTextureHeap( driTexHeap * heap ) +{ + driTextureObject * t; + driTextureObject * temp; + + + if ( heap != NULL ) { + foreach_s( t, temp, & heap->texture_objects ) { + driDestroyTextureObject( t ); + } + foreach_s( t, temp, heap->swapped_objects ) { + driDestroyTextureObject( t ); + } + + mmDestroy( heap->memory_heap ); + FREE( heap ); + } +} + + + + +/****************************************************************************/ +/** + * Determine how many texels (including all mipmap levels) would be required + * for a texture map of size \f$2^^\c base_size_log2\f$ would require. + * + * \param base_size_log2 \f$log_2\f$ of the size of a side of the texture + * \param dimensions Number of dimensions of the texture. Either 2 or 3. + * \param faces Number of faces of the texture. Either 1 or 6 (for cube maps). + * \return Number of texels + */ + +static unsigned +texels_this_map_size( int base_size_log2, unsigned dimensions, unsigned faces ) +{ + unsigned texels; + + + assert( (faces == 1) || (faces == 6) ); + assert( (dimensions == 2) || (dimensions == 3) ); + + texels = 0; + if ( base_size_log2 >= 0 ) { + texels = (1U << (dimensions * base_size_log2)); + + /* See http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg03636.html + * for the complete explaination of why this formulation is used. + * Basically, the smaller mipmap levels sum to 0.333 the size of the + * level 0 map. The total size is therefore the size of the map + * multipled by 1.333. The +2 is there to round up. + */ + + texels = (texels * 4 * faces + 2) / 3; + } + + return texels; +} + + + + +struct maps_per_heap { + unsigned c[32]; +}; + +static void +fill_in_maximums( driTexHeap * const * heaps, unsigned nr_heaps, + unsigned max_bytes_per_texel, unsigned max_size, + unsigned mipmaps_at_once, unsigned dimensions, + unsigned faces, struct maps_per_heap * max_textures ) +{ + unsigned heap; + unsigned log2_size; + unsigned mask; + + + /* Determine how many textures of each size can be stored in each + * texture heap. + */ + + for ( heap = 0 ; heap < nr_heaps ; heap++ ) { + if ( heaps[ heap ] == NULL ) { + (void) memset( max_textures[ heap ].c, 0, + sizeof( max_textures[ heap ].c ) ); + continue; + } + + mask = (1U << heaps[ heap ]->logGranularity) - 1; + + if ( 0 ) { + fprintf( stderr, "[%s:%d] heap[%u] = %u bytes, mask = 0x%08x\n", + __FILE__, __LINE__, + heap, heaps[ heap ]->size, mask ); + } + + for ( log2_size = max_size ; log2_size > 0 ; log2_size-- ) { + unsigned total; + + + /* Determine the total number of bytes required by a texture of + * size log2_size. + */ + + total = texels_this_map_size( log2_size, dimensions, faces ) + - texels_this_map_size( log2_size - mipmaps_at_once, + dimensions, faces ); + total *= max_bytes_per_texel; + total = (total + mask) & ~mask; + + /* The number of textures of a given size that will fit in a heap + * is equal to the size of the heap divided by the size of the + * texture. + */ + + max_textures[ heap ].c[ log2_size ] = heaps[ heap ]->size / total; + + if ( 0 ) { + fprintf( stderr, "[%s:%d] max_textures[%u].c[%02u] " + "= 0x%08x / 0x%08x " + "= %u (%u)\n", + __FILE__, __LINE__, + heap, log2_size, + heaps[ heap ]->size, total, + heaps[ heap ]->size / total, + max_textures[ heap ].c[ log2_size ] ); + } + } + } +} + + +static unsigned +get_max_size( unsigned nr_heaps, + unsigned texture_units, + unsigned max_size, + int all_textures_one_heap, + struct maps_per_heap * max_textures ) +{ + unsigned heap; + unsigned log2_size; + + + /* Determine the largest texture size such that a texture of that size + * can be bound to each texture unit at the same time. Some hardware + * may require that all textures be in the same texture heap for + * multitexturing. + */ + + for ( log2_size = max_size ; log2_size > 0 ; log2_size-- ) { + unsigned total = 0; + + for ( heap = 0 ; heap < nr_heaps ; heap++ ) + { + total += max_textures[ heap ].c[ log2_size ]; + + if ( 0 ) { + fprintf( stderr, "[%s:%d] max_textures[%u].c[%02u] = %u, " + "total = %u\n", __FILE__, __LINE__, heap, log2_size, + max_textures[ heap ].c[ log2_size ], total ); + } + + if ( (max_textures[ heap ].c[ log2_size ] >= texture_units) + || (!all_textures_one_heap && (total >= texture_units)) ) { + /* The number of mipmap levels is the log-base-2 of the + * maximum texture size plus 1. If the maximum texture size + * is 1x1, the log-base-2 is 0 and 1 mipmap level (the base + * level) is available. + */ + + return log2_size + 1; + } + } + } + + /* This should NEVER happen. It should always be possible to have at + * *least* a 1x1 texture in memory! + */ + assert( log2_size != 0 ); + return 0; +} + +#define SET_MAX(f,v) \ + do { if ( max_sizes[v] != 0 ) { limits-> f = max_sizes[v]; } } while( 0 ) + +#define SET_MAX_RECT(f,v) \ + do { if ( max_sizes[v] != 0 ) { limits-> f = 1 << max_sizes[v]; } } while( 0 ) + + +/** + * Given the amount of texture memory, the number of texture units, and the + * maximum size of a texel, calculate the maximum texture size the driver can + * advertise. + * + * \param heaps Texture heaps for this card + * \param nr_heap Number of texture heaps + * \param limits OpenGL contants. MaxTextureUnits must be set. + * \param max_bytes_per_texel Maximum size of a single texel, in bytes + * \param max_2D_size \f$\log_2\f$ of the maximum 2D texture size (i.e., + * 1024x1024 textures, this would be 10) + * \param max_3D_size \f$\log_2\f$ of the maximum 3D texture size (i.e., + * 1024x1024x1024 textures, this would be 10) + * \param max_cube_size \f$\log_2\f$ of the maximum cube texture size (i.e., + * 1024x1024 textures, this would be 10) + * \param max_rect_size \f$\log_2\f$ of the maximum texture rectangle size + * (i.e., 1024x1024 textures, this would be 10). This is a power-of-2 + * even though texture rectangles need not be a power-of-2. + * \param mipmaps_at_once Total number of mipmaps that can be used + * at one time. For most hardware this will be \f$\c max_size + 1\f$. + * For hardware that does not support mipmapping, this will be 1. + * \param all_textures_one_heap True if the hardware requires that all + * textures be in a single texture heap for multitexturing. + */ + +void +driCalculateMaxTextureLevels( driTexHeap * const * heaps, + unsigned nr_heaps, + struct gl_constants * limits, + unsigned max_bytes_per_texel, + unsigned max_2D_size, + unsigned max_3D_size, + unsigned max_cube_size, + unsigned max_rect_size, + unsigned mipmaps_at_once, + int all_textures_one_heap ) +{ + struct maps_per_heap max_textures[8]; + unsigned i; + const unsigned dimensions[4] = { 2, 3, 2, 2 }; + const unsigned faces[4] = { 1, 1, 6, 1 }; + unsigned max_sizes[4]; + unsigned mipmaps[4]; + + + max_sizes[0] = max_2D_size; + max_sizes[1] = max_3D_size; + max_sizes[2] = max_cube_size; + max_sizes[3] = max_rect_size; + + mipmaps[0] = mipmaps_at_once; + mipmaps[1] = mipmaps_at_once; + mipmaps[2] = 1; + mipmaps[3] = mipmaps_at_once; + + + /* Calculate the maximum number of texture levels in two passes. The + * first pass determines how many textures of each power-of-two size + * (including all mipmap levels for that size) can fit in each texture + * heap. The second pass finds the largest texture size that allows + * a texture of that size to be bound to every texture unit. + */ + + for ( i = 0 ; i < 4 ; i++ ) { + if ( max_sizes[ i ] != 0 ) { + fill_in_maximums( heaps, nr_heaps, max_bytes_per_texel, + max_sizes[ i ], mipmaps[ i ], + dimensions[ i ], faces[ i ], + max_textures ); + + max_sizes[ i ] = get_max_size( nr_heaps, + limits->MaxTextureUnits, + max_sizes[ i ], + all_textures_one_heap, + max_textures ); + } + } + + SET_MAX( MaxTextureLevels, 0 ); + SET_MAX( Max3DTextureLevels, 1 ); + SET_MAX( MaxCubeTextureLevels, 2 ); + SET_MAX_RECT( MaxTextureRectSize, 3 ); +} + + + + +/** + * Perform initial binding of default textures objects on a per unit, per + * texture target basis. + * + * \param ctx Current OpenGL context + * \param swapped List of swapped-out textures + * \param targets Bit-mask of value texture targets + */ + +void driInitTextureObjects( GLcontext *ctx, driTextureObject * swapped, + GLuint targets ) +{ + struct gl_texture_object *texObj; + GLuint tmp = ctx->Texture.CurrentUnit; + unsigned i; + + + for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { + ctx->Texture.CurrentUnit = i; + + if ( (targets & DRI_TEXMGR_DO_TEXTURE_1D) != 0 ) { + texObj = ctx->Texture.Unit[i].Current1D; + ctx->Driver.BindTexture( ctx, GL_TEXTURE_1D, texObj ); + move_to_tail( swapped, (driTextureObject *) texObj->DriverData ); + } + + if ( (targets & DRI_TEXMGR_DO_TEXTURE_2D) != 0 ) { + texObj = ctx->Texture.Unit[i].Current2D; + ctx->Driver.BindTexture( ctx, GL_TEXTURE_2D, texObj ); + move_to_tail( swapped, (driTextureObject *) texObj->DriverData ); + } + + if ( (targets & DRI_TEXMGR_DO_TEXTURE_3D) != 0 ) { + texObj = ctx->Texture.Unit[i].Current3D; + ctx->Driver.BindTexture( ctx, GL_TEXTURE_3D, texObj ); + move_to_tail( swapped, (driTextureObject *) texObj->DriverData ); + } + + if ( (targets & DRI_TEXMGR_DO_TEXTURE_CUBE) != 0 ) { + texObj = ctx->Texture.Unit[i].CurrentCubeMap; + ctx->Driver.BindTexture( ctx, GL_TEXTURE_CUBE_MAP_ARB, texObj ); + move_to_tail( swapped, (driTextureObject *) texObj->DriverData ); + } + + if ( (targets & DRI_TEXMGR_DO_TEXTURE_RECT) != 0 ) { + texObj = ctx->Texture.Unit[i].CurrentRect; + ctx->Driver.BindTexture( ctx, GL_TEXTURE_RECTANGLE_NV, texObj ); + move_to_tail( swapped, (driTextureObject *) texObj->DriverData ); + } + } + + ctx->Texture.CurrentUnit = tmp; +} + + + + +/** + * Verify that the specified texture is in the specificed heap. + * + * \param tex Texture to be tested. + * \param heap Texture memory heap to be tested. + * \return True if the texture is in the heap, false otherwise. + */ + +static GLboolean +check_in_heap( const driTextureObject * tex, const driTexHeap * heap ) +{ +#if 1 + return tex->heap == heap; +#else + driTextureObject * curr; + + foreach( curr, & heap->texture_objects ) { + if ( curr == tex ) { + break; + } + } + + return curr == tex; +#endif +} + + + +/****************************************************************************/ +/** + * Validate the consistency of a set of texture heaps. + * Original version by Keith Whitwell in r200/r200_sanity.c. + */ + +GLboolean +driValidateTextureHeaps( driTexHeap * const * texture_heaps, + unsigned nr_heaps, const driTextureObject * swapped ) +{ + driTextureObject *t; + unsigned i; + + for ( i = 0 ; i < nr_heaps ; i++ ) { + int last_end = 0; + unsigned textures_in_heap = 0; + unsigned blocks_in_mempool = 0; + const driTexHeap * heap = texture_heaps[i]; + const memHeap_t * p = heap->memory_heap; + + /* Check each texture object has a MemBlock, and is linked into + * the correct heap. + * + * Check the texobj base address corresponds to the MemBlock + * range. Check the texobj size (recalculate???) fits within + * the MemBlock. + * + * Count the number of texobj's using this heap. + */ + + foreach ( t, &heap->texture_objects ) { + if ( !check_in_heap( t, heap ) ) { + fprintf( stderr, "%s memory block for texture object @ %p not " + "found in heap #%d\n", + __FUNCTION__, (void *)t, i ); + return GL_FALSE; + } + + + if ( t->totalSize > t->memBlock->size ) { + fprintf( stderr, "%s: Memory block for texture object @ %p is " + "only %u bytes, but %u are required\n", + __FUNCTION__, (void *)t, t->totalSize, t->memBlock->size ); + return GL_FALSE; + } + + textures_in_heap++; + } + + /* Validate the contents of the heap: + * - Ordering + * - Overlaps + * - Bounds + */ + + while ( p != NULL ) { + if (p->reserved) { + fprintf( stderr, "%s: Block (%08x,%x), is reserved?!\n", + __FUNCTION__, p->ofs, p->size ); + return GL_FALSE; + } + + if (p->ofs != last_end) { + fprintf( stderr, "%s: blocks_in_mempool = %d, last_end = %d, p->ofs = %d\n", + __FUNCTION__, blocks_in_mempool, last_end, p->ofs ); + return GL_FALSE; + } + + if (!p->reserved && !p->free) { + blocks_in_mempool++; + } + + last_end = p->ofs + p->size; + p = p->next; + } + + if (textures_in_heap != blocks_in_mempool) { + fprintf( stderr, "%s: Different number of textures objects (%u) and " + "inuse memory blocks (%u)\n", + __FUNCTION__, textures_in_heap, blocks_in_mempool ); + return GL_FALSE; + } + +#if 0 + fprintf( stderr, "%s: textures_in_heap = %u\n", + __FUNCTION__, textures_in_heap ); +#endif + } + + + /* Check swapped texobj's have zero memblocks + */ + i = 0; + foreach ( t, swapped ) { + if ( t->memBlock != NULL ) { + fprintf( stderr, "%s: Swapped texobj %p has non-NULL memblock %p\n", + __FUNCTION__, (void *)t, (void *)t->memBlock ); + return GL_FALSE; + } + i++; + } + +#if 0 + fprintf( stderr, "%s: swapped texture count = %u\n", __FUNCTION__, i ); +#endif + + return GL_TRUE; +} + + + + +/****************************************************************************/ +/** + * Compute which mipmap levels that really need to be sent to the hardware. + * This depends on the base image size, GL_TEXTURE_MIN_LOD, + * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. + */ + +void +driCalculateTextureFirstLastLevel( driTextureObject * t ) +{ + struct gl_texture_object * const tObj = t->tObj; + const struct gl_texture_image * const baseImage = + tObj->Image[tObj->BaseLevel]; + + /* These must be signed values. MinLod and MaxLod can be negative numbers, + * and having firstLevel and lastLevel as signed prevents the need for + * extra sign checks. + */ + int firstLevel; + int lastLevel; + + /* Yes, this looks overly complicated, but it's all needed. + */ + + switch (tObj->Target) { + case GL_TEXTURE_1D: + case GL_TEXTURE_2D: + case GL_TEXTURE_3D: + case GL_TEXTURE_CUBE_MAP: + if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) { + /* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL. + */ + + firstLevel = lastLevel = tObj->BaseLevel; + } + else { + firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5); + firstLevel = MAX2(firstLevel, tObj->BaseLevel); + lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5); + lastLevel = MAX2(lastLevel, t->tObj->BaseLevel); + lastLevel = MIN2(lastLevel, t->tObj->BaseLevel + baseImage->MaxLog2); + lastLevel = MIN2(lastLevel, t->tObj->MaxLevel); + lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ + } + break; + case GL_TEXTURE_RECTANGLE_NV: + case GL_TEXTURE_4D_SGIS: + firstLevel = lastLevel = 0; + break; + default: + return; + } + + /* save these values */ + t->firstLevel = firstLevel; + t->lastLevel = lastLevel; +} diff --git a/reactos/lib/mesa32/src/drivers/dri/common/texmem.h b/reactos/lib/mesa32/src/drivers/dri/common/texmem.h new file mode 100644 index 00000000000..9afbb0c865b --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/texmem.h @@ -0,0 +1,295 @@ +/* + * Copyright 2000-2001 VA Linux Systems, Inc. + * (c) Copyright IBM Corporation 2002 + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ian Romanick + * Keith Whitwell + * Kevin E. Martin + * Gareth Hughes + */ +/* $XFree86:$ */ + +/** \file texmem.h + * Public interface to the DRI texture memory management routines. + * + * \sa texmem.c + */ + +#ifndef DRI_TEXMEM_H +#define DRI_TEXMEM_H + +#include "mtypes.h" +#include "mm.h" +#include "xf86drm.h" + +struct dri_tex_heap; +typedef struct dri_tex_heap driTexHeap; + +struct dri_texture_object; +typedef struct dri_texture_object driTextureObject; + + +/** + * Base texture object type. Each driver will extend this type with its own + * private data members. + */ + +struct dri_texture_object { + struct dri_texture_object * next; + struct dri_texture_object * prev; + + driTexHeap * heap; /**< Texture heap currently stored in */ + struct gl_texture_object * tObj;/**< Pointer to Mesa texture object + * If NULL, this texture object is a + * "placeholder" object representing + * texture memory in use by another context. + * A placeholder should have a heap and a memBlock. + */ + PMemBlock memBlock; /**< Memory block containing texture */ + unsigned bound; /**< Texture unit currently bound to */ + + unsigned totalSize; /**< Total size of the texture, + * including all mipmap levels + */ + + unsigned dirty_images[6]; /**< Flags for whether or not images + * need to be uploaded to local or + * AGP texture space. One flag set + * for each cube face for cubic + * textures. Bit zero corresponds to + * the base-level, which may or may + * not be the level zero mipmap. + */ + + unsigned timestamp; /**< Timestamp used to + * synchronize with 3d engine + * in hardware where textures + * are uploaded directly to + * the framebuffer. + */ + + unsigned firstLevel; /**< Image in \c tObj->Image that + * corresponds to the base-level of + * this texture object. + */ + + unsigned lastLevel; /**< Last image in \c tObj->Image used + * by the current LOD settings of this + * texture object. This value must be + * greater than or equal to + * \c firstLevel. + */ +}; + + +typedef void (destroy_texture_object_t)( void * driverContext, + driTextureObject * t ); + +/** + * Client-private representation of texture memory state. + * + * Clients will place one or more of these structs in their driver + * context struct to manage one or more global texture heaps. + */ + +struct dri_tex_heap { + + /** Client-supplied heap identifier + */ + unsigned heapId; + + /** Pointer to the client's private context + */ + void *driverContext; + + /** Total size of the heap, in bytes + */ + unsigned size; + + /** \brief \f$log_2\f$ of size of single heap region + * + * Each context takes memory from the global texture heap in + * \f$2^{logGranularity}\f$ byte blocks. The value of + * \a logGranularity is based on the amount of memory represented + * by the heap and the maximum number of regions in the SAREA. Given + * \a b bytes of texture memory an \a n regions in the SAREA, + * \a logGranularity will be \f$\lfloor\log_2( b / n )\rfloor\f$. + */ + unsigned logGranularity; + + /** \brief Required alignment of allocations in this heap + * + * The alignment shift is supplied to \a mmAllocMem when memory is + * allocated from this heap. The value of \a alignmentShift will + * typically reflect some require of the hardware. This value has + * \b no \b relation to \a logGranularity. \a alignmentShift is a + * per-context value. + * + * \sa mmAllocMem + */ + unsigned alignmentShift; + + /** Number of elements in global list (the SAREA). + */ + unsigned nrRegions; + + /** Pointer to SAREA \a driTexRegion array + */ + drmTextureRegionPtr global_regions; + + /** Pointer to the texture state age (generation number) in the SAREA + */ + unsigned * global_age; + + /** Local age (generation number) of texture state + */ + unsigned local_age; + + /** Memory heap used to manage texture memory represented by + * this texture heap. + */ + memHeap_t * memory_heap; + + /** List of objects that we currently believe to be in texture + * memory. + */ + driTextureObject texture_objects; + + /** Pointer to the list of texture objects that are not in + * texture memory. + */ + driTextureObject * swapped_objects; + + /** Size of the driver-speicific texture object. + */ + unsigned texture_object_size; + + + /** + * \brief Function to destroy driver-specific texture object data. + * + * This function is supplied by the driver so that the texture manager + * can release all resources associated with a texture object. This + * function should only release driver-specific data. That is, + * \a driDestroyTextureObject will release the texture memory + * associated with the texture object, it will release the memory + * for the texture object itself, and it will unlink the texture + * object from the texture object lists. + * + * \param driverContext Pointer to the driver supplied context + * \param t Texture object that is to be destroyed + * \sa driDestroyTextureObject + */ + + destroy_texture_object_t * destroy_texture_object; + + + /** + */ + unsigned * texture_swaps; + + /** + * Timestamp used to synchronize with 3d engine in hardware + * where textures are uploaded directly to the + * framebuffer. + */ + unsigned timestamp; +}; + + + + +/** + * Called by the client on lock contention to determine whether textures have + * been stolen. If another client has modified a region in which we have + * textures, then we need to figure out which of our textures have been + * removed and update our global LRU. + * + * \param heap Texture heap to be updated + * \hideinitializer + */ + +#define DRI_AGE_TEXTURES( heap ) \ + do { \ + if ( ((heap) != NULL) \ + && ((heap)->local_age != (heap)->global_age[0]) ) \ + driAgeTextures( heap ); \ + } while( 0 ) + + + + +/* This should be called whenever there has been contention on the hardware + * lock. driAgeTextures should not be called directly. Instead, clients + * should use DRI_AGE_TEXTURES, above. + */ + +void driAgeTextures( driTexHeap * heap ); + +void driUpdateTextureLRU( driTextureObject * t ); +void driSwapOutTextureObject( driTextureObject * t ); +void driDestroyTextureObject( driTextureObject * t ); +int driAllocateTexture( driTexHeap * const * heap_array, unsigned nr_heaps, + driTextureObject * t ); + +GLboolean driIsTextureResident( GLcontext * ctx, + struct gl_texture_object * texObj ); + +driTexHeap * driCreateTextureHeap( unsigned heap_id, void * context, + unsigned size, unsigned alignmentShift, unsigned nr_regions, + drmTextureRegionPtr global_regions, unsigned * global_age, + driTextureObject * swapped_objects, unsigned texture_object_size, + destroy_texture_object_t * destroy_tex_obj ); +void driDestroyTextureHeap( driTexHeap * heap ); + +void +driCalculateMaxTextureLevels( driTexHeap * const * heaps, + unsigned nr_heaps, + struct gl_constants * limits, + unsigned max_bytes_per_texel, + unsigned max_2D_size, + unsigned max_3D_size, + unsigned max_cube_size, + unsigned max_rect_size, + unsigned mipmaps_at_once, + int all_textures_one_heap ); + +void +driSetTextureSwapCounterLocation( driTexHeap * heap, unsigned * counter ); + +#define DRI_TEXMGR_DO_TEXTURE_1D 0x0001 +#define DRI_TEXMGR_DO_TEXTURE_2D 0x0002 +#define DRI_TEXMGR_DO_TEXTURE_3D 0x0004 +#define DRI_TEXMGR_DO_TEXTURE_CUBE 0x0008 +#define DRI_TEXMGR_DO_TEXTURE_RECT 0x0010 + +void driInitTextureObjects( GLcontext *ctx, driTextureObject * swapped, + GLuint targets ); + +GLboolean driValidateTextureHeaps( driTexHeap * const * texture_heaps, + unsigned nr_heaps, const driTextureObject * swapped ); + +extern void driCalculateTextureFirstLastLevel( driTextureObject * t ); + +#endif /* DRI_TEXMEM_H */ diff --git a/reactos/lib/mesa32/src/drivers/dri/common/utils.c b/reactos/lib/mesa32/src/drivers/dri/common/utils.c new file mode 100644 index 00000000000..4276854224d --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/utils.c @@ -0,0 +1,219 @@ +/* + * (c) Copyright IBM Corporation 2002 + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ian Romanick + */ +/* $XFree86:$ */ + +#include +#include +#include "mtypes.h" +#include "extensions.h" +#include "utils.h" + +#if defined(USE_X86_ASM) +#include "x86/common_x86_asm.h" +#endif + +unsigned +driParseDebugString( const char * debug, + const struct dri_debug_control * control ) +{ + unsigned flag; + + + flag = 0; + if ( debug != NULL ) { + while( control->string != NULL ) { + if ( strstr( debug, control->string ) != NULL ) { + flag |= control->flag; + } + + control++; + } + } + + return flag; +} + + + + +unsigned +driGetRendererString( char * buffer, const char * hardware_name, + const char * driver_date, GLuint agp_mode ) +{ +#ifdef USE_X86_ASM + char * x86_str = ""; + char * mmx_str = ""; + char * tdnow_str = ""; + char * sse_str = ""; +#endif + unsigned offset; + + + offset = sprintf( buffer, "Mesa DRI %s %s", hardware_name, driver_date ); + + /* Append any AGP-specific information. + */ + switch ( agp_mode ) { + case 1: + case 2: + case 4: + case 8: + offset += sprintf( & buffer[ offset ], " AGP %ux", agp_mode ); + break; + + default: + break; + } + + /* Append any CPU-specific information. + */ +#ifdef USE_X86_ASM + if ( _mesa_x86_cpu_features ) { + x86_str = " x86"; + } +# ifdef USE_MMX_ASM + if ( cpu_has_mmx ) { + mmx_str = (cpu_has_mmxext) ? "/MMX+" : "/MMX"; + } +# endif +# ifdef USE_3DNOW_ASM + if ( cpu_has_3dnow ) { + tdnow_str = (cpu_has_3dnowext) ? "/3DNow!+" : "/3DNow!"; + } +# endif +# ifdef USE_SSE_ASM + if ( cpu_has_xmm ) { + sse_str = (cpu_has_xmm2) ? "/SSE2" : "/SSE"; + } +# endif + + offset += sprintf( & buffer[ offset ], "%s%s%s%s", + x86_str, mmx_str, tdnow_str, sse_str ); + +#elif defined(USE_SPARC_ASM) + + offset += sprintf( & buffer[ offset ], " Sparc" ); + +#endif + + return offset; +} + + + + +void driInitExtensions( GLcontext * ctx, + const char * const extensions_to_enable[], + GLboolean enable_imaging ) +{ + unsigned i; + + if ( enable_imaging ) { + _mesa_enable_imaging_extensions( ctx ); + } + + for ( i = 0 ; extensions_to_enable[i] != NULL ; i++ ) { + _mesa_enable_extension( ctx, extensions_to_enable[i] ); + } +} + + + + +GLboolean +driCheckDriDdxDrmVersions(__DRIscreenPrivate *sPriv, + const char * driver_name, + int dri_major, int dri_minor, + int ddx_major, int ddx_minor, + int drm_major, int drm_minor) +{ + static const char format[] = "%s DRI driver expected %s version %d.%d.x " + "but got version %d.%d.%d"; + int major, minor, patch; + +#ifndef _SOLO + /* Check the DRI version */ + if (XF86DRIQueryVersion(sPriv->display, &major, &minor, &patch)) { + if (major != dri_major || minor < dri_minor) { + __driUtilMessage(format, "DRI", driver_name, dri_major, dri_minor, + major, minor, patch); + return GL_FALSE; + } + } +#else + (void)major;(void)minor;(void)patch; +#endif + + /* Check that the DDX driver version is compatible */ + if (sPriv->ddxMajor != ddx_major || sPriv->ddxMinor < ddx_minor) { + __driUtilMessage(format, "DDX", driver_name, ddx_major, ddx_minor, + sPriv->ddxMajor, sPriv->ddxMinor, sPriv->ddxPatch); + return GL_FALSE; + } + + /* Check that the DRM driver version is compatible */ + if (sPriv->drmMajor != drm_major || sPriv->drmMinor < drm_minor) { + __driUtilMessage(format, "DRM", driver_name, drm_major, drm_minor, + sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch); + return GL_FALSE; + } + + return GL_TRUE; +} + +GLboolean driClipRectToFramebuffer( const GLframebuffer *buffer, + GLint *x, GLint *y, + GLsizei *width, GLsizei *height ) +{ + /* left clipping */ + if (*x < buffer->_Xmin) { + *width -= (buffer->_Xmin - *x); + *x = buffer->_Xmin; + } + + /* right clipping */ + if (*x + *width > buffer->_Xmax) + *width -= (*x + *width - buffer->_Xmax - 1); + + if (*width <= 0) + return GL_FALSE; + + /* bottom clipping */ + if (*y < buffer->_Ymin) { + *height -= (buffer->_Ymin - *y); + *y = buffer->_Ymin; + } + + /* top clipping */ + if (*y + *height > buffer->_Ymax) + *height -= (*y + *height - buffer->_Ymax - 1); + + if (*height <= 0) + return GL_FALSE; + + return GL_TRUE; +} diff --git a/reactos/lib/mesa32/src/drivers/dri/common/utils.h b/reactos/lib/mesa32/src/drivers/dri/common/utils.h new file mode 100644 index 00000000000..401a1b882f5 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/utils.h @@ -0,0 +1,58 @@ +/* + * (c) Copyright IBM Corporation 2002 + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ian Romanick + */ +/* $XFree86:$ */ + +#ifndef DRI_DEBUG_H +#define DRI_DEBUG_H + +#include "context.h" +#include "dri_util.h" + +struct dri_debug_control +{ + const char * string; + unsigned flag; +}; + +extern unsigned driParseDebugString( const char * debug, + const struct dri_debug_control * control ); + +extern unsigned driGetRendererString( char * buffer, + const char * hardware_name, const char * driver_date, GLuint agp_mode ); + +extern void driInitExtensions( GLcontext * ctx, + const char * const card_extensions[], GLboolean enable_imaging ); + +extern GLboolean driCheckDriDdxDrmVersions( __DRIscreenPrivate *sPriv, + const char * driver_name, int dri_major, int dri_minor, + int ddx_major, int ddx_minor, int drm_major, int drm_minor ); + +extern GLboolean driClipRectToFramebuffer( const GLframebuffer *buffer, + GLint *x, GLint *y, + GLsizei *width, GLsizei *height ); + +#endif /* DRI_DEBUG_H */ diff --git a/reactos/lib/mesa32/src/drivers/dri/common/vblank.c b/reactos/lib/mesa32/src/drivers/dri/common/vblank.c new file mode 100644 index 00000000000..d20f743bc9a --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/vblank.c @@ -0,0 +1,363 @@ +/* -*- mode: c; c-basic-offset: 3 -*- */ +/* + * (c) Copyright IBM Corporation 2002 + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ian Romanick + */ +/* $XFree86:$ */ + +#include "glheader.h" +#include "xf86drm.h" +#include "mtypes.h" +#include "macros.h" +#include "dd.h" +#include "vblank.h" +#include "xmlpool.h" + + +/****************************************************************************/ +/** + * Get the current MSC refresh counter. + * + * Stores the 64-bit count of vertical refreshes since some (arbitrary) + * point in time in \c count. Unless the value wraps around, which it + * may, it will never decrease. + * + * \warning This function is called from \c glXGetVideoSyncSGI, which expects + * a \c count of type \c unsigned (32-bit), and \c glXGetSyncValuesOML, which + * expects a \c count of type \c int64_t (signed 64-bit). The kernel ioctl + * currently always returns a \c sequence of type \c unsigned. + * + * \param priv Pointer to the DRI screen private struct. + * \param count Storage to hold MSC counter. + * \return Zero is returned on success. A negative errno value + * is returned on failure. + */ +int driGetMSC32( __DRIscreenPrivate * priv, int64_t * count ) +{ + drmVBlank vbl; + int ret; + + /* Don't wait for anything. Just get the current refresh count. */ + + vbl.request.type = DRM_VBLANK_RELATIVE; + vbl.request.sequence = 0; + + ret = drmWaitVBlank( priv->fd, &vbl ); + *count = (int64_t)vbl.reply.sequence; + + return ret; +} + + +/****************************************************************************/ +/** + * Wait for a specified refresh count. This implements most of the + * functionality of \c glXWaitForMscOML from the GLX_OML_sync_control spec. + * Waits for the \c target_msc refresh. If that has already passed, it + * waits until \f$(MSC \bmod divisor)\f$ is equal to \c remainder. If + * \c target_msc is 0, use the behavior of glXWaitVideoSyncSGI(), which + * omits the initial check against a target MSC value. + * + * This function is actually something of a hack. The problem is that, at + * the time of this writing, none of the existing DRM modules support an + * ioctl that returns a 64-bit count (at least not on 32-bit platforms). + * However, this function exists to support a GLX function that requires + * the use of 64-bit counts. As such, there is a little bit of ugly + * hackery at the end of this function to make the 32-bit count act like + * a 64-bit count. There are still some cases where this will break, but + * I believe it catches the most common cases. + * + * The real solution is to provide an ioctl that uses a 64-bit count. + * + * \param dpy Pointer to the \c Display. + * \param priv Pointer to the DRI drawable private. + * \param target_msc Desired refresh count to wait for. A value of 0 + * means to use the glXWaitVideoSyncSGI() behavior. + * \param divisor MSC divisor if \c target_msc is already reached. + * \param remainder Desired MSC remainder if \c target_msc is already + * reached. + * \param msc Buffer to hold MSC when done waiting. + * + * \return Zero on success or \c GLX_BAD_CONTEXT on failure. + */ + +int driWaitForMSC32( __DRIdrawablePrivate *priv, + int64_t target_msc, int64_t divisor, int64_t remainder, + int64_t * msc ) +{ + drmVBlank vbl; + + + if ( divisor != 0 ) { + unsigned int target = (unsigned int)target_msc; + unsigned int next = target; + unsigned int r; + int dont_wait = (target_msc == 0); + + do { + /* dont_wait means we're using the glXWaitVideoSyncSGI() behavior. + * The first time around, just get the current count and proceed + * to the test for (MSC % divisor) == remainder. + */ + vbl.request.type = dont_wait ? DRM_VBLANK_RELATIVE : + DRM_VBLANK_ABSOLUTE; + vbl.request.sequence = next; + + if ( drmWaitVBlank( priv->driScreenPriv->fd, &vbl ) != 0 ) { + /* FIXME: This doesn't seem like the right thing to return here. + */ +#ifndef _SOLO + return GLX_BAD_CONTEXT; +#else + return -1; +#endif + } + + dont_wait = 0; + if (target_msc != 0 && vbl.reply.sequence == target) + break; + + /* Assuming the wait-done test fails, the next refresh to wait for + * will be one that satisfies (MSC % divisor) == remainder. The + * value (MSC - (MSC % divisor) + remainder) is the refresh value + * closest to the current value that would satisfy the equation. + * If this refresh has already happened, we add divisor to obtain + * the next refresh after the current one that will satisfy it. + */ + r = (vbl.reply.sequence % (unsigned int)divisor); + next = (vbl.reply.sequence - r + (unsigned int)remainder); + if (next <= vbl.reply.sequence) next += (unsigned int)divisor; + + } while ( r != (unsigned int)remainder ); + } + else { + /* If the \c divisor is zero, just wait until the MSC is greater + * than or equal to \c target_msc. + */ + + vbl.request.type = DRM_VBLANK_ABSOLUTE; + vbl.request.sequence = target_msc; + + if ( drmWaitVBlank( priv->driScreenPriv->fd, &vbl ) != 0 ) { + /* FIXME: This doesn't seem like the right thing to return here. + */ +#ifndef _SOLO + return GLX_BAD_CONTEXT; +#else + return -1; +#endif + } + } + + *msc = (target_msc & 0xffffffff00000000LL); + *msc |= vbl.reply.sequence; + if ( *msc < target_msc ) { + *msc += 0x0000000100000000LL; + } + + return 0; +} + + +/****************************************************************************/ +/** + * Gets a set of default vertical-blank-wait flags based on the internal GLX + * API version and several configuration options. + */ + +GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache ) +{ + GLuint flags = 0; + int vblank_mode; + + flags |= (driCompareGLXAPIVersion( 20030317 ) >= 0) + ? VBLANK_FLAG_INTERVAL : 0; + + if ( driCheckOption( optionCache, "vblank_mode", DRI_ENUM ) ) + vblank_mode = driQueryOptioni( optionCache, "vblank_mode" ); + else + vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; + + switch (vblank_mode) { + case DRI_CONF_VBLANK_NEVER: + flags = 0; + break; + case DRI_CONF_VBLANK_DEF_INTERVAL_0: + break; + case DRI_CONF_VBLANK_DEF_INTERVAL_1: + flags |= VBLANK_FLAG_THROTTLE; + break; + case DRI_CONF_VBLANK_ALWAYS_SYNC: + flags |= VBLANK_FLAG_SYNC; + break; + } + + return flags; +} + + +/****************************************************************************/ +/** + * Sets the default swap interval when the drawable is first bound to a + * direct rendering context. + */ + +void driDrawableInitVBlank( __DRIdrawablePrivate *priv, GLuint flags ) +{ +#ifndef _SOLO + if ( priv->pdraw->swap_interval == (unsigned)-1 ) { + priv->pdraw->swap_interval = (flags & VBLANK_FLAG_THROTTLE) != 0 ? 1 : 0; + } +#endif +} + + +/****************************************************************************/ +/** + * Wrapper to call \c drmWaitVBlank. The main purpose of this function is to + * wrap the error message logging. The error message should only be logged + * the first time the \c drmWaitVBlank fails. If \c drmWaitVBlank is + * successful, \c vbl_seq will be set the sequence value in the reply. + * + * \param vbl Pointer to drmVBlank packet desribing how to wait. + * \param vbl_seq Location to store the current refresh counter. + * \param fd File descriptor use to call into the DRM. + * \return Zero on success or -1 on failure. + */ + +static int do_wait( drmVBlank * vbl, GLuint * vbl_seq, int fd ) +{ + int ret; + + + ret = drmWaitVBlank( fd, vbl ); + if ( ret != 0 ) { + static GLboolean first_time = GL_TRUE; + + if ( first_time ) { + fprintf(stderr, + "%s: drmWaitVBlank returned %d, IRQs don't seem to be" + " working correctly.\nTry running with LIBGL_THROTTLE_REFRESH" + " and LIBL_SYNC_REFRESH unset.\n", __FUNCTION__, ret); + first_time = GL_FALSE; + } + + return -1; + } + + *vbl_seq = vbl->reply.sequence; + return 0; +} + + +/****************************************************************************/ +/** + * Waits for the vertical blank for use with glXSwapBuffers. + * + * \param vbl_seq Vertical blank sequence number (MSC) after the last buffer + * swap. Updated after this wait. + * \param flags \c VBLANK_FLAG bits that control how long to wait. + * \param missed_deadline Set to \c GL_TRUE if the MSC after waiting is later + * than the "target" based on \c flags. The idea is that if + * \c missed_deadline is set, then the application is not + * achieving its desired framerate. + * \return Zero on success, -1 on error. + */ + +int +driWaitForVBlank( const __DRIdrawablePrivate *priv, GLuint * vbl_seq, + GLuint flags, GLboolean * missed_deadline ) +{ + drmVBlank vbl; + unsigned original_seq; + unsigned deadline; + unsigned interval; + + + *missed_deadline = GL_FALSE; + if ( (flags & (VBLANK_FLAG_INTERVAL | + VBLANK_FLAG_THROTTLE | + VBLANK_FLAG_SYNC)) == 0 || + (flags & VBLANK_FLAG_NO_IRQ) != 0 ) { + return 0; + } + + + /* VBLANK_FLAG_SYNC means to wait for at least one vertical blank. If + * that flag is not set, do a fake wait for zero vertical blanking + * periods so that we can get the current MSC. + * + * VBLANK_FLAG_INTERVAL and VBLANK_FLAG_THROTTLE mean to wait for at + * least one vertical blank since the last wait. Since do_wait modifies + * vbl_seq, we have to save the original value of vbl_seq for the + * VBLANK_FLAG_INTERVAL / VBLANK_FLAG_THROTTLE calculation later. + */ + + original_seq = *vbl_seq; + + vbl.request.sequence = ((flags & VBLANK_FLAG_SYNC) != 0) ? 1 : 0; + vbl.request.type = DRM_VBLANK_RELATIVE; + + if ( do_wait( & vbl, vbl_seq, priv->driScreenPriv->fd ) != 0 ) { + return -1; + } + + + vbl.request.type = DRM_VBLANK_ABSOLUTE; + + if ( (flags & VBLANK_FLAG_INTERVAL) != 0 ) { +#ifndef _SOLO + interval = priv->pdraw->swap_interval; +#else + interval = 0; +#endif + /* this must have been initialized when the drawable was first bound + * to a direct rendering context. */ + assert ( interval != (unsigned)-1 ); + } + else if ( (flags & VBLANK_FLAG_THROTTLE) != 0 ) { + interval = 1; + } + else { + interval = 0; + } + + + /* Wait until the next vertical blank. If the interval is zero, then + * the deadline is one vertical blank after the previous wait. + */ + + vbl.request.sequence = original_seq + interval; + if ( *vbl_seq < vbl.request.sequence ) { + if ( do_wait( & vbl, vbl_seq, priv->driScreenPriv->fd ) != 0 ) { + return -1; + } + } + + deadline = original_seq + ((interval == 0) ? 1 : interval); + *missed_deadline = ( *vbl_seq > deadline ); + + return 0; +} diff --git a/reactos/lib/mesa32/src/drivers/dri/common/vblank.h b/reactos/lib/mesa32/src/drivers/dri/common/vblank.h new file mode 100644 index 00000000000..d460d7a84ad --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/vblank.h @@ -0,0 +1,64 @@ +/* -*- mode: c; c-basic-offset: 3 -*- */ +/* + * (c) Copyright IBM Corporation 2002 + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ian Romanick + */ +/* $XFree86:$ */ + +#ifndef DRI_VBLANK_H +#define DRI_VBLANK_H + +#include "context.h" +#include "dri_util.h" +#include "xmlconfig.h" + +#define VBLANK_FLAG_INTERVAL (1U << 0) /* Respect the swap_interval setting + */ +#define VBLANK_FLAG_THROTTLE (1U << 1) /* Wait 1 refresh since last call. + */ +#define VBLANK_FLAG_SYNC (1U << 2) /* Sync to the next refresh. + */ +#define VBLANK_FLAG_NO_IRQ (1U << 7) /* DRM has no IRQ to wait on. + */ + +extern int driGetMSC32( __DRIscreenPrivate * priv, int64_t * count ); +extern int driWaitForMSC32( __DRIdrawablePrivate *priv, + int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * msc ); +extern GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache ); +extern void driDrawableInitVBlank ( __DRIdrawablePrivate *priv, GLuint flags ); +extern int driWaitForVBlank( const __DRIdrawablePrivate *priv, + GLuint * vbl_seq, GLuint flags, GLboolean * missed_deadline ); + +#undef usleep +#include /* for usleep() */ + +#define DO_USLEEP(nr) \ + do { \ + if (0) fprintf(stderr, "%s: usleep for %u\n", __FUNCTION__, nr ); \ + if (1) usleep( nr ); \ + sched_yield(); \ + } while( 0 ) + +#endif /* DRI_VBLANK_H */ diff --git a/reactos/lib/mesa32/src/drivers/dri/common/xmlconfig.c b/reactos/lib/mesa32/src/drivers/dri/common/xmlconfig.c new file mode 100644 index 00000000000..f45ab06ac41 --- /dev/null +++ b/reactos/lib/mesa32/src/drivers/dri/common/xmlconfig.c @@ -0,0 +1,993 @@ +/* + * XML DRI client-side driver configuration + * Copyright (C) 2003 Felix Kuehling + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +/** + * \file xmlconfig.c + * \brief Driver-independent client-side part of the XML configuration + * \author Felix Kuehling + */ + +#include "glheader.h" + +#include +#include +#include +#include +#include +#include +#include "imports.h" +#include "dri_util.h" +#include "xmlconfig.h" + +/* + * OS dependent ways of getting the name of the running program + */ +#if (defined(__unix__) || defined(unix)) && !defined(USG) +#include +#endif + +#undef GET_PROGRAM_NAME + +#if defined(__GNU_LIBRARY__) || defined(__GLIBC__) +# define GET_PROGRAM_NAME() program_invocation_short_name +#elif defined(__FreeBSD__) && (__FreeBSD__ >= 2) +# include +# if (__FreeBSD_version >= 440000) +# include +# define GET_PROGRAM_NAME() getprogname() +# endif +#elif defined(__NetBSD__) && defined(__NetBSD_Version) && (__NetBSD_Version >= 106000100) +# include +# define GET_PROGRAM_NAME() getprogname() +#endif + +#if !defined(GET_PROGRAM_NAME) +# if defined(OpenBSD) || defined(NetBSD) +/* This is a hack. It's said to work on OpenBSD, NetBSD and GNU. It's + * used as a last resort, if there is no documented facility available. */ +static const char *__getProgramName () { + extern const char *__progname; + return progname; +} +# define GET_PROGRAM_NAME() __getProgramName() +# else +# define GET_PROGRAM_NAME() "" +# warning "Per application configuration won't with your OS version work." +# endif +#endif + +/** \brief Find an option in an option cache with the name as key */ +static GLuint findOption (const driOptionCache *cache, const char *name) { + GLuint len = strlen (name); + GLuint size = 1 << cache->tableSize, mask = size - 1; + GLuint hash = 0; + GLuint i, shift; + + /* compute a hash from the variable length name */ + for (i = 0, shift = 0; i < len; ++i, shift = (shift+8) & 31) + hash += (GLuint)name[i] << shift; + hash *= hash; + hash = (hash >> (16-cache->tableSize/2)) & mask; + + /* this is just the starting point of the linear search for the option */ + for (i = 0; i < size; ++i, hash = (hash+1) & mask) { + /* if we hit an empty entry then the option is not defined (yet) */ + if (cache->info[hash].name == 0) + break; + else if (!strcmp (name, cache->info[hash].name)) + break; + } + /* this assertion fails if the hash table is full */ + assert (i < size); + + return hash; +} + +/** \brief Count the real number of options in an option cache */ +static GLuint countOptions (const driOptionCache *cache) { + GLuint size = 1 << cache->tableSize; + GLuint i, count = 0; + for (i = 0; i < size; ++i) + if (cache->info[i].name) + count++; + return count; +} + +/** \brief Like strdup but using MALLOC and with error checking. */ +#define XSTRDUP(dest,source) do { \ + GLuint len = strlen (source); \ + if (!(dest = MALLOC (len+1))) { \ + fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); \ + abort(); \ + } \ + memcpy (dest, source, len+1); \ +} while (0) + +static int compare (const void *a, const void *b) { + return strcmp (*(char *const*)a, *(char *const*)b); +} +/** \brief Binary search in a string array. */ +static GLuint bsearchStr (const XML_Char *name, + const XML_Char *elems[], GLuint count) { + const XML_Char **found; + found = bsearch (&name, elems, count, sizeof (XML_Char *), compare); + if (found) + return found - elems; + else + return count; +} + +/** \brief Locale-independent integer parser. + * + * Works similar to strtol. Leading space is NOT skipped. The input + * number may have an optional sign. Radix is specified by base. If + * base is 0 then decimal is assumed unless the input number is + * prefixed by 0x or 0X for hexadecimal or 0 for octal. After + * returning tail points to the first character that is not part of + * the integer number. If no number was found then tail points to the + * start of the input string. */ +static GLint strToI (const XML_Char *string, const XML_Char **tail, int base) { + GLint radix = base == 0 ? 10 : base; + GLint result = 0; + GLint sign = 1; + GLboolean numberFound = GL_FALSE; + const XML_Char *start = string; + + assert (radix >= 2 && radix <= 36); + + if (*string == '-') { + sign = -1; + string++; + } else if (*string == '+') + string++; + if (base == 0 && *string == '0') { + numberFound = GL_TRUE; + if (*(string+1) == 'x' || *(string+1) == 'X') { + radix = 16; + string += 2; + } else { + radix = 8; + string++; + } + } + do { + GLint digit = -1; + if (radix <= 10) { + if (*string >= '0' && *string < '0' + radix) + digit = *string - '0'; + } else { + if (*string >= '0' && *string <= '9') + digit = *string - '0'; + else if (*string >= 'a' && *string < 'a' + radix - 10) + digit = *string - 'a' + 10; + else if (*string >= 'A' && *string < 'A' + radix - 10) + digit = *string - 'A' + 10; + } + if (digit != -1) { + numberFound = GL_TRUE; + result = radix*result + digit; + string++; + } else + break; + } while (GL_TRUE); + *tail = numberFound ? string : start; + return sign * result; +} + +/** \brief Locale-independent floating-point parser. + * + * Works similar to strtod. Leading space is NOT skipped. The input + * number may have an optional sign. '.' is interpreted as decimal + * point and may occor at most once. Optionally the number may end in + * [eE], where is an integer as recognized by + * strToI. In that case the result is number * 10^exponent. After + * returning tail points to the first character that is not part of + * the floating point number. If no number was found then tail points + * to the start of the input string. + * + * Uses two passes for maximum accuracy. */ +static GLfloat strToF (const XML_Char *string, const XML_Char **tail) { + GLint nDigits = 0, pointPos, exponent; + GLfloat sign = 1.0f, result = 0.0f, scale; + const XML_Char *start = string, *numStart; + + /* sign */ + if (*string == '-') { + sign = -1.0f; + string++; + } else if (*string == '+') + string++; + + /* first pass: determine position of decimal point, number of + * digits, exponent and the end of the number. */ + numStart = string; + while (*string >= '0' && *string <= '9') { + string++; + nDigits++; + } + pointPos = nDigits; + if (*string == '.') { + string++; + while (*string >= '0' && *string <= '9') { + string++; + nDigits++; + } + } + if (nDigits == 0) { + /* no digits, no number */ + *tail = start; + return 0.0f; + } + *tail = string; + if (*string == 'e' || *string == 'E') { + const XML_Char *expTail; + exponent = strToI (string+1, &expTail, 10); + if (expTail == string+1) + exponent = 0; + else + *tail = expTail; + } else + exponent = 0; + string = numStart; + + /* scale of the first digit */ + scale = sign * powf (10.0f, (GLfloat)(pointPos-1 + exponent)); + + /* second pass: parse digits */ + do { + if (*string != '.') { + assert (*string >= '0' && *string <= '9'); + result += scale * (GLfloat)(*string - '0'); + scale *= 0.1f; + nDigits--; + } + string++; + } while (nDigits > 0); + + return result; +} + +/** \brief Parse a value of a given type. */ +static GLboolean parseValue (driOptionValue *v, driOptionType type, + const XML_Char *string) { + const XML_Char *tail; + /* skip leading white-space */ + string += strspn (string, " \f\n\r\t\v"); + switch (type) { + case DRI_BOOL: + if (!strcmp (string, "false")) { + v->_bool = GL_FALSE; + tail = string + 5; + } else if (!strcmp (string, "true")) { + v->_bool = GL_TRUE; + tail = string + 4; + } + else + return GL_FALSE; + break; + case DRI_ENUM: /* enum is just a special integer */ + case DRI_INT: + v->_int = strToI (string, &tail, 0); + break; + case DRI_FLOAT: + v->_float = strToF (string, &tail); + break; + } + + if (tail == string) + return GL_FALSE; /* empty string (or containing only white-space) */ + /* skip trailing white space */ + if (*tail) + tail += strspn (tail, " \f\n\r\t\v"); + if (*tail) + return GL_FALSE; /* something left over that is not part of value */ + + return GL_TRUE; +} + +/** \brief Parse a list of ranges of type info->type. */ +static GLboolean parseRanges (driOptionInfo *info, const XML_Char *string) { + XML_Char *cp, *range; + GLuint nRanges, i; + driOptionRange *ranges; + + XSTRDUP (cp, string); + /* pass 1: determine the number of ranges (number of commas + 1) */ + range = cp; + for (nRanges = 1; *range; ++range) + if (*range == ',') + ++nRanges; + + if ((ranges = MALLOC (nRanges*sizeof(driOptionRange))) == NULL) { + fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); + abort(); + } + + /* pass 2: parse all ranges into preallocated array */ + range = cp; + for (i = 0; i < nRanges; ++i) { + XML_Char *end, *sep; + assert (range); + end = strchr (range, ','); + if (end) + *end = '\0'; + sep = strchr (range, ':'); + if (sep) { /* non-empty interval */ + *sep = '\0'; + if (!parseValue (&ranges[i].start, info->type, range) || + !parseValue (&ranges[i].end, info->type, sep+1)) + break; + if (info->type == DRI_INT && + ranges[i].start._int > ranges[i].end._int) + break; + if (info->type == DRI_FLOAT && + ranges[i].start._float > ranges[i].end._float) + break; + } else { /* empty interval */ + if (!parseValue (&ranges[i].start, info->type, range)) + break; + ranges[i].end = ranges[i].start; + } + if (end) + range = end+1; + else + range = NULL; + } + FREE (cp); + if (i < nRanges) { + FREE (ranges); + return GL_FALSE; + } else + assert (range == NULL); + + info->nRanges = nRanges; + info->ranges = ranges; + return GL_TRUE; +} + +/** \brief Check if a value is in one of info->ranges. */ +static GLboolean checkValue (const driOptionValue *v, const driOptionInfo *info) { + GLuint i; + assert (info->type != DRI_BOOL); /* should be caught by the parser */ + if (info->nRanges == 0) + return GL_TRUE; + switch (info->type) { + case DRI_ENUM: /* enum is just a special integer */ + case DRI_INT: + for (i = 0; i < info->nRanges; ++i) + if (v->_int >= info->ranges[i].start._int && + v->_int <= info->ranges[i].end._int) + return GL_TRUE; + break; + case DRI_FLOAT: + for (i = 0; i < info->nRanges; ++i) + if (v->_float >= info->ranges[i].start._float && + v->_float <= info->ranges[i].end._float) + return GL_TRUE; + break; + default: + assert (0); /* should never happen */ + } + return GL_FALSE; +} + +/** \brief Output a warning message. */ +#define XML_WARNING1(msg) do {\ + __driUtilMessage ("Warning in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser)); \ +} while (0) +#define XML_WARNING(msg,args...) do { \ + __driUtilMessage ("Warning in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser), \ + args); \ +} while (0) +/** \brief Output an error message. */ +#define XML_ERROR1(msg) do { \ + __driUtilMessage ("Error in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser)); \ +} while (0) +#define XML_ERROR(msg,args...) do { \ + __driUtilMessage ("Error in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser), \ + args); \ +} while (0) +/** \brief Output a fatal error message and abort. */ +#define XML_FATAL1(msg) do { \ + fprintf (stderr, "Fatal error in %s line %d, column %d: "msg"\n", \ + data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser)); \ + abort();\ +} while (0) +#define XML_FATAL(msg,args...) do { \ + fprintf (stderr, "Fatal error in %s line %d, column %d: "msg"\n", \ + data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser), \ + args); \ + abort();\ +} while (0) + +/** \brief Parser context for __driConfigOptions. */ +struct OptInfoData { + const char *name; + XML_Parser parser; + driOptionCache *cache; + GLboolean inDriInfo; + GLboolean inSection; + GLboolean inDesc; + GLboolean inOption; + GLboolean inEnum; + int curOption; +}; + +/** \brief Elements in __driConfigOptions. */ +enum OptInfoElem { + OI_DESCRIPTION = 0, OI_DRIINFO, OI_ENUM, OI_OPTION, OI_SECTION, OI_COUNT +}; +static const XML_Char *OptInfoElems[] = { + "description", "driinfo", "enum", "option", "section" +}; + +/** \brief Parse attributes of an enum element. + * + * We're not actually interested in the data. Just make sure this is ok + * for external configuration tools. + */ +static void parseEnumAttr (struct OptInfoData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *value = NULL, *text = NULL; + driOptionValue v; + GLuint opt = data->curOption; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "value")) value = attr[i+1]; + else if (!strcmp (attr[i], "text")) text = attr[i+1]; + else XML_FATAL("illegal enum attribute: %s.", attr[i]); + } + if (!value) XML_FATAL1 ("value attribute missing in enum."); + if (!text) XML_FATAL1 ("text attribute missing in enum."); + if (!parseValue (&v, data->cache->info[opt].type, value)) + XML_FATAL ("illegal enum value: %s.", value); + if (!checkValue (&v, &data->cache->info[opt])) + XML_FATAL ("enum value out of valid range: %s.", value); +} + +/** \brief Parse attributes of a description element. + * + * We're not actually interested in the data. Just make sure this is ok + * for external configuration tools. + */ +static void parseDescAttr (struct OptInfoData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *lang = NULL, *text = NULL; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "lang")) lang = attr[i+1]; + else if (!strcmp (attr[i], "text")) text = attr[i+1]; + else XML_FATAL("illegal description attribute: %s.", attr[i]); + } + if (!lang) XML_FATAL1 ("lang attribute missing in description."); + if (!text) XML_FATAL1 ("text attribute missing in description."); +} + +/** \brief Parse attributes of an option element. */ +static void parseOptInfoAttr (struct OptInfoData *data, const XML_Char **attr) { + enum OptAttr {OA_DEFAULT = 0, OA_NAME, OA_TYPE, OA_VALID, OA_COUNT}; + static const XML_Char *optAttr[] = {"default", "name", "type", "valid"}; + const XML_Char *attrVal[OA_COUNT] = {NULL, NULL, NULL, NULL}; + const char *defaultVal; + driOptionCache *cache = data->cache; + GLuint opt, i; + for (i = 0; attr[i]; i += 2) { + GLuint attrName = bsearchStr (attr[i], optAttr, OA_COUNT); + if (attrName >= OA_COUNT) + XML_FATAL ("illegal option attribute: %s", attr[i]); + attrVal[attrName] = attr[i+1]; + } + if (!attrVal[OA_NAME]) XML_FATAL1 ("name attribute missing in option."); + if (!attrVal[OA_TYPE]) XML_FATAL1 ("type attribute missing in option."); + if (!attrVal[OA_DEFAULT]) XML_FATAL1 ("default attribute missing in option."); + + opt = findOption (cache, attrVal[OA_NAME]); + if (cache->info[opt].name) + XML_FATAL ("option %s redefined.", attrVal[OA_NAME]); + data->curOption = opt; + + XSTRDUP (cache->info[opt].name, attrVal[OA_NAME]); + + if (!strcmp (attrVal[OA_TYPE], "bool")) + cache->info[opt].type = DRI_BOOL; + else if (!strcmp (attrVal[OA_TYPE], "enum")) + cache->info[opt].type = DRI_ENUM; + else if (!strcmp (attrVal[OA_TYPE], "int")) + cache->info[opt].type = DRI_INT; + else if (!strcmp (attrVal[OA_TYPE], "float")) + cache->info[opt].type = DRI_FLOAT; + else + XML_FATAL ("illegal type in option: %s.", attrVal[OA_TYPE]); + + defaultVal = getenv (cache->info[opt].name); + if (defaultVal != NULL) { + /* don't use XML_WARNING, we want the user to see this! */ + fprintf (stderr, + "ATTENTION: default value of option %s overridden by environment.\n", + cache->info[opt].name); + } else + defaultVal = attrVal[OA_DEFAULT]; + if (!parseValue (&cache->values[opt], cache->info[opt].type, defaultVal)) + XML_FATAL ("illegal default value: %s.", defaultVal); + + if (attrVal[OA_VALID]) { + if (cache->info[opt].type == DRI_BOOL) + XML_FATAL1 ("boolean option with valid attribute."); + if (!parseRanges (&cache->info[opt], attrVal[OA_VALID])) + XML_FATAL ("illegal valid attribute: %s.", attrVal[OA_VALID]); + if (!checkValue (&cache->values[opt], &cache->info[opt])) + XML_FATAL ("default value out of valid range '%s': %s.", + attrVal[OA_VALID], defaultVal); + } else if (cache->info[opt].type == DRI_ENUM) { + XML_FATAL1 ("valid attribute missing in option (mandatory for enums)."); + } else { + cache->info[opt].nRanges = 0; + cache->info[opt].ranges = NULL; + } +} + +/** \brief Handler for start element events. */ +static void optInfoStartElem (void *userData, const XML_Char *name, + const XML_Char **attr) { + struct OptInfoData *data = (struct OptInfoData *)userData; + enum OptInfoElem elem = bsearchStr (name, OptInfoElems, OI_COUNT); + switch (elem) { + case OI_DRIINFO: + if (data->inDriInfo) + XML_FATAL1 ("nested elements."); + if (attr[0]) + XML_FATAL1 ("attributes specified on element."); + data->inDriInfo = GL_TRUE; + break; + case OI_SECTION: + if (!data->inDriInfo) + XML_FATAL1 ("